見出し画像

【初学】GitHub Actionsでgolangアプリの自動テストとDockerイメージをプッシュする

概要

CI/CDも触ってみたかったのでGitHub Actionsを試した。
色々試してあまり上手くいかなかったが簡単にところに落ち着いたので書き残しておく。

やりたいこと

・開発中にPR作成した時に自動テストや自動Lintを通す
・特定のブランチにマージされたらDockerイメージを作成し、Docker Hubへアップロードする
・タグをプッシュした時に上記を同様に行う

成果物

試したリポジトリ

開発中用の ci ワークフロー

# https://github.com/marketplace/actions/docker-metadata-action#basic
name: ci

on:
  push:
    branches: [ main ]
  pull_request:
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Docker meta
        id: meta
        uses: docker/metadata-action@v4
        with:
          images: ${{ secrets.DOCKER_HUB_USERNAME }}/go_p_githubactionssample

      - name: Login to DockerHub
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_HUB_USERNAME }}
          password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}

      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16.4

      - name: Checkout code
        uses: actions/checkout@v3

      - name: Fetch required Go modules
        run: go mod download

      - name: Build
        run: go build -v ./...

      - name: Build and push
        uses: docker/build-push-action@v3
        with:
          context: .
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

      - name: Run functional tests
        run: go test -v ./...

      - name: golangci-lint
        uses: golangci/golangci-lint-action@v2

挙動

mainへのプッシュや「main←その他のブランチ」のPR作成で実行される
・PR作成後その他ブランチへのプッシュで再実行
・PRをクローズした際は実行されない
・クローズ後のリオープンで再実行
・PRマージで実行

また、「その他のブランチ←別のブランチ」のPR作成で実行される
・別のブランチへのプッシュで再実行
・PRをクローズした際は実行されない
・クローズ後のリオープンで再実行
・PRマージでは実行されない

Dockerイメージがビルド出来る
DockerイメージをDockerHubへプッシュ出来る
・mainブランチのプッシュでDockerHubへプッシュされる
・mainブランチへのPRのマージでDockerHubへプッシュされる


リリースなど用の release ワークフロー

# https://github.com/marketplace/actions/docker-metadata-action#basic
name: release

on:
  push:
    tags:
      - "v[0-9]+.[0-9]+.[0-9]+"

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Docker meta
        id: meta
        uses: docker/metadata-action@v4
        with:
          #          images: ${{ secrets.DOCKER_HUB_USERNAME }}/${{ github.event.repository.name }}
          images: ${{ secrets.DOCKER_HUB_USERNAME }}/go_t_githubactionstest

      - name: Login to DockerHub
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_HUB_USERNAME }}
          password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}

      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16.4

      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Fetch required Go modules
        run: go mod download

      - name: Build
        run: go build -v ./...

      - name: Build and push
        uses: docker/build-push-action@v3
        with:
          context: .
          push: ${{ github.event_name != 'pull_request' }}
          #          tags: ${{ secrets.DOCKER_HUB_USERNAME }}/${{ github.event.repository.name }}
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

      - name: Run functional tests
        run: go test -v ./...

      - name: golangci-lint
        uses: golangci/golangci-lint-action@v2


挙動

ciワークフローと大体同じ。トリガーはプッシュやPRではなく、タグのプッシュになる。条件を「"v[0-9]+.[0-9]+.[0-9]+"」としており、"v0.0.1"などのフォーマットに適合する。
何らかブランチでタグ「vX.X.X」を打つと実行される。

あとがき

情報は多いがまだ成熟していないのか、散らばっていてバージョンが異なっていたりで、ベストプラクティスでどこかまとめて欲しい。
ただ上記のような簡単なものでも自動テストが行えるようになるのは気分がいい。ECSなどと繋げていきたい。

この記事が気に入ったらサポートをしてみませんか?