🐺

Composite Action 入門

2024/07/20に公開

composite action に入門

github actions では、様々な拡張機能(パッケージ)が公開されています。
ここでは、composite actions の内容について理解を深めていこうと思います。

https://github.com/marketplace

ただの宣伝

今回作成した action はこちらです。
実装時の参考になればと思います。

https://github.com/Pianoopera/ChecklistValidator

PR のチェックリストを確認する action です。

composite action とは

複合アクションを使用すると、一連のワークフロー ジョブ ステップを 1 つのアクションに収集し、複数のワークフローで 1 つのジョブ ステップとして実行できます

つまり、再利用可能にするために用意された github actions の機能の一つと理解しています。

https://docs.github.com/en/actions/creating-actions/creating-a-composite-action?platform=mac

公式のドキュメントで十分demoは作れるくらい充実していました。

composite action 必須項目

composite action を利用するにあたり必要になる項目について

https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions#runs-for-composite-actions

runs.using

compositeを指定する

runs:
  using: "composite"
  steps:
    - run: ${{ github.action_path }}/test/script.sh
      shell: bash

runs.steps

このアクションで実行する予定のステップ

Option 周り

runs.steps[*].run

実行したいコマンドを書く

runs.steps[*].shell

Optional The shell where you want to run the command. You can use any of the shells listed in "Workflow syntax for GitHub Actions." Required if run is set.

ここら辺が利用できるらしい
https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsshell

runs.steps[*].if

条件式を組み込める

steps:
  - run: echo This event is a pull request that had an assignee removed.
    if: ${{ github.event_name == 'pull_request' && github.event.action == 'unassigned' }}

runs.steps[*].name

composite の step 名

runs.steps[*].id

ステップの一意な識別子

runs.steps[*].env

そのステップだけの環境変数のマップを設定

runs.steps[*].working-directory

コマンドを実行する作業ディレクトリを指定

runs.steps[*].uses

ジョブのステップの一部として実行するアクションを選択します。 アクションは再利用可能なコード単位

runs:
  using: "composite"
  steps:
    # Reference a specific commit
    - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3
    # Reference the major version of a release
    - uses: actions/checkout@v4
    # Reference a specific version
    - uses: actions/checkout@v4.2.0
    # Reference a branch
    - uses: actions/checkout@main
    # References a subdirectory in a public GitHub repository at a specific branch, ref, or SHA
    - uses: actions/aws/ec2@main
    # References a local action
    - uses: ./.github/actions/my-action
    # References a docker public registry action
    - uses: docker://gcr.io/cloud-builders/gradle
    # Reference a docker image published on docker hub
    - uses: docker://alpine:3.8

runs.steps[*].with

アクションで定義された入力パラメータのマップ

runs:
  using: "composite"
  steps:
    - name: My first step
      uses: actions/hello_world@main
      with:
        first_name: Mona
        middle_name: The
        last_name: Octocat

ここら辺が composite action で利用する各種項目

セキュリティー周りの話

composite action を採用するに当たり、気にすべき観点

Warning: When creating workflows and actions, you should always consider whether your code might execute untrusted input from possible attackers. Certain contexts should be treated as untrusted input, as an attacker could insert their own malicious content. For more information, see "Security hardening for GitHub Actions."
https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#understanding-the-risk-of-script-injections

取り扱う内容により、観点は異なる。

Understanding the risk of script injections

script injection の例
https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#understanding-the-risk-of-script-injections

Accessing secrets

秘密情報に関する取り扱いについて
https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#accessing-secrets

  • ${{ secrets.GITHUB_TOKEN }}から、${{ github.token }}を推奨
  • 環境変数を扱う場合は、バリデーションなど利用すると良い。
  • github.tokenを扱う場合は、Forkを考慮した設定にする。

攻撃者が取りうるステップ

攻撃者がGitHub Actions runner上で悪意のあるコマンドを実行できた場合に取り得る手順について

https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#potential-impact-of-a-compromised-runner

Tips

覚えておくと便利なやつ

GITHUB_ACTION_PATH

独自スクリプトを実装する場合は GITHUB_ACTION_PATH(デフォルト環境変数)を使用して、action.ymlが存在するパスを取得してくれる。

runs:
  using: "composite"
  steps:
    - run: $GITHUB_ACTION_PATH/script.sh
      shell: bash

Private リポジトリ同士で利用する場合

同じ組織内にいれば composite で登録したリポジトリの設定で
Actionsを組織内での利用を有効にすると使用可能

https://docs.github.com/ja/actions/sharing-automations/sharing-actions-and-workflows-with-your-organization

actions/checkout@v4の設定

composite action として登録する際に、actions/checkoutを利用する場合にrepositoryを設定する

- name: Checkout repository
      uses: actions/checkout@v4
      with:
        repository: "org/repository"

Discussion