業務で実際に使っているActionsを利用例込で挙げてみた

業務にてGitHub ActionsでWorkflowに使っているActionをまとめてみました。効率良く手間を減らせていると感じつつ、ミラクルな魔法はないんだなーと実感。
2021.08.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Composite Run Stepsに合わせて全体で利用しているActionの見直しと整理を行っていました。元々最低限使うもののみという状態で、見直しても1部除いて特に増えることもなく。

業務で実際に使っているものを利用例合わせて挙げてみるのも需要は多少あるかなと思い、まとめてみました。

必需

Actionsを使う以上は利用が避けられないと思われるシリーズ。

actions/checkout

ソースコードのチェックアウトをしてくれます。ssh設定を引数として受け付けてくれるため、rungit checkout をするよりも手間が省けます。

- uses: actions/checkout@v2
  with:
    repository: my-org/my-tools
    path: my-tools

actions/setup-python

Pythonのセットアップをしてくれます。バージョンやアーキテクチャの指定を受け付けることや、バージョンを範囲で指定するとその中で最新有効なバージョンを自動設定してくれるなど、自前でインストールするよりも便利です。

- uses: actions/setup-python@v2
  with:
    python-version: '3.9.0-alpha - 3.9.0' # SemVer's version range syntax

普通はバージョン決め打ちになるでしょうが、使い方によっては公式リポジトリに乗っているように以下のようなことも可能です。

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version:
        - 'pypy-3.6' # the latest available version of PyPy that supports Python 3.6
        - 'pypy-3.7' # the latest available version of PyPy that supports Python 3.7
        - 'pypy-3.7-v7.3.3' # Python 3.7 and PyPy 7.3.3
    steps:
    - uses: actions/checkout@v2
    - uses: actions/setup-python@v2
      with:
        python-version: ${{ matrix.python-version }}

actions/setup-java

setup-python のjava版といった感じ。ポイントはdistributionが選択可能なところ。MarketplaceのURLがsetup-java-jdkなのもポイントです。

- uses: actions/setup-java@v2
  with:
    distribution: 'adopt'
    java-version: '11'
    check-latest: true

actions/setup-node

nodejs版。MarketplaceのURLはsetup-node-js-environmentです。

- uses: actions/setup-node@v2
  with:
    node-version: '14'

actions/cache

Actionsの実行時間短縮には助かりもの。keyの指定が理解するまで間違いやすいことと、言語毎のライブラリ一時キャッシュ先について予め仕組みを理解しておく必要があります。

- uses: actions/cache@v2
  with:
    path: |
      ~/cache
      !~/cache/exclude
    key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}

unfor19/install-aws-cli-action

awscliをv1からv2に移行する際の検証時には使って損をしません。

本番リリース用

Release時のTag追加やDeploy通知で役立つActionです。

mathieudutour/github-tag-action

現在最新のtagに対してインクリメント後のバージョンを返します。

    - name: Bump version and push tag
      id: tag_version
      uses: mathieudutour/github-tag-action@v5
      with:
        github_token: ${{ secrets.GITHUB_TOKEN }}
        default_bump: "minor"

actions/create-release

指定したtagにてreleaseを作成します。mathieudutour/github-tag-actionとの組み合わせで用いる事が多いかもしれません。

    - name: Publish release
      uses: actions/create-release@v1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        tag_name: ${{ steps.tag_version.outputs.new_tag }}
        release_name: Release ${{ steps.tag_version.outputs.new_tag }}
        draft: false
        prerelease: false

chrnorm/deployment-action

DeploymentAPIのステータスを更新します。SlackBot等の通知指定を設定済みであれば、更新時に自動で通知されます。

    - uses: chrnorm/deployment-action@releases/v1
      name: Create GitHub deployment
      id: deployment
      with:
        token: "${{ github.token }}"
        environment: "${{ env.ENVIRONMENT }}"
        description: "${{ env.COMMIT_MESSAGE }}"

    - name: Update deployment status (in_progress)
      uses: chrnorm/deployment-status@releases/v1
      with:
        token: "${{ github.token }}"
        state: "in_progress"
        description: "Start deploy"
        deployment_id: ${{ steps.deployment.outputs.deployment_id }}

補助

動作確認の手間を省きたい時等。

haya14busa/action-cond

Composite run stepsにて条件によって値の変更を行う時に利用してみました。シェルスクリプトでのデバッグ時間を割愛したい時には役立ちます。

    - uses: haya14busa/action-cond@v1
      id: update-pipenv-cache-key
      with:
        cond: ${{ inputs.pipenv-cache-key == null }}
        if_true: "pipenv-cache-key=${{ runner.os }}-python-${{ env.python-version }}-pipenv-${{ env.pipenv-version }}-airflow-${{ hashFiles('airflow/Pipfile.lock') }}"
        if_false: "${{ inputs.pipenv-cache-key }}"

あとがき

現時点で利用していたActionを挙げてみました。新しい仕組みを取り入れるというより、runで自力実装する手間を省くタイプのActionが多めです。

Marketplaceで楽になりそうなActionを時折探してはみるものの、大きくWorkflowの組み方が変わるようなActionが出てくることはそうありません。また、ツールをインストールするタイプのActionはツール自体がhost runner側で初期インストールされていくこともあるため、定期的に本当に必要なActionかどうか確認も大事です。