【初学】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などと繋げていきたい。
この記事が気に入ったらサポートをしてみませんか?