Ich verwalte eine Clientbibliothek namens mysqlclient, die libmysqlclient für Python verwendet.
Diese Bibliothek bietet ein Binärrad mit einem statischen Link von libmysqlclient zur einfachen Verwendung durch Windows-Benutzer. Ich habe versucht, den Aufbau dieses Binärrads mithilfe von Github-Aktionen zu automatisieren.
Ich bin neu bei Github Actions, also gibt es vielleicht einen besseren Weg, aber ich hoffe, es hilft jemandem.
Ich werde zuerst aus dem Eindruck schreiben. Ich habe AppVeyor bereits in anderen Projekten verwendet, um Wheels for Windows automatisch zu erstellen, und es ist weitaus komfortabler.
(Einige davon sind möglicherweise mit AppVeyor identisch. Es ist nur ein persönlicher Eindruck.)
Anstatt das Repository der Bibliothek selbst zu verwenden, habe ich ein anderes Repository mysqlclient-build zum Erstellen erstellt und dort versucht und Fehler gemacht. Auf diese Weise können Sie experimentieren, ohne das Bibliotheksrepository zu verschmutzen.
.github/workflows/windows.yaml
name: Build windows wheels
on:
push:
branches:
- master
create:
Wie ich später erläutern werde, wirkte sich dies auf das auszucheckende Verzeichnis aus und war ein wenig problematisch. Daher halte ich es für in Ordnung, einen Versuch und Irrtum mit einer Pull-Anforderung des Repositorys der Bibliothek selbst durchzuführen.
mysqlclient verwendet libmysqlclient, Wheel für Windows verwendet jedoch einen kompatiblen MariaDB Connector / C anstelle von MySQL Connector / C.
Dies liegt daran, dass es für die Verwendung der Windows-API anstelle von OpenSSL für SSL-Verbindungen zu MySQL, sha256-Berechnungen für caching_sha2_password usw. erstellt werden kann und für die statisch verknüpfte Binärverteilung geeignet ist.
MariaDB Connector / C, das binär verteilt ist, verfügt jedoch über Plugins wie die Authentifizierung als DLLs. Ich möchte, wenn möglich, eine einzelne Binärdatei erstellen, daher werde ich MariaDB Connector / C selbst erstellen.
Verwenden Sie die Cache-Aktion, da das Erstellen dieser abhängigen Bibliothek bei jedem Erstellen von mysqlclient einige Zeit in Anspruch nimmt. Die Cache-Aktion speichert das angegebene Verzeichnis zwischen, wenn der Job erfolgreich ist. Drücken Sie ihn daher einmal, bis der MariaDB Connector / C erstellt wurde, um ihn erfolgreich zu machen, und zwischenspeichern Sie ihn. Jetzt konnte ich den vorgefertigten MariaDB Connector / C nutzen, wenn ich den Versuch und Irrtum durchführte, um mysqlclient zu erstellen.
.github/workflows/windows.yaml
jobs:
build:
runs-on: windows-latest
env:
CONNECTOR_VERSION: "3.1.5"
steps:
- name: Cache Connector
id: cache-connector
uses: actions/cache@v1
with:
path: c:/mariadb-connector
key: mariadb-connector-3.1.5-win
- name: Download and Unzip Connector
if: steps.cache-connector.outputs.cache-hit != 'true'
shell: bash
run: |
curl -LO "https://downloads.mariadb.com/Connectors/c/connector-c-${CONNECTOR_VERSION}/mariadb-connector-c-${CONNECTOR_VERSION}-src.zip"
unzip "mariadb-connector-c-${CONNECTOR_VERSION}-src.zip" -d c:/
mv "c:/mariadb-connector-c-${CONNECTOR_VERSION}-src" c:/mariadb-connector-src
- name: Build Connector
if: steps.cache-connector.outputs.cache-hit != 'true'
shell: cmd
working-directory: c:/mariadb-connector-src
run: |
mkdir build
cd build
cmake -A x64 .. -DCMAKE_BUILD_TYPE=Release -DCLIENT_PLUGIN_DIALOG=static -DCLIENT_PLUGIN_SHA256_PASSWORD=static -DCLIENT_PLUGIN_CACHING_SHA2_PASSWORD=static
cmake --build . -j 8 --config Release
cmake -DCMAKE_INSTALL_PREFIX=c:/mariadb-connector -DCMAKE_INSTALL_COMPONENT=Development -DCMAKE_BUILD_TYPE=Release -P cmake_install.cmake
Überprüfen Sie zuerst mysqlclient mit der Checkout-Aktion. Standardmäßig wird das Repository mit Workflow (in diesem Fall mysqlclient-build) in das Arbeitsverzeichnis ausgecheckt. Sie können jedoch with:
verwenden, um ein anderes Repository in einen anderen Pfad auszuchecken.
Es gab hier eine Gefahr, aber wenn Sie mit "path: mysqlclient" auschecken, lautet das Checkout-Ziel "../ mysqlclient" anstelle von ". / Mysqlclient". Dies liegt daran, dass das Standardarbeitsverzeichnis das Verzeichnis zum Auschecken dieses Repositorys ist. Beim Auschecken eines anderen Repositorys wird das Verzeichnis daneben anstatt darunter erstellt. In den Schritten nach dem Auschecken wird also "Arbeitsverzeichnis: ../mysqlclient" angegeben.
Verwenden Sie nach dem Erstellen das Aktions-Upload-Artefakt, um das Rad auf Github hochzuladen, und stellen Sie dann sicher, dass Sie das Rad tatsächlich installieren und importieren können.
Ich wollte es testen, um es nach Möglichkeit zu testen, aber diesmal habe ich es nicht getan, da auf Windows-latest MySQL Server nicht installiert ist. Es scheint, dass Docker verwendet werden kann, daher werde ich versuchen, MySQL Server in Zukunft mit Docker einzurichten.
.github/workflow/windows.yml
- name: Checkout mysqlclient
uses: actions/checkout@v1
with:
repository: PyMySQL/mysqlclient-python
ref: master
fetch-depth: 10
path: mysqlclient
- name: Site Config
shell: bash
working-directory: ../mysqlclient
run: |
pwd
find .
cat <<EOF >site.cfg
[options]
static = True
connector = C:/mariadb-connector
EOF
cat site.cfg
- name: Build wheels
shell: cmd
working-directory: ../mysqlclient
run: |
py -3.8 -m pip install -U setuptools wheel pip
py -3.8 setup.py bdist_wheel
py -3.7 -m pip install -U setuptools wheel pip
py -3.7 setup.py bdist_wheel
py -3.6 -m pip install -U setuptools wheel pip
py -3.6 setup.py bdist_wheel
- name: Upload Wheel
uses: actions/upload-artifact@v1
with:
name: win-wheels
path: ../mysqlclient/dist
- name: Check wheels
shell: bash
working-directory: ../mysqlclient/dist
run: |
ls -la
py -3.8 -m pip install mysqlclient-1.4.6-cp38-cp38-win_amd64.whl
py -3.8 -c "import MySQLdb"
py -3.7 -m pip install mysqlclient-1.4.6-cp37-cp37m-win_amd64.whl
py -3.7 -c "import MySQLdb"
py -3.6 -m pip install mysqlclient-1.4.6-cp36-cp36m-win_amd64.whl
py -3.6 -c "import MySQLdb"
Recommended Posts