GitHub ワークフローを使って、プロジェクトを定期実行し、成果物をデプロイする(Python)

GitHub ワークフローを使ってプロジェクトの定期実行→成果物をデプロイする方法を調べたのでまとめる。

これは 2020/05 時点の情報をもとにした記事なので、最新では事情が変わっている可能性を留意すること。

目的

  • GitHub ワークフロー / アクションの意味を理解
  • GitHub リポジトリのプロジェクトを定期実行する(Python
    • 定期実行時の成果物をデプロイする

GitHub ワークフロー / アクションの意味

ワークフロー

https://help.github.com/ja/actions/configuring-and-managing-workflows/configuring-a-workflow#about-workflows

ワークフローとは、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 リポジトリのプロジェクトを定期実行する(Python

今回のサンプル

GitHub - daisuke-t-jp/jma-hazard-xml2json

今回作成したリポジトリはこれになる。(Python プロジェクト)

この Python スクリプト気象庁で提供されている災害情報(XML)を取得して JSON フォーマットに変換して、ファイルに保存する、ということやっている。

気象庁 | 気象庁防災情報XMLフォーマット形式電文(PULL型)

requirements.txt

Python スクリプトに必要な外部パッケージを requirements.txt ファイルを作成し、そこに記載する。

今回は XMLPython の辞書として扱うために 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 ブランチにデプロイされることが確認出来た。(前のファイルは上書きされる)

f:id:daisuke-t-jp:20200918091413p:plain:w500