13
5

More than 3 years have passed since last update.

【GitHub Actions】 actionを自作して動かしてみる

Last updated at Posted at 2019-12-15

はじめに

今回は最近何かとよく聞く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を作るのに必要なファイルを作成します。

app-path/.github/actions/actions-test/action.yml
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 }}
app-path/.github/actions/actions-test/Dockerfile
FROM ruby:2.6.0

RUN gem install octokit

ADD entrypoint.sh /entrypoint.sh
RUN chmod 711 /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]
app-path/.github/actions/actions-test/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を設定するのに必要なファイルを作成します。

app-path/.github/workflows/workflow-test
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が様々な仕組みを用意してくれているので
簡単にリリースフローが設定しやすくなっていると思います。

ただ、まだ日本語文献が少なく
概念を理解しずらいため簡単にまとめてみてました。

ぜひ一度試してみてください。

13
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
5