🐦

【初学者と学ぶ】Github Actions: 基本的な構成要素について

2024/04/14に公開

仕事でGithub Actionsへの移行作業を行うことになり、どうせなら初学者目線で記事を書いてみようと思いました。

今回は実例と共に基本要素の説明をしたいと思います。

この記事でのゴール

僕はAndroidエンジニアなので、main branchへPRを作成するたびに、Androidのunit testを走らせることをゴールとします!

Github Actionsを構成する要素

主な要素は以下の4つになります。

  • Workflow
  • Job
  • Step
  • Action

まず簡単に図で関係を表すと以下のようになります。マトリョーシカのような構造ですね。

img.png

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が必要なようです。
img.png

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'

この変更をプッシュすると、また失敗してしまいますが、エラー内容が変わっています。
img.png
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 repositoryPrint 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