kun432's blog

Alexaなどスマートスピーカーの話題中心に、Voiceflowの日本語情報を発信してます。たまにAWSやkubernetesなど。

〜スマートスピーカーやVoiceflowの記事は右メニューのカテゴリからどうぞ。〜

いまさらだけどGitHub Actionsを試してみる②

f:id:kun432:20210122002910j:plain

前回の続きです。

前回はこちら。

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タブで確認することができます。

f:id:kun432:20210124015250p:plain

ワークフローの状態や結果はここで表示されます。緑のチェックマークが付いているので「成功」していることがわかります。さらに結果をクリックします。

f:id:kun432:20210124015633p:plain

結果をクリックすると、さらにジョブごとの結果も見えます。トータルやジョブごとの実行時間、ジョブ同士の依存関係も見えます。さらにジョブをクリックします。

f:id:kun432:20210124015724p:plain

ジョブの中で実行された各ステップごとの実行出力を見ることができます。ワークフローが失敗した場合などはどこで失敗しているのかをここで確認することができるわけですね。

f:id:kun432:20210124020139p:plain

まとめ

GitHub Actionsによるパッケージ作成・公開の自動化でした。CI/CD、個人的に経験が少ないところなのと、とても便利なので積極的に使って慣れていきたいです。 CI設定ファイルで指定できるシンタックスはいろいろありますので詳しくはドキュメントをご覧ください。