Quantumleap
1049 words
5 minutes
GitHub Actionsが便利すぎた
2021-05-06
No Tags

GitHub Actions#

そもそも GitHub Actions とは何だということになるのだが、詳しくは GitHub の公式ページを見るのが良い。そこには次のように記されている。

::: tip GitHub Actions とは

GitHub Actions を使用すると、ワールドクラスの CI/CD ですべてのソフトウェアワークフローを簡単に自動化できます。GitHub から直接コードをビルド、テスト、デプロイでき、コードレビュー、ブランチ管理、問題のトリアージを希望どおりに機能させます。

:::

要するにソースコードを Push したら GitHub のサーバがそれを勝手にビルドしてくれるということ。このあたりは Docker に似たものを感じなくもないですね。

ただし、リソースを使うので使い放題というわけではなく、一ヶ月に利用可能なビルド時間というものがあります。

消費クレジット
Linux1
Windows2
macOS10

考え方としてはクレジット方式で、無料ユーザであれば 2000、有料ユーザであれば 3000 のクレジットが毎月与えられます。Linux のビルドだと 1 分で 1 クレジット消費するので 2000 分ビルドできるのですが、macOS でビルドすると 200 分しか使えないというわけです。

GitHub Actions を使ってみよう#

では実際に GitHub Actions を使ってみましょう。

使うといっても実行したいコマンドを YAML ファイルに書いていくだけです。書き方がわからなかったのですが、つよつよエンジニアのささぴよげえむずさんが Github に対して PR を送ってくれたのでそれを参考にしてみることにします。

Salmonia は Python のプログラムで、Windows でそのまま実行しようとすると Pyinstaller でビルドする必要があります。今回は GitHub Actions で Pyinstaller で EXE 化した上で Release に出力するところを考えてみましょう。

name: build executables

on:
  push:
    tag:
      - "v*"

jobs:
  windows-build: # Windows向けビルド
    runs-on: windows-latest
    steps: # コマンドを上から順番に書いていく
      - name: Checkout commit
        uses: actions/checkout@master

      - name: Set up Python 3.9
        uses: actions/setup-python@master
        with: { python-version: 3.9 }

      - name: Upgrade pip
        run: python -m pip install --upgrade pip PyInstaller

      - name: Install requirements
        run: pip install -r requirements.txt

      - name: build
        run: pyinstaller Salmonia.py --onefile

      - name: upload
        uses: actions/upload-artifact@v1
        with:
          name: Salmonia-windows
          path: dist/Salmonia.exe

  release: # 実行するジョブを書く
    needs: [windows-build]
    runs-on: ubuntu-latest

    steps: # ビルド後の処理などを書く
      - name: Download Windows
        uses: actions/download-artifact@v1
        with:
          name: Salmonia-windows

      - name: Create Release
        id: create_release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ github.ref }}
          release_name: Release ${{ github.ref }}
          draft: false
          prerelease: false

      - name: Zip
        run: zip --junk-paths Salmonia-windows ./Salmonia-windows/Salmonia.exe

      - name: Append Binary
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }}
          asset_path: ./Salmonia-windows.zip
          asset_name: Salmonia-windows.zip
          asset_content_type: application/zip

Pyinstaller で EXE を作成するためには Windows で実行しないと意味がないのでビルド時にはruns-onwindows-latestを指定していますが、アップロードや ZIP 化するのは別に Linux で構わないのでこちらにはubuntu-latestを指定します。

これがベースの書き方で、これさえ書いておけば全ての Python プログラムは Pyinstaller でビルドして自動リリースができます。ただ、このままだとタグの値に関わらず常に同じファイル名になってしまうので少し気がかりです。

そこで、タグ情報をファイル名に埋め込めるようにします。

steps: # ビルド後の処理などを書く
+ - name: Set version
+   id: version
+   run: |
+     REPOSITORY=$(echo ${{ github.repository }} | sed -e "s#.*/##")
+     VERSION=$(echo ${{ github.ref }} | sed -e "s#refs/tags/##g")
+     echo ::set-output name=version::$VERSION
+     echo ::set-output name=filename::$REPOSITORY-$VERSION
  - name: Download Windows
    uses: actions/download-artifact@v1
    with:
      name: Salmonia-windows
# 中略
  - name: Append Binary
    uses: actions/upload-release-asset@v1
    env:
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    with:
      upload_url: ${{ steps.create_release.outputs.upload_url }}
      asset_path: ./Salmonia-windows.zip
-     asset_name: Salmonia-windows.zip
+     asset_name: Salmonia-${{ steps.version.outputs.version }}-windows.zip
      asset_content_type: application/zip

github.refには余計な情報が入っているので一回コマンドでそれらを削除した後に環境変数に入れることで対応します。この使い方、割とスタンダードらしいので覚えておくと便利かもしれません。

実際にやってみた#

ビルドして完成したものがこちら

Windows でのビルドは二分くらいで終わったので常識的な範囲内なら大丈夫そうです。

記事は以上。

GitHub Actionsが便利すぎた
https://fuwari.vercel.app/posts/2021/05/githubactions/
Author
tkgling
Published at
2021-05-06