Github Actionを作る側のメモ。
ワークフローの中で使う側のメモはこちら => Github Actionsの使い方メモ
ドキュメント
パブリックなアクション
パブリックなリポジトリを Github に作り、リポジトリのルートに action.yaml または action.yml という名前のファイルを作って次のドキュメントを参考にメタデータを記述してアクションを定義する。
他のリポジトリでも利用できる形式だけど、前述のようにリポジトリをパブリックにする必要がある。
アクションの実行環境は大きく分けて2種類ある
- Javascript アクション
- Docker コンテナアクション
Javascript アクション
Node.jsをランタイムにするアクション。
action.yaml の runs.using
に 'node16'
を指定する(ドキュメントによると node12
も指定できそうだけど、流石にもう古すぎるだろう)。
次のリポジトリにアクションの開発をサポートするツールが公開されている
Docker コンテナアクション
Docker コンテナで処理を実行するアクション。
コンテナで実行するので、実装言語は何でも使える。
action.yaml の runs.using
に 'docker'
を指定し、runs.image
に次のいずれかを指定する
- Dockerfile
- Dockerhubなどパブリックなレジストリで公開されている Docker イメージ
- Github謹製のDockerコンテナ (GitHub Actionsで公開されているやつかな)
Dockerイメージを指定すると、ワークフローの実行ごとにビルドが走るので、イメージを作ってそれを利用したほうがワークフローの実行時間は短くできる。
コンポジットアクション
前述の2種類とは異なり、Githubワークフローの様に step:
以下に run:
や use:
で実行したい処理ステップを定義するアクション。
use:
が使えるということは別の Github Action を呼び出すこともできるということ。
後述するが、プライベートアクションで共通処理をくくりだすのに便利。
マーケットプレイスへの登録
パブリックなアクションで、Releaseを作成すると、このリリースをマーケットプレイスで公開するか? と聞かれるので指示に従えば、GitHub Marketplace · Actions to improve your workflowで公開することができる。
別にマーケットプレイスで公開しなくても、他のリポジトリでパブリックなアクションは利用できる。
プライベートなアクション
プライベートなアクションはそれを利用するリポジトリで定義する。
パブリックなアクションと同じく action.yaml というファイルを作ってアクションを定義する。
action.yamlの置き場所はどこでも構わない。例えば、*.github/actions/<アクション名>/action.yml* でアクションを定義したら、それを利用するワークフロー定義で`use: .github/actions/<アクション名>` の様に action.yaml を置いたディレクトリをリポジトリのルートからの相対パスで指定すればよい。
プライベートアクションの使い所
プライベートなアクション内で実行することはワークフロー内に実装してもできるだろう。
ワークフロー内で run:
を使えば、少々複雑なこともできてしまう。なんならスクリプトを書いてそのファイルを run:
で叩けばワークフローが肥大したり、煩雑になることも避けられる。
とするとプライベートアクションはどこで使うのが効果的か?
例えばほとんど同じなのだけど、CI/CDの都合で環境ごとにちょっとづつ処理を変えたいが、if:
で分岐するのもいまいち見通しが悪い。
そういうときに共通部分をプライベートアクションにくくりだしてコンポジットアクションを作って、呼び出すようにすれば良い。
そうすれば、run:
だけでなくuse:
で他の Github Action も利用した処理ステップを共通化できる。