CircleCI 2.0でDockerイメージをビルドしてデプロイとかプッシュするための、わりと簡素な構成のconfig.yml

 CircleCIでCIをする。Dockerやるならそのアウトプットはコンテナで出てくる。CircleCI 2.0でビルド、テスト、デプロイとステージで環境がわかれてる。どうやってビルドしたコンテナを持ち越せばいいんだと。
 ステージ間でディレクトリを共有する仕組みと、Dockerのほうでイメージを単体ファイル化、およびそのロードをする仕組みを使って、ステージ間でのDockerイメージ持ち越しをやってみた。わりと最小構成になるように書いた。
https://circleci.com/gh/hMatoba/PlayCircleCi/46

 
config.yml

version: 2.0
jobs:
build:
docker:
- image: alpine

working_directory: ~/repo

steps:
- run: mkdir -p /tmp/workspace/docker
- run:
name: install docker
command: |
apk update
apk add docker
- checkout

# ↓コンテナの中でコンテナを使えないことを考えると、リモートのDockerを使うのに必須っぽいおまじない
- setup_remote_docker:
docker_layer_caching: true

- run:
name: build
command: |
docker pull alpine
docker save alpine > /tmp/workspace/docker/alpine-image.tar
# ↑Dockerイメージのファイル化
# 持ち越したいファイルをディレクトリごとアップ
- persist_to_workspace:
root: /tmp/workspace
paths:
- ./


deploy:
docker:
- image: alpine

working_directory: ~/repo
steps:
- run:
name: install
command: |
apk update
apk add docker
apk add ca-certificates # ↓でのattachに必要
- run: mkdir -p /tmp/workspace
# ↑で作業ファイルを置くディレクトリを作って、↓で持ち越されたディレクトリをアタッチしている
- attach_workspace:
at: /tmp/workspace

- setup_remote_docker:
docker_layer_caching: true

- run:
name: deploy
command: |
docker images
docker load < /tmp/workspace/docker/alpine-image.tar
docker images
workflows:
version: 2
build-and-deploy:
jobs:
- build:
filters:
branches:
only: master

- deploy:
requires:
- build
filters:
branches:
only: master
comment: 0