はじめに
今回は最近何かとよく聞くGitHub Actionsを
少し仕事で触る機会があったのでソースも含め、まとめてみます。
GitHub Actions とは
公式では以下のように書かれています。
GitHub Actions では、カスタムソフトウェア開発のライフサイクル (SDLC) にわたるワークフローを GitHub リポジトリに直接作成することができます。
参考: https://help.github.com/ja/actions/automating-your-workflow-with-github-actions/about-github-actions
今まで外部サービスを利用して行なっていたリリースフローも
GitHubのソースリポジト内に簡単に設定できるような仕組みが提供されています。
また、GitHub Actionsを設定するにあたり理解しておくべき二つの概念についてもまとめておきます。
workflow
GitHubリポジトリのどの処理(pull request作成時など)にひっかかけて
どういう処理を走らせるかを定義します。
あとで記述しますがapp-path/.github/workflows
に上記の内容を定義したyamlファイルをおきます。
簡単な処理だとworkflowの中で定義することも可能ですが、
複雑な処理やいくつかのworkflowで共通化させたい時処理が出てくる時もあります。
その時に使うのが次です。
action
ここではaction.ymlというファイルをGitHubのフォーマットに乗っ取って定義すれば
あとはコンテナなどでプログラムを簡単に動かすことができる仕組みが提供されいます。
現在多くのactionがOSS化されており、
様々なことが簡単にできるようになっています。
#作ったもの
pull requestにlabelが貼り付けられた時に設定されたコメントを投げるだけの簡単なリリースフローの作成です。(実際の業務はもう少し複雑ですが、少し簡易化します)
actionの作成
まずactionを作成します。
app-path/.github/actions/actions-test
のディレクトリ以下にactionsを作るのに必要なファイルを作成します。
name: 'comment-action'
description: 'When a pull request is labeled Create a comment'
inputs:
msg:
description: Comment's message
required: true
runs:
using: 'docker'
image: 'Dockerfile'
args:
- ${{ inputs.msg }}
FROM ruby:2.6.0
RUN gem install octokit
ADD entrypoint.sh /entrypoint.sh
RUN chmod 711 /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
#!/usr/bin/env ruby
require "json"
require "octokit"
pr_json = File.read(ENV.fetch("GITHUB_EVENT_PATH"))
pr = JSON.parse(pr_json)
github = Octokit::Client.new(access_token: ENV.fetch["GITHUB_TOKEN"])
repo_name = pr["pull_request"]["head"]["repo"]["full_name"]
pr_num = pr["number"]
msg = ARGV.msg
github.add_comment(repo_name, pr_num, msg)
これでworkflowから呼び出された時にDockerfileを元にコンテナを起動して
entrypoint.shに書かれている処理が実行されるようになります。
ちなみにGITHUB_EVENT_PATHにはイベントの起点となったものの情報がいろいろ入っているので
actionを作る時には活用することになると思います。
workflowの作成
次にworkflowを作成します。
app-path/.github/workflows
のディレクトリ以下にworkflowを設定するのに必要なファイルを作成します。
name: workflow-test
on:
pull_request:
types: labeled
jobs:
commented:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- uses: './.github/actions/action-test'
env:
GITHUB_TOKEN: ${{ secrets.GH_TKN }}
with:
msg: "test comment"
これでpull requestにlabelがつけられた時に
action-testが動くように設定できました。
そしてあとは、
GitHubのprojectページから、secret keyを設定することが可能なので
GitHubのaccess tokenを設定すれば完成です。
まとめ
今回は非常に簡単な処理を行いましたが
GitHubが様々な仕組みを用意してくれているので
簡単にリリースフローが設定しやすくなっていると思います。
ただ、まだ日本語文献が少なく
概念を理解しずらいため簡単にまとめてみてました。
ぜひ一度試してみてください。