LoginSignup
15
15

More than 3 years have passed since last update.

GitHub Actions + CircleCI でDocker HubへDockerイメージを登録、定期的にre-buildする

Last updated at Posted at 2020-05-10

GitHub Actions + CircleCIを利用してDocker HubへDockerイメージを登録、定期的にrebuildする方法を解説します。

実際に動いているサンプルコードはこちらで確認出来ます。

DockerイメージのビルドのCIを行う

CI用途のためリポジトリにpushがあったら全てのブランチでCIが実行されるように設定します。

スクリーンショット 2020-05-10 14.53.14.png

利用する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のログインパスワード

スクリーンショット 2020-05-10 1.05.17.png

ディレクトリ構成

それぞれの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へイメージを登録する処理部分

.github/workflows/docker-build.yml
---
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

.github/workflows/docker-build.yml
---
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

.github/workflows/hadolint.yml
---
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

.github/workflows/hadolint.yml
---
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

.github/workflows/trailing-whitespace.yml
---
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

.github/workflows/yamllint.yml
---
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
.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はどのブランチでも実行されます

スクリーンショット 2020-05-10 14.49.38.png

CircleCIの設定

管理画面から「Project settings」→「Environment Variables」→「Add Variables」の順にクリックしDocker Hubのユーザー名、ログインパスワードを設定します。

ラベル名 説明
Name DOCKER_LOGIN Docker Hubのログインユーザー名
Value DOCKER_PASSWORD Docker Hubのログインパスワード

スクリーンショット 2020-05-10 13.17.14.png
スクリーンショット 2020-05-10 14.01.16.png

スクリーンショット 2020-05-10 13.21.29.png

Orbを利用する

CircleCI Orb Registry - circleci/docker(CircleCI公式Orb)

Dockerイメージを定期ビルドするCircleCIのconfig.yml

.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

.circleci/config.yml
---
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']
15
15
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
15