前回の続きです。
前回はこちら。
GitHub Actionsの設定ファイルを見ていきます。
目次
GitHub ActionsとGitHub Packages
その前に、前回さらっと流しちゃいましたが、GitHub ActionsとGitHub Packagesは別物です。
- GitHub Actions
- pushやpull requestなどのレポジトリに対するイベント、cronのような定期的なスケジュールなどを「トリガー」としてレポジトリに/を使って自動的に操作を行うのがGitHub Actions。ビルドしたりテストしたり、パッケージを作ったりなど。
- GitHub Packages
- パッケージを保存・公開するレジストリ。npmパッケージ、dockerイメージ、MavenによるJavaのパッケージ等をGitHub上でホストできます。GitHub Actionsと組み合わせると、パッケージのビルドから公開までを一気に行うことができる。
これを踏まえて、設定ファイルを見ていきましょう。
CI設定ファイル
前回お伝えしたとおり、GitHub Actionsの設定ファイルは.github/workflows
以下になります。これをCI(Continuous Integration)設定ファイルといいます。前回作成したのは以下のようなファイルです。
name: Node.js Package on: release: types: [created] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v1 with: node-version: 12 - run: npm ci - run: npm test publish-gpr: needs: build runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v1 with: node-version: 12 registry-url: https://npm.pkg.github.com/ - run: npm ci - run: npm publish env: NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}
順に見ていきます。
name
name
はGitHub Actionsに渡すワークフローの名前です。ワークフローは一連のジョブの実行手順です。ここに記載されたジョブが実行されます。
name: Node.js Package
on
on
はワークフローを実行するトリガーを記載します。
on: release: types: [created]
上記の例だと新しいreleaseが作成されたタイミングを指定しています。それ以外にも
- push
- pull request
- schedule
などが指定できます。
jobs
jobsでジョブを記載します。複数書くこともできます。例えば上の例だと、buildとpublish-gprという2つのジョブが実行されることになります。
jobs: build: // 1つ目のジョブ (snip) publish-gpr: // 2つ目のジョブ (snip)
jobはデフォルトだと並列で実行されます。順番に実行する場合は以下のようにneeds
で一つ前のjobを指定することで順番に実行することができます。
jobs: build: (snip) publish-gpr: needs: build // buildのあとに実行される (snip)
また、jobごとにコンテナ実行環境が用意されます。runs-on
でその実行環境を指定できます。
jobs: build: runs-on: ubuntu-latest // 最新のubuntuコンテナ上で実行される (snip)
steps
ここからジョブの中身になります。stepsは実際に実行されるコマンドやプロセス、アクションになります。stepsは記載した順番に実行されます。stepsには色々なパラメータがありますが、通常のコマンドを実行する場合はrun
を使います。
例えば以下のように書くと、npm ciで依存パッケージがインストールされ、npm testでテストが行われます
steps: - run: npm ci - run: npm test
runは単一のコマンドの実行です。上記の例では、node.js/npm実行環境があるように見えますが、実際は自分でその環境を用意する必要があります。つまり多数のrunコマンドを記載する必要があることになりますが、よく使うものはまとめておきたいですよね。それがactionになります。
actionは自分で作成することもできますし、公開されているものを使うこともできます。actionを使う場合はuses
を使います。以下の例だと、レポジトリをチェックアウトしてくれるcheckout
アクションと、node.js実行環境を用意してくれるsetup-node
アクションを順番に実行します。
steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v1
また、actionにはwith
を使って予め定義されたパラメータを渡すこともできます。以下の例だと、node-versionとregistry-urlをパラメータとしてsetup-nodeアクションに渡しています。
- uses: actions/setup-node@v1 with: node-version: 12 registry-url: https://npm.pkg.github.com/
ということで、buildジョブをまとめてみると、
build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v1 with: node-version: 12 - run: npm ci - run: npm test
- ubuntu-latestコンテナが作成され、その上でbuilldジョブが実行される
- 実行内容は以下
- actions/checkoutアクションで、レポジトリがチェックアウトされる
- actions/setup-nodeアクション、node.js12実行環境が構築される
- npm ciで依存パッケージが安全にインストールされる
- npm testでテストが行われる
ということになりますね。
GitHub ActionsとGitHub Packagesの連携
buildジョブはテストまで、でした。それに対しpublish-gprの方はGitHub Packagesへの公開まで行っています。
publish-gpr: needs: build runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v1 with: node-version: 12 registry-url: https://npm.pkg.github.com/ - run: npm ci - run: npm publish env: NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}
内容的には"build"ジョブとほとんど同じですね。違うところは、
needs
でbuildジョブのあとで実行される- setup-nodeアクションを実行する際にregistry.pkg.github.comがnpmレジストリとして指定されている
- 最後に
npm publish
が追加されている
の3つです。
1つ目のneeds
のところはすでに説明したとおりです。
2つ目のregistry.pkg.github.comがGitHub Packagesによるnpmレジストリです。これを指定することでnpm publishを実行したときの公開先がGitHub Packagesになるということです。
最後のところは、前回記載しましたがGitHub Actionsにアクセスするにはトークンが必要なのでした。env
を使うことで、runでコマンドを実行する場合に環境変数を渡すことができます。これでGitHub Packagesにnpm ci/npm testしたパッケージがアップロードされるということになります。
実行状態/結果を見る
ワークフローの実行状態は、Actionsタブで確認することができます。
ワークフローの状態や結果はここで表示されます。緑のチェックマークが付いているので「成功」していることがわかります。さらに結果をクリックします。
結果をクリックすると、さらにジョブごとの結果も見えます。トータルやジョブごとの実行時間、ジョブ同士の依存関係も見えます。さらにジョブをクリックします。
ジョブの中で実行された各ステップごとの実行出力を見ることができます。ワークフローが失敗した場合などはどこで失敗しているのかをここで確認することができるわけですね。
まとめ
GitHub Actionsによるパッケージ作成・公開の自動化でした。CI/CD、個人的に経験が少ないところなのと、とても便利なので積極的に使って慣れていきたいです。 CI設定ファイルで指定できるシンタックスはいろいろありますので詳しくはドキュメントをご覧ください。