GitHub Actions + CircleCIを利用してDocker HubへDockerイメージを登録、定期的にrebuildする方法を解説します。
実際に動いているサンプルコードはこちらで確認出来ます。
DockerイメージのビルドのCIを行う
CI用途のためリポジトリにpushがあったら全てのブランチでCIが実行されるように設定します。
利用するAction
Build and push Docker images · Actions · GitHub Marketplace
DockerfileからDockerイメージのビルドとDocker HubへDockerイメージの登録を行うAction(Docker Hub公式)
Hadolint Action · Actions · GitHub Marketplace
Hadolint1(Dockerfileのlint処理)を実行するAction
ibiqlik/action-yamllint: GitHub Action - Yaml Lint
yamllint2を実行するAction
Find Trailing Whitespace · Actions · GitHub Marketplace
末尾の空白を検知するAction
GitHub Actionsの設定
「Setting」→「Secrets」→「Add a new secret」の順にクリックし「DOCKER_UERNAME」にDocker Hubのログインユーザー名、「DOCKER_PASSWORD」にDocker Hubのログインパスワードにを設定します。
ラベル名 | 値 | 説明 |
---|---|---|
Name | DOCKER_UERNAME | Docker Hubのログインユーザー名 |
Value | DOCKER_PASSWORD | Docker Hubのログインパスワード |
ディレクトリ構成
それぞれのActionファイルを別々に配置する事でCIが並列に実行されます。
├── .circleci
│ └── config.yml
├── .git/
├── .github
│ └── workflows
│ ├── docker-build.yml
│ ├── hadolint.yml
│ ├── trailing-whitespace.yml
│ └── yamllint.yml
├── .yamllint
├── Dockerfile
└── README.md
Matrix build利用時
├── .circleci
│ └── config.yml
├── .git/
├── .github
│ └── workflows
│ ├── docker-build.yml
│ ├── hadolint.yml
│ ├── trailing-whitespace.yml
│ └── yamllint.yml
├── .yamllint
├── README.md
├── centos7
│ └── Dockerfile
└── centos8
└── Dockerfile
GitHub Actionsを実行するファイル
DockerイメージをDockerfileからビルド、Docker Hubへイメージを登録する処理部分
---
name: docker build
on: push
jobs:
check:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Register docker image
uses: docker/build-push-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
repository: tomonorimatsumura/ansible-test
tags: latest
Job matrixを利用した場合3
---
name: docker build
on: push
jobs:
check:
runs-on: ubuntu-latest
strategy:
matrix:
base-image: [centos7, centos8]
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Register docker image
uses: docker/build-push-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
repository: tomonorimatsumura/ansible-test
dockerfile: ${{ matrix.base-image }}/Dockerfile
tags: ${{ matrix.base-image }}-latest
Hadolintを実行しDockerfileの妥当性を調べる処理部分4
---
name: hadolint
on: push
jobs:
check:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Dockerfile lint
uses: brpaz/hadolint-action@eb9b96b
Job matrixを利用した場合3
---
name: hadolint
on: push
jobs:
check:
runs-on: ubuntu-latest
strategy:
matrix:
base-image: [centos7, centos8]
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Dockerfile lint
uses: brpaz/hadolint-action@eb9b96b
with:
dockerfile: ${{ matrix.base-image }}/Dockerfile
末尾の空白を調べる処理部分4
---
name: trailing whitespace
on: push
jobs:
execute:
name: Find Trailing Whitespace
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: harupy/find-trailing-whitespace@56310d7
yamllintを実行しリポジトリ内のYAMLファイルの形式の妥当性を調べる処理部分4
---
name: yamllint
on: push
jobs:
lintAllTheThings:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: yaml-lint
uses: ibiqlik/action-yamllint@665205c
with:
config_file: .yamllint
---
rules:
braces: enable
brackets: enable
colons: enable
commas: enable
comments:
level: error
comments-indentation:
level: error
document-end: disable
document-start:
level: error
empty-lines: enable
empty-values: disable
hyphens: enable
indentation: enable
key-duplicates: enable
key-ordering: disable
line-length: enable
new-line-at-end-of-file: enable
new-lines: enable
octal-values: disable
quoted-strings: disable
trailing-spaces: enable
truthy: disable
---
Dockerイメージを定期ビルドする
GitHub Actionsの制限で定期実行機能(いわゆるcron)は デフォルトブランチでしか動作しません5。 ブランチ戦略に大きな制約が課せられてしまうため定期ビルドにはCircleCIを利用します。 CircleCIのcronはどのブランチでも実行されます。
CircleCIの設定
管理画面から「Project settings」→「Environment Variables」→「Add Variables」の順にクリックしDocker Hubのユーザー名、ログインパスワードを設定します。
ラベル名 | 値 | 説明 |
---|---|---|
Name | DOCKER_LOGIN | Docker Hubのログインユーザー名 |
Value | DOCKER_PASSWORD | Docker Hubのログインパスワード |
Orbを利用する
CircleCI Orb Registry - circleci/docker(CircleCI公式Orb)
Dockerイメージを定期ビルドするCircleCIのconfig.yml
jobs:
build-and-push:
executor: docker/docker
steps:
- setup_remote_docker
- checkout
- docker/check
- docker/build:
# Docker HubのRepositoryを設定する
image: tomonorimatsumura/ansible-test
# 未設定だとCircleCIがランダムな英数文字列を付与する
tag: latest
- docker/push:
# Docker HubのRepositoryを設定する
image: tomonorimatsumura/ansible-test
# 未設定だとCircleCIがランダムな英数文字列を付与する
tag: latest
orbs:
docker: circleci/docker@1.2.1
version: 2.1
workflows:
version: 2
build:
triggers:
- schedule:
# 日本時間で毎日夜9時に実行される
cron: "0 12 * * *"
filters:
branches:
only:
# masterブランチでのみcronが実行される
- master
jobs:
- build-and-push
matrix jobsを利用した場合6
---
jobs:
build-and-push:
executor: docker/docker
parameters:
base-image:
type: string
steps:
- setup_remote_docker
- checkout
- docker/check
- docker/build:
image: tomonorimatsumura/ansible-test
path: << parameters.base-image >>
tag: << parameters.base-image >>-latest
- docker/push:
image: tomonorimatsumura/ansible-test
tag: << parameters.base-image >>-latest
orbs:
docker: circleci/docker@1.2.1
version: 2.1
workflows:
version: 2
build:
triggers:
- schedule:
cron: "0 12 * * *"
filters:
branches:
only:
- master
jobs:
- build-and-push:
matrix:
parameters:
base-image: ['centos7', 'centos8']
-
hadolint/hadolint: Dockerfile linter, validate inline bash, written in Haskell | GitHub ↩
-
Job matrix Workflow syntax for GitHub Actions - GitHub Help ↩ ↩2
-
公式Action以外を利用する場合は必ずコミットSHAを指定する Github Actions 4ヶ月使ってみてわかったことまとめ - Qiita ↩ ↩2 ↩3
-
"Scheduled workflows run on the latest commit on the default or base branch." Workflow syntax for GitHub Actions - GitHub Help ↩