内容
Golangで作ったアプリのDockerイメージを作成し、Dockerレジストリにpushする。
Golangアプリ用のDockerfileはこちら
目次
- ワークフローファイル
- 内容の捕捉
ワークフローファイル
ci.yaml
name: CI
on:
push:
tags:
- "v*.*.*"
jobs:
test:
runs-on: ubuntu-18.04
strategy:
matrix:
go: ["1.15"]
steps:
- name: Check out source code
uses: actions/checkout@v1
- name: Set up Go v${{matrix.go}}
uses: actions/setup-go@v2
with:
go-version: ${{matrix.go}}
- name: Install dependent packages
run: go mod download
- name: Run all test
run: go test -v ./...
docker-build:
needs: ["test"]
runs-on: ubuntu-18.04
env:
DOCKER_IMAGE_NAME: docker-app
steps:
- name: Check out source code
uses: actions/checkout@v1
- name: Build and push docker image
run: |
TAG=$(echo $GITHUB_REF | grep -o "[0-9][\.].*")
DOCKER_IMAGE=${{ secrets.DOCKER_REGISTRY }}/${DOCKER_IMAGE_NAME}:$TAG
echo "Docker image: ${DOCKER_IMAGE}"
docker login --username ${{ secrets.DOCKER_USERNAME }} --password ${{ secrets.DOCKER_PASSWORD }}
docker build -t $DOCKER_IMAGE .
docker push $DOCKER_IMAGE
内容の捕捉
ワークフローのトリガー - on.push.tags
Github Actionsのトリガーはonの後に書くことでトリガーとして登録されます
今回は、タグ v1.0.0 のような形式のタグがpushされた時にCIパイプラインが実行されるようにしています。
push以外にもPRのオープンなどの多くのGithub Actionsのトリガーがあります。
テスト - jobs.test
jobsという単位でジョブを作成していきます。
ここではテストのジョブを実行しています。
- ソースコードのチェックアウト
- Golangのバージョンを指定 (今回は1.15を指定)
- go modulesに従って依存パッケージをインストール (go mod download)
- ワーキングディレクトリ内のすべてのテストを実行 (go test -v ./...)
イメージのビルドとプッシュ - jobs.docker-build
jobsという単位でジョブを作成していきます。
ここではビルドとプッシュのジョブを実行しています。
認証情報はsecretを使っています。
secretに関しては、下のドキュメントが参考になります。
https://docs.github.com/ja/free-pro-team@latest/actions/reference/encrypted-secrets
- イメージtagをgit refから作成している (例 v1.0.0 -> 1.0.0)
- Dockerイメージ名を作成 (レジストリ名はsecret,イメージ名はenv,タグ名は1で作成したもの)
- dockerにログイン (usernameとpasswordはsecret)
- docker build (Dockerイメージ名は2で作成したもの)
- docker push