[PYTHON] J'ai construit une roue pour Windows à l'aide d'actions Github

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.

Impressions

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.

image.png

(Certains d'entre eux peuvent en fait être identiques avec AppVeyor. C'est juste une impression personnelle.)

Préparer un référentiel pour la construction

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.

Créer des bibliothèques dépendantes

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

Construire mysqlclient

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

J'ai construit une roue pour Windows à l'aide d'actions Github
J'ai construit un environnement TensorFlow avec windows10
Préparer un pseudo serveur API à l'aide d'actions GitHub
J'ai créé un site de liste de Kindle Prime Reading en utilisant Scrapy et GitHub Actions
J'ai essayé d'utiliser Tensorboard, un outil de visualisation pour l'apprentissage automatique
J'ai fait un Line-bot avec Python!
J'ai créé un site de visualisation du PIB (production nationale totale) en utilisant DASH!
J'ai essayé d'utiliser eval (a, b) pour Fibonacci, mais ce n'était pas rapide
Remarques sur l'utilisation d'OpenCV avec Windows10 Python 3.8.3.
J'ai créé un docset de tableau de bord pour Holoviews
[50 comptes] Transmission de clé à l'aide de Python pour Windows
J'ai essayé de dessiner une ligne en utilisant une tortue
Débutant: j'ai créé un lanceur à l'aide d'un dictionnaire
J'ai essayé d'utiliser pipenv, alors prenez note
J'ai fait une bibliothèque pour l'assurance actuarielle
Un manuel de procédure pour publier rapidement une bibliothèque C ++ Python à l'aide de pybind11 sur Github
J'ai créé un fichier de dictionnaire python pour Neocomplete
J'ai recherché dans la bibliothèque l'utilisation de l'API Gracenote
J'ai fait un algorithme de rechange2 moins cher pour uWSGI
J'ai essayé de créer un Dockerfile pour l'environnement de développement de Django
J'ai créé un téléchargeur pour l'expression distribuée par mot
J'ai essayé d'utiliser Pythonect, un langage de programmation de flux de données.
J'ai essayé de lire un fichier CSV en utilisant Python
Remarques sur l'utilisation de TensorFlow sur Bash sur Ubuntu sous Windows
Ce que j'ai fait avant d'installer Docker pour Windows
J'ai essayé d'utiliser Firebase pour le serveur de cache de Django
Conseils pour utiliser Elastic Search de manière efficace
J'ai écrit un analyseur japonais en japonais en utilisant pyparsing.
Faisons un module pour Python en utilisant SWIG
Nous avons créé un produit de prévention du télétravail.
J'ai essayé d'utiliser la base de données (sqlite3) avec kivy
Convertir les packages binaires pour Windows au format roue
J'ai créé un jeu ○ ✕ avec TensorFlow
J'ai installé le framework Deep Learning Chainer
Un véritable moyen pour les personnes utilisant python 3.8.0-2 à partir de Windows de travailler avec des caractères multi-octets
Je veux configurer un serveur fictif pour python-flask en quelques secondes en utilisant swagger-codegen.