GitHub ワークフローを使って、プロジェクトを定期実行し、成果物をデプロイする(Python)
GitHub ワークフローを使ってプロジェクトの定期実行→成果物をデプロイする方法を調べたのでまとめる。
これは 2020/05 時点の情報をもとにした記事なので、最新では事情が変わっている可能性を留意すること。
目的
GitHub ワークフロー / アクションの意味
ワークフロー
ワークフローとは、GitHubで任意のプロジェクトをビルド、テスト、パッケージ、リリース、またはデプロイするためにリポジトリで設定できる、カスタムの自動プロセスです。 ワークフローを使用すると、豊富なツールとサービスでソフトウェア開発のライフサイクルを自動化できます。
「ワークフロー」に記述した内容で、ビルドやテスト、リリース、デプロイが自動化できるようになる。
ワークフロー自体は .github/workflow の下に yml ファイルで記述する。
アクション
https://help.github.com/ja/actions/getting-started-with-github-actions/about-github-actions
GitHub Actionsは、コードを保存するのと同じ場所でソフトウェア開発のワークフローを自動化し、プルリクエストやIssueで協力することを支援します。 個々のタスクを書き、アクションを呼び出し、それらを組み合わせてカスタムのワークフローを作成できます。
「アクション」は「ワークフロー」を構成する単位となる。
どんなアクションがあるかは Markerplace で確認できる。
GitHub Marketplace · Actions to improve your workflow · GitHub
たとえば git リポジトリからチェックアウトするアクション「Checkout v2」がある。
Checkout · Actions · GitHub Marketplace · GitHub
この Checkout をワークフロー内で使用するには、以下のように記述する。
name: workflow-name # リポジトリに Push したタイミングでワークフローを実行する on: [push] jobs: build: name: workflow-job runs-on: ubuntu-latest steps: # リポジトリをチェックアウトする - name: Checkout uses: actions/checkout@v2 # チェックアウトされたリポジトリで、ビルド、テスト、リリース、デプロイ、などをする。
その他
- GitHubの新機能「GitHub Actions」で試すCI/CD | さくらのナレッジ
- ワークフロー、アクションの概念がわかりやすく書いている
GitHub リポジトリのプロジェクトを定期実行する(Python)
今回のサンプル
GitHub - daisuke-t-jp/jma-hazard-xml2json
今回作成したリポジトリはこれになる。(Python プロジェクト)
この Python スクリプトは気象庁で提供されている災害情報(XML)を取得して JSON フォーマットに変換して、ファイルに保存する、ということやっている。
気象庁 | 気象庁防災情報XMLフォーマット形式電文(PULL型)
requirements.txt
Python スクリプトに必要な外部パッケージを requirements.txt ファイルを作成し、そこに記載する。
今回は XML を Python の辞書として扱うために xmltodict を requirements.txt に追加する。
xmltodict
ワークフローを作成する
ローカルでスクリプトの動作が確認出来たら GitHub ワークフローを作成して GitHub 上でも動作するようにする。
今回のワークフローは以下の機能にする
- 定期実行したい(10分に1回)
- 成果物である JSON ファイルを保存したい
yaml で記載したワークフローは以下になる。
# ワークフローの名前 name: cron-deploy # ワークフローの実行タイミング # この場合は 10 分に 1 回 # # cron のフォーマットは以下が参考になる # http://manpages.ubuntu.com/manpages/trusty/ja/man5/crontab.5.html on: schedule: - cron: '*/10 * * * *' # ジョブの記述 jobs: # job_id は "build" build: # ジョブの名前(GitHub 上で表示される) name: deploy # Ubuntu で実行する # https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idruns-on runs-on: ubuntu-latest # ジョブのステップ steps: - name: Checkout # チェックアウト uses: actions/checkout@v2 - name: Setup Python 3.8 # Python のセットアップ uses: actions/setup-python@v1 with: python-version: 3.8 - name: Install dependencies # Python 外部パッケージをインストール run: | python -m pip install --upgrade pip pip install -r requirements.txt - name: Run script # Python スクリプトを実行する run: | python jma-hazard-xml2json.py - name: Deploy # gh-pages ブランチに成果物をデプロイする uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./json
このワークフローを GitHub にコミットすると、ただしく10分ごとに gh-pages ブランチにデプロイされることが確認出来た。(前のファイルは上書きされる)