【初学者と学ぶ】Github Actions: 基本的な構成要素について
仕事でGithub Actionsへの移行作業を行うことになり、どうせなら初学者目線で記事を書いてみようと思いました。
今回は実例と共に基本要素の説明をしたいと思います。
この記事でのゴール
僕はAndroidエンジニアなので、main branchへPRを作成するたびに、Androidのunit testを走らせることをゴールとします!
Github Actionsを構成する要素
主な要素は以下の4つになります。
- Workflow
- Job
- Step
- Action
まず簡単に図で関係を表すと以下のようになります。マトリョーシカのような構造ですね。
Workflow
一番大きな要素で、commitやpushなど指定したイベントをきっかけにJobを実行する。
Job
Workflowに含まれる要素で、内包するStepを順番に実行する。
Step
Jobに含まれる要素で、内包するActionsを順番に実行する。
Action
最小の構成要素で、シェルスクリプトを実行したり、自作又は公式などが提供しているActionを使うこともできる。
Workflowの作成
では早速一番大きな構成要素のWorkflowから作っていきましょう。
まずはWorkflowファイルの作成ですが、repository直下に.github/workflows
というdirectoryを作り、その中に書いたYAMLファイルがWorkflowとして認識されます。
早速作ってみました
# .github/workflows/unit_test.yml
name: Run Unit Test
このままrepositoryにプッシュしても以下のようにエラーが出てしまいます。エラー内容を見てみると、
No event triggers defined in on
と書いてあり、triggerが必要なようです。
Triggerの設定
トリガーとはWorkflowの起動条件のようなもので、commit時やmain branchへのプッシュ時など様々な設定ができます。
こちらのリンクにTriggerのリストが
書いてありますが、今回はmain branchへのPR作成時にunit testを実行したいので以下のように書きます。
# Workflowの名前
name: Run Unit Test Workflow
# onの下にtriggerを記載する
on:
# pull_requestをtriggerとして指定
pull_request:
# branchというオプションを使ってmain branchを指定
branches:
- 'main'
この変更をプッシュすると、また失敗してしまいますが、エラー内容が変わっています。
Jobがないと怒られていますね、ではJobの設定をやっていきましょう。
Jobの設定
Jobとはその名前の通り、Workflow内で実行するJobのことです。デフォルトでは複数設定した場合並列に処理されます。
このJobを設定する際には、実行環境、Jobを実行するために使うWindows、Mac、Ubuntuなどの選択をする必要があります。
使える実行環境の一覧はこちらのリンクから見れます。
今回はubuntu-latest
を使ったJobを作っていこうと思います。
# Workflowsの名前
name: Run Unit Test Workflow
# onの下にtriggerを記載する
on:
# pull_requestをtriggerとして指定
pull_request:
# branchというオプションを使ってmain branchを指定
branches:
- 'main'
# ここからはjobの設定
jobs:
# Jobの名前
unit-test-job:
# 実行環境の設定
runs-on: ubuntu-latest
この内容をプッシュすると、またエラーが出てしまいますが、エラーの内容も変わっています。
では最後のステップ、StepとActionの設定にいきましょう。
Step & Actionの設定
今までの設定は果物で言うと皮のようなもので、このStepとActionが実の部分になります。
各Stepの中でActionを実行して行くんですが見た方が早いと思うので以下に例を書きます。
# Workflowsの名前
name: Run Unit Test
# onの下にtriggerを記載する
on:
# pull_requestをtriggerとして指定
pull_request:
# branchというオプションを使ってmain branchを指定
branches:
- 'main'
# ここからはjobsの設定
jobs:
# Jobの名前
unit-test-job:
# 実行環境の設定
runs-on: ubuntu-latest
# ここからはStepの設定
steps:
# Stepの名前
- name: Checkout repository
# Actionの実行
uses: actions/checkout@v4
- name: Print hello
# スクリプトの実行
run: echo "Hello"
先ほど書いたunit-test-job
の中にCheckout repository
とPrint hello
と言うStepを作成しました。それぞれ説明していきます。
Checkout repository
: 実行環境のubuntu-latest
は初期状態だと空っぽなので、repositoryをcheckoutしてくると言うStepです。actions/checkout@v4
は公式から提供されているrepositoryをcheckoutするためのActionです。
このように公式や自作のActionを組み合わせて様々なCI/CDを組んでいくのがGithub Actionsです!こちらのmarketplaceで様々なActionのリストを見ることができます。
Pirnt hello
: run
と言うコマンドを使って自前のshell scriptを実行することもできます。
ではこのコードをプッシュして、Triggerであるmain branchへのPRを作ってみます。
遂に成功しました!
repositoryのcheckoutと文字のプリントが行われています!
仕上げ
ここまででGithub Actionsの構成要素は説明できたと思うので仕上げとして当初の目的だったAndroidのunit test実行をやっていきたいと思います。
Android開発者ではない方はざっと見ていただければと。
# Workflowsの名前
name: Run Unit Test
# onの下にtriggerを記載する
on:
pull_request: # pull_requestをtriggerとして指定
# branchというオプションを使ってmain branchを指定
branches:
- 'main'
# ここからはjobsの設定
jobs:
# Jobの名前
unit-test-job:
# 実行環境の設定
runs-on: ubuntu-latest
# ここからはStepの設定
steps:
# checkoutするstep
- name: Checkout repository
- uses: actions/checkout@v4
# JDKをinstallするstep
- name: Set up JDK 17
# marketのActionを使う
uses: actions/setup-java@v3
# setup-java@v3のオプション設定
with:
java-version: '17'
distribution: 'temurin'
cache: gradle
# gradlewを実行するための準備step
- name: Grant execute permission for gradlew
# gradlewに実行権限を追加するshell script
run: chmod +x gradlew
# unit testの実行step
- name: Run unit tests
# unit testを実行するshell script
run: ./gradlew clean testDebug
実行結果
さいごに
どうだったでしょうか、わかりやすい記事になっていれば嬉しいです。
Github Actions関連の応用編やAndroid関連の記事なども書いていく予定です!
Discussion