GitHub Actionsに魅了されてしまいました | Dev Driven 開発・デザインチーム GitHub Actionsに魅了されてしまいました – 働くひとと組織の健康を創る iCARE

BLOG

GitHub Actionsに魅了されてしまいました

MiyakawaKazuya
2021/02/18

こんにちは!インフラエンジニアのずやです!

今まで僕は、「CIといえばCircleCI」というような人間でした。
(単純にCIrlcelCIしか利用してこなかっただけです。井の中の蛙です。)

ですが、つい最近GitHub Actionsを使い始めまして、

はい、

とっても気に入ってしまいました^^

特に、任意のタイミングでCIワークフローを実行できる「workflow_dispatch」という機能には心を鷲掴みされました
(CircleCIにはこんなステキ機能なかったよーーー)

ということで今回は、GitHub Actionsとその一機能である「workflow_dispatch」について簡単に紹介したいと思います!

GitHub Actionsについて

https://docs.github.com/ja/actions

GitHub Actionsは2018年に発表、2019年にGAとなった比較的新しいCIサービスです。

CircleCIと同様にリポジトリに設定ファイルを配置することで、CIの動作を定義できます。

GitHubが提供しているだけあって、GitHubとの連携はピカイチです。
設定ファイルをリポジトリにpushするだけですぐに使い始められますし、同じGitHubの画面から「Actions」のタブを介してすぐにアクセスできます。

また料金も魅力的で、パブリックリポジトリであれば無料なため、お手軽に利用することができます。
(プライベートリポジトリでも無料利用枠があります → 参考

サンプルコード

実際に設定ファイルの簡単な例を紹介します。

設定ファイルはリポジトリ内の .github/workflows/ ディレクトリ下にyamlファイルとして配置します。
(ファイル名は任意です)

下記は、Rubyのプロジェクトでdevelopブランチへのpush時にテストを実行するワークフローの例です。

# ワークフローの名前
name: ruby-test

# ワークフローのトリガー
on:
  push:
    branches: [ develop ]  # developブランチにpushされたときにワークフロー実行

# ワークフローで実行されるジョブの定義
jobs:
  test:
    runs-on: ubuntu-latest  # 最新のUbuntu環境でjobを実行
    steps:
    - uses: actions/checkout@v2  # リポジトリのチェックアウト
    - name: Set up Ruby
      uses: ruby/setup-ruby@v1
      with:
        ruby-version: 2.6  # Rubyのバージョン2.6の環境をセットアップ
    - name: Install dependencies
      run: bundle install  # Gemのインストール
    - name: Run tests
      run: bundle exec rspec  # rspecによるテストを実行

トリガーの定義

on で、ワークフローのトリガーを定義します。

on:
  push:
    branches: [ develop ]

push の他に、プルリクエストに関する pull_request やlabelの追加・変更・削除の label 、後述する workflow_dispatch など多種多様のイベントを設定することができます。
詳細はこちらをご覧ください。

ジョブの定義

jobs で、ワークフローにおいて実行する処理を定義します。
複数のjobを並列または直列に実行させることも可能です。

runs-on で、jobを実行する仮想マシンの種類を設定します。
利用できる仮想マシンの種類はこちら

runs-on: ubuntu-latest

steps で、jobで実行するタスクを定義していきます。

uses によって、アクションと呼ばれる定義済みのタスクを実行することができます。
アクションは公開されているものを利用したり、自分で作成したりすることが可能です。

    steps:
    - uses: actions/checkout@v2

また、run によって、任意のコマンドやスクリプトを実行させることもできます。

    steps:
    - name: Install dependencies
      run: bundle install

設定ファイルでは他にも多くの設定可能な項目があります。
詳細は公式のリファレンスを参照してください。

workflow_dispatch

workflow_dispatch はワークフローのトリガーの一種で、ワークフローを任意に手動で起動することができます。

主な特徴は以下の通りです。

  • ブラウザ(GitHubのリポジトリのページ)から操作できる
  • ワークフローを実行するブランチを指定できる
  • 実行時にパラメータを渡すことができる
  • REST API からでも利用できる

用途

開発プロセスの自動化がCIの肝ではありますが、任意のタイミングでCIを実行するといことが刺さるユースケースも多々あると思います。

例えば、クラウド上(AWS等)の開発環境へのデプロイです。
本番環境であれば main ブランチへの push をトリガーにデプロイのジョブを実行すればよいと思います。一方、開発環境は任意の feature ブランチを任意のタイミングでデプロイできると便利だと思います。
workflow_dispatch はワークフロー実行時にブランチを選択できるため、好きなブランチを好きなタイミングでデプロイするということが容易に実現できます。

また、ワークフロー自体のデバッグの用途としても利用できると思います。
schedule トリガー(cron)のワークフローのjobの動作確認をするために、わざわざ設定した時間になるのを待って確認するのは手間ですよね。そういう場合に、workflow_dispatch トリガーも設定することで、任意にワークフローを走らせることが可能です。

サンプルコード

こちらも簡単に設定ファイルの例を紹介します。

name: workflow-dispatch-test

on:
  workflow_dispatch:
    inputs:
      hoge:
        description: "実行時にパラメータを渡すことができます"
        require: true
        default: "fuga"

jobs:
  hello:
    runs-on: ubuntu-latest  # 最新のUbuntu環境でjobを実行
    steps:
    - name: Echo input value
      run: echo "${{ github.event.inputs.hoge }}"

onworkflow_dispatch を指定します。
さらに、 inputs 以下でワークフロー実行時に渡せるパラメータを定義できます。

workflow_dispatch:
    inputs:
      hoge:
        description: "実行時にパラメータを渡すことができます"
        require: true
        default: "fuga"

パラメータは jobs 内で ${{ github.event.inputs.<名前> }} の形式で参照することができます。

echo "${{ github.event.inputs.hoge }}"

設定ファイルをリポジトリのデフォルトブランチに含めることで、GitHubのリポジトリ画面の「Actionsタブ」→「対象のworkflow」の画面に「Run workflow」というボタンが追加されます。
ボタンをクリックすると、ブランチと設定ファイルで定義したパラメータを入力できます。
さらに「Run workflow」ボタンをクリックするとワークフローが実行されます。

おわりに

GitHub Action 興味もっていただけたでしょうか。
僕自身まだ入門したばかりなのでこれからドシドシ使い倒して、また知見を発信していきたいと思います!