🐦

GitHub Actionsはじめました

2024/05/03に公開

はじめに

業務で初めてGitHub Actionsに関わる機会がありました。
そこでのGitHub Actionsではファイルの静的解析、ビルド、デプロイなどをさまざまなアクションを行なっており、所定のディレクトリにYAMLファイルを作成するだけで構築できるといった導入コストの低いことに魅力を感じ個人の開発環境に取り入れようと考えました。
ここでは書籍や他の方のブログを参考にGoを対象にGitHubActionsを構築した内容をまとめてみました。

GitHub Actionsとは

GitHub Actionsはプッシュなどにビルド、テスト、デプロイを行うCI/CDツールです。
ビルドなど以外にもプルリクエスト時にSlackへの通知なども可能です。
GitHub Actionsではテストコードの実行、ビルドなどの各コマンドを実行を行うことをステップと言い、複数のステップをまとめたのをジョブ、ジョブをまとめたのをワークフローといいます。ワークフロー、ジョブ、ステップなどはYAMLファイルに定義にし所定のディレクトリに配置します。ワークフローはプッシュまたはプルリクエストが作成されたタイミングで定義された処理が実行されます。実行環境はLinux、Mac、Windowsから選択することが可能です。

実際に作成してみました

前述の通り、GitHub Actionsを構築するためにYAMLファイルを作成する必要があります。
ファイル名は任意で問題ありませんが、YAMLファイルはプロジェクト直下の以下に配置する必要があります。
/.github/workflows
今回作成したYAMLファイルは以下の通りです。
内容については次の節で説明いたします。

name: Go Github Actions
on: push

env:
  DB_USER: ${{secrets.DB_USER}}
  DB_PW: ${{secrets.DB_PW}}
  DB_HOST: ${{secrets.DB_HOST}}
  DB_PORT: ${{secrets.DB_PORT}}
  DB_NAME: ${{secrets.DB_NAME}}

jobs: 
  build: 
    name: Go Test
    runs-on: ubuntu-latest
    steps:
      - name: Setup Go
        uses: actions/setup-go@v3
        with:
          go-version: '1.18.0'
      
      - name: Branch Checkout
        uses: actions/checkout@v2
        with: 
          ref: ${{ github.ref }}
      
      - name: Go Build
        run: go build

      - name: Install golangci-lint
        run: curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.57.1

      - name: golangci-lint run
        run: golangci-lint run

      - name: Docker Compose Up
        run: docker-compose up -d

      - name: Install golang-migrate
        run: |
          curl -L https://packagecloud.io/golang-migrate/migrate/gpgkey | sudo apt-key add -
          echo "deb https://packagecloud.io/golang-migrate/migrate/ubuntu/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/migrate.list
          sudo apt-get update
          sudo apt-get install -y migrate

      - name: Migration
        run: migrate --path ./migrations --database 'postgresql://${{ env.DB_USER }}:${{ env.DB_PW }}@${{ env.DB_HOST }}:${{ env.DB_PORT }}/${{ env.DB_NAME }}?sslmode=disable' -verbose up

      - name: Go Run TestCode
        run: go test -v  -cover ./...

解説

ワークフローの定義

name: Go Github Actions
on: push

nameにはワークフロー名を定義します。上記の場合は「Go Github Actions」がワークフロー名となります。
onはワークフローが実行されるイベント名を定義します。
今回はpush時にワークフローが実行されます。
プルリクエスト作成時に実行させたい場合は「on: pull_request」と定義します。

環境変数の定義

env:
  DB_USER: ${{secrets.DB_USER}}
  DB_PW:   ${{secrets.DB_PW}}
  DB_HOST: ${{secrets.DB_HOST}}
  DB_PORT: ${{secrets.DB_PORT}}
  DB_NAME: ${{secrets.DB_NAME}}

DBに接続するための環境変数を定義しています。
環境変数はGitHub上で設定します。
設定方法は以下の通りです。

①「Settings」を押下
テスト
②「Actions」を押下

③「New repository secret」を押下

④「Name」に環境変数名、「Secret」に値を入力し、「Add secret」を押下

⑤環境変数が登録できると、赤枠の箇所に追加されます。

ジョブの定義

jobs: 
  build: 
    name: Go Test
    runs-on: ubuntu-latest

jobsでジョブの始まりを示しています。
nameはジョブ名で、runs-onは実行環境を定義しています。
今回は実行環境はUbuntuの最新バージョンであるUbuntu 22.04を使用しています。
ubuntu-latestに指定している場合は、今後のGitHubの次第でUbuntuのバージョンも変わるため注意が必要です。
各環境のlatestのバージョンについては以下に記載されています。
https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#standard-github-hosted-runners-for-private-repositories

ステップの定義① Goのインストール

    steps:
      - name: Setup Go
        uses: actions/setup-go@v3
        with:
          go-version: '1.18.0'

steps内で処理を実行するステップを定義します。
注意点としてはステップのプロセスは独立しておりステップ内で環境変数を変更した場合は後続のステップには引き継がれません。
nameはステップ名、usesはGitHub Marketplaceのリソースを使用する処理を定義しています。
withはusesで実行する時のパラメータや環境変数などを定義します。
actions/setup-go@v3を使用してGo ver1.18.0をインストールしています。
https://github.com/actions/setup-go

ステップの定義② ブランチのチェックアウト

      - name: Branch Checkout
        uses: actions/checkout@v4
        with: 
          ref: ${{ github.ref }}

今回は最後にソースコードのテストを実施するため、実行環境上に開発したソースコードを持ってくる必要があります。
actions/checkoutを使用してリポジトリで管理されているソースコードを実行環境にチェックアウトします。
この時、with.refで${{ github.ref }}を定義することでプッシュしたブランチをチェックアウトすることができます。
https://github.com/actions/checkout

ステップの定義③ ビルド

      - name: Go Build
        run: go build

前の処理でブランチがチェックアウトされました。
ここではビルドを実行しソースコードに問題ないか確認をします。

ステップの定義④ golangci-lintのインストール、実行

      - name: Install golangci-lint
        run: curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.57.1

      - name: golangci-lint run
        run: golangci-lint run

golangci-lintのインストールし実行しています。
golangci-lintはGoの静的解析ツールです。
設定次第でコンパイラーとは別の観点でエラーチェックや使用されていない変数のチェックなどを行うことができます。
https://github.com/golangci/golangci-lint
https://zenn.dev/sanpo_shiho/books/61bc1e1a30bf27/viewer/27b52f

ステップの定義⑤ コンテナ起動

      - name: Docker Compose Up
        run: docker-compose up -d

Docker Composeを起動して開発環境と同じDBが構築されたコンテナを立ち上げています。
上記以外でGitHubActiosではjob.jobid.containerを利用することで実行環境内でコンテナを起動することもできます。

ステップの定義⑥ マイグレーション

      - name: Install golang-migrate
        run: |
          curl -L https://packagecloud.io/golang-migrate/migrate/gpgkey | sudo apt-key add -
          echo "deb https://packagecloud.io/golang-migrate/migrate/ubuntu/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/migrate.list
          sudo apt-get update
          sudo apt-get install -y migrate

      - name: Migration
        run: migrate --path ./migrations --database 'postgresql://${{ env.DB_USER }}:${{ env.DB_PW }}@${{ env.DB_HOST }}:${{ env.DB_PORT }}/${{ env.DB_NAME }}?sslmode=disable' -verbose up

今回、テストコードを実行するために先ほど処理で構築されたDBにテーブルを作成する必要があります。
テーブル作成はジョブ「Install golang-migrate」、「Migration」で行います。
Install golang-migrateではGoのマイグレーションツールであるgolang-migrateをインストールしています。
Migrationではgolang-migrateを利用してマイグレーションファイルを読み込みDBにテーブルを作成しています。
https://zenn.dev/farstep/books/f74e6b76ea7456/viewer/4cd440

ステップの定義⑦ テストコード実行

      - name: Go Run TestCode
        run: go test -v  -cover ./...

最後はテストコードを実行しています。

動作確認

ワークフロー成功、失敗に関係なく以下の様に各ステップごとにログが出力されます。

ワークフローが失敗した場合は以下の様に表示されます。
失敗した場合はGitHubに登録しているメールアドレスに通知が送信されます。

また、ワークフローのどのステップで失敗したのも画面から確認できます。

終わりに

初めてGitHubActionsに触れましたが、個人の開発環境への導入や設定などが容易なツールだと感じました。
今回はビルドやコードの静的解析、テストコード実行などのCIがメインでしたが、今後はデプロイの自動なども学習していきたいです。

参考資料

https://eng-blog.iij.ad.jp/archives/18963
https://zenn.dev/farstep/books/f74e6b76ea7456/viewer/4cd440
https://zenn.dev/sanpo_shiho/books/61bc1e1a30bf27/viewer/27b52f
https://nextpublishing.jp/book/11908.html

Discussion