Je maintiens une bibliothèque cliente appelée mysqlclient qui utilise libmysqlclient pour Python.
Cette bibliothèque fournit une roue binaire avec un lien statique de libmysqlclient pour une utilisation facile par les utilisateurs Windows. J'ai essayé d'automatiser la construction de cette roue binaire à l'aide d'actions Github.
Je suis nouveau sur Github Actions, donc il y a peut-être un meilleur moyen, mais j'espère que cela aidera quelqu'un.
J'écrirai d'abord à partir de l'impression. J'ai déjà utilisé AppVeyor pour créer automatiquement des roues pour Windows dans d'autres projets, et c'est beaucoup plus confortable que cela.
(Certains d'entre eux peuvent en fait être identiques avec AppVeyor. C'est juste une impression personnelle.)
Au lieu d'utiliser le référentiel de la bibliothèque elle-même, j'ai créé un autre référentiel mysqlclient-build pour la construction et j'ai essayé et j'ai fait des erreurs. Cela vous permet d'expérimenter sans polluer le référentiel de la bibliothèque.
.github/workflows/windows.yaml
name: Build windows wheels
on:
push:
branches:
- master
create:
Comme je l'expliquerai plus tard, cela affectait le répertoire à extraire et c'était un peu gênant, donc je pense qu'il était normal de faire un essai et une erreur avec une pull request du référentiel de la bibliothèque elle-même.
mysqlclient utilise libmysqlclient, mais Wheel pour Windows utilise un MariaDB Connector / C compatible au lieu du MySQL Connector / C.
En effet, il peut être construit pour utiliser l'API Windows sans OpenSSL pour les connexions SSL à MySQL, les calculs sha256 pour caching_sha2_password, etc., et convient à la distribution binaire liée statiquement.
Cependant, MariaDB Connector / C, qui est distribué en binaire, a des plugins tels que l'authentification en tant que DLL. Je veux en faire un seul binaire si possible, donc je vais créer MariaDB Connector / C moi-même.
Utilisez l'action de cache car la création de cette bibliothèque dépendante prend du temps à chaque fois que vous créez mysqlclient. L'action de mise en cache met en cache le répertoire spécifié lorsque le travail réussit, alors poussez-le une fois jusqu'à ce que le MariaDB Connector / C soit créé pour réussir et le mettre en cache. Maintenant, j'ai pu profiter du pré-construit MariaDB Connector / C lors de l'essai et des erreurs pour construire mysqlclient.
.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
Tout d'abord, vérifiez mysqlclient avec l'action d'extraction. Par défaut, le référentiel avec workflow (mysqlclient-build dans ce cas) est extrait dans le répertoire de travail, mais vous pouvez utiliser with:
pour extraire un autre référentiel vers un chemin différent.
Il y avait un piège ici, mais si vous vérifiez avec path: mysqlclient
, la destination de la vérification sera ../ mysqlclient
au lieu de. / Mysqlclient
. Cela est dû au fait que le répertoire de travail par défaut est le répertoire pour l'extraction de ce référentiel, et lors de l'extraction d'un autre référentiel, le répertoire est créé à côté de lui plutôt qu'en dessous. Ainsi, dans les étapes après la vérification, working-directory: ../ mysqlclient
est spécifié.
Après la construction, utilisez l'action upload-artifact pour télécharger la roue sur Github, puis assurez-vous que vous pouvez réellement installer et importer la roue.
Je voulais le tester pour qu'il fonctionne si possible, mais je ne l'ai pas fait cette fois car Windows-latest n'a pas installé MySQL Server. Il semble que Docker puisse être utilisé, je vais donc essayer de configurer MySQL Server à l'aide de Docker à l'avenir.
.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