【継続的】GitHub Actions CI/CDを試してみた【デリバリー】
先日GitHubが CI/CDサービスを標準サポートする ことが発表されました。
現在、既にベータとして稼働中で触ることができます。 普段業務では主にCircle CIを触っています。またプライベートでは AzurePipelines、Jenkins CI、Travis CIのいずれも触った経験があります。
業務で使うのであれば、個人的には経験が深いCircleCIが好きですが、個人での利用においては無料利用の幅が広いAzure Pipelinesを推したいです。
【開発環境】dotfilesでも継続的にインテグレーションする - pavlog
そんな複数サービスが存在するCI/CDサービスへGitHubのActionsが登場したのは嬉しいことです。
CI/CDとは
CI/CDは「Continuous Integration/Continuous Delivery」の略称です。日本語へ言い換えると、継続的インテグレーションと継続的デリバリーです。
ソフトウェアの変更を常にテストし、プロダクション環境へリリース可能な状態にする手法のことを言います。 これによって、昔と比べバグに素早く気がつくことができたり、修正や更新のリリースを自動化できたりすることが可能になっています。
GitHub Actionsについて
今回、CI/CDが追加されたのはGitHub Actionsの一機能としてです。 このGitHub Actionsは、例えばメンバーのアサインやPR(プルリクエスト)へのコメントをしたり、Lintなども行うことが可能です。
新規にここに追加されたCI/CDサービスについて、今回は簡単な例を実装したものを載せつつレビューしてみたいと思います。
尚GitHub Actions CI/CDの後ろ側にはAzure Pipelinesがいそうです。
The GitHub Actions virtual environments are hosted on virtual machines in Microsoft Azure with the GitHub Actions runner installed. The GitHub Actions runner is a fork of the Azure Pipelines Agent.
Virtual environments for GitHub Actions - GitHub Help
GitHub Actions CI/CDを触ってみる
GitHubにアクセスして、CI/CDを設定したいレポジトリへアクセスしましょう。
The world’s leading software development platform · GitHub
画像に表示したActionsタブより、CI/CDを設定するためのページへ移動することができます。 初回表示の際は、このレポジトリで有効にするかどうかを表示していますので、有効にして進みます。
実際の設定ページは以下となります。
1にはSimple Workflowとあるように、空っぽのワークフローが用意されています。
Simple Workflow
実際に押すとGitHub Actionsの時と同じように編集画面が表示されます。 既存で存在するコードは以下の通りです。ここをベースに設定することになります。
実際にどのようなものを記述するのかは、コメントで注記しておきました。
name: CI # CI/CD名 on: [push] # 実行のトリガー jobs: # ジョブリスト build: # ジョブ(名)定義 runs-on: ubuntu-latest # 実行するマシン steps: # 実行するステップリスト - uses: actions/checkout@master # 利用するアクション - name: Run a one-line script # 実行するステップの名前 run: echo Hello, world! # 実行処理 - name: Run a multi-line script run: | echo Add other actions to build, echo test, and deploy your project.
Popular Workflow (node.js)
popular workflowにいるnode.jsのコードは以下の通りです。
name: Node CI on: [push] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@master - name: Use Node.js 10.x uses: actions/setup-node@v1 with: version: 10.x - name: npm install, build, and test run: | npm install npm run build --if-present npm test
こちらも同様で、steps内に存在する with
が初出です。node.js
のバージョンを指定することができます。
GitHub Actions CI/CDの特徴
実際にコードを書いてCI/CDが走るまでを作ってみました。
(プロジェクト本体が、 yarn
を使っているので冗長になっています。)
コードを見るとよくわかりますが、 matrix.*
という記述が散見されます。
これは、 strategy.matrix
以下に入っている値を全て突っ込んで実行してくれます。
一番大きな特徴はマシンの実行環境の幅が広いことと複数バージョンでの実行が簡単に行えることだと思いました。 Circle CIだと記述次第では複数OS + 複数バージョンでのテストも可能ですが、記述量が膨大になってしまいます。
以下で実行されるCIのジョブは6つです。
name: Linter on: [push] jobs: build: name: Lint on node ${{ matrix.node_version }} and ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: matrix: node_version: [11, 12] os: [ubuntu-16.04, ubuntu-18.04, ubuntu-latest] steps: - uses: actions/checkout@master - name: Use Node.js ${{ matrix.node_version }} uses: actions/setup-node@v1 with: version: ${{ matrix.node_version }} - name: Setup yarn. run: | curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.17.3 - name: yarn install run: | yarn install - name: run static lint run: | yarn lint
GitHub CI/CD by paveg · Pull Request #1 · paveg/pf · GitHub
コードには書いていませんがMacOSとWindowsOSも利用可能です。
Add a few lines to the Actions YAML file, and let GitHub take care of the rest.
MatrixBuidについて は該当の部分に英語で書かれています。 簡単に記述できるのは最高ですね。
また、環境変数なども設定可能でRepositoryの設定(secrets)ページから個別に設定することが可能です。
jobs: my_first_job: steps: - name: My first step uses: actions/hello-world@master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} MY_VAR1: a_variable
終わりに
詳しい説明はこちらに書いてありますので、興味がある方はぜひ見てください。
Workflow syntax for GitHub Actions - GitHub Help
これによってより柔軟にCI/CDサービスが選べるようになります。 また今までセルフホストランナーとしての利用ができるCIサービスはエンタープライズプランにしかないはずで、それができるようになるのがとても魅力的だなと感じました。
今回は導入として記事を書いたので、詳細は省きます(気が向いたら書きます)。
GitHub Japanのツイートでも詳細について書かれていますので興味があれば覗いてみてください!
今後のロードマップその1:皆様のデータセンターやクラウドサービス上のVMでActionsの処理を実行できるセルフホストランナーの提供を予定しています。こちらは無料でお使い頂ける予定です。
— GitHub Japan (@GitHubJapan) 2019年8月8日