[PYTHON] Ich habe mit Github-Aktionen ein Rad für Windows erstellt

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.

Impressionen

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.

image.png

(Einige davon sind möglicherweise mit AppVeyor identisch. Es ist nur ein persönlicher Eindruck.)

Bereiten Sie ein Repository für den Build vor

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.

Erstellen Sie abhängige Bibliotheken

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

Erstellen Sie mysqlclient

Ü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

Ich habe mit Github-Aktionen ein Rad für Windows erstellt
Ich habe eine TensorFlow-Umgebung mit Windows 10 erstellt
Bereiten Sie einen Pseudo-API-Server mit GitHub-Aktionen vor
Ich habe mit Scrapy- und GitHub-Aktionen eine Listenseite für Kindle Prime Reading erstellt
Ich habe versucht, Tensorboard zu verwenden, ein Visualisierungstool für maschinelles Lernen
Ich habe einen Line-Bot mit Python gemacht!
Ich habe mit DASH eine Visualisierungssite für das BIP (gesamte Inlandsproduktion) erstellt!
Ich habe versucht, eval (a, b) für Fibonacci zu verwenden, aber es war nicht schnell
Hinweise zur Verwendung von OpenCV mit Windows 10 Python 3.8.3.
Ich habe ein Dash-Docset für Holoviews erstellt
[50 zählt] Schlüsselübertragung mit Python für Windows
Ich habe versucht, mit einer Schildkröte eine Linie zu ziehen
Anfänger: Ich habe einen Launcher mit dem Wörterbuch erstellt
Ich habe versucht, pipenv zu verwenden, machen Sie sich also eine Notiz
Ich habe eine Bibliothek für versicherungsmathematische Versicherungen erstellt
Anweisungen zum schnellen Veröffentlichen einer C ++ - Python-Bibliothek mit pybind11 auf Github
Ich habe eine Python-Wörterbuchdatei für Neocomplete erstellt
Ich habe in der Bibliothek nach der Verwendung der Gracenote-API gesucht
Ich habe einen Ersatz2-Algorithmus für uWSGI billiger gemacht
Ich habe versucht, eine Docker-Datei für die Entwicklungsumgebung von Django zu erstellen
Ich habe einen Downloader für wortverteilte Ausdrücke erstellt
Ich habe versucht, Pythonect, eine Programmiersprache für den Datenfluss, zu verwenden.
Ich habe versucht, eine CSV-Datei mit Python zu lesen
Hinweise zur Verwendung von TensorFlow unter Bash unter Ubuntu unter Windows
Was ich vor der Installation von Docker für Windows getan habe
Ich habe versucht, Firebase für Djangos Cache-Server zu verwenden
Tipps für eine gute Verwendung von Elastic Search
Ich habe einen japanischen Parser auf Japanisch mit Pyparsing geschrieben.
Lassen Sie uns mit SWIG ein Modul für Python erstellen
Wir haben ein Peeping-Prevention-Produkt für die Telearbeit entwickelt.
Ich habe versucht, die Datenbank (sqlite3) mit kivy zu verwenden
Konvertieren Sie Binärpakete für Windows in das Radformat
Ich habe ein ○ ✕ Spiel mit TensorFlow gemacht
Ich habe den Deep Learning Framework Chainer installiert
Eine echte Möglichkeit für Benutzer von Python 3.8.0-2 aus Windows, mit Multi-Byte-Zeichen zu arbeiten
Ich möchte mit swagger-codegen in Sekundenschnelle einen Mock-Server für Python-Flask einrichten.