Afternoon Log

日々のことや、技術的な備忘録を吐き出していくつもり

CircleCIでdocker buildするまで

5月に引っ越しが終わって、
それから自分のサイト構築を進めてました。
とりあえずベース部分まで出来たので一旦書き出しておこうと思います。
ブログ、全然書いてませんでしたからね……。

ただ、全部書くと量が多いので3つに分けながら進めて行きます。

  1. CircleCI で docker build するまで <- イマココ
  2. CircleCI からECRへ自動push
  3. CircleCI からECSへ自動デプロイ

要はCI/CD環境を用意したって話です。
そういえばもうCircleCIって書いても、バージョン2の方で良いですよね。

使用したGitリポジトリはここ
github.com

DockerFileの用意

dockerの環境構築が本題ではないのでそこら辺は割愛して、
使用するDockerfileがこちら。

FROM node:12-stretch

# install nginx
RUN curl -fsSL https://nginx.org/keys/nginx_signing.key | apt-key add -
RUN echo 'deb http://nginx.org/packages/debian/ stretch nginx\n\
deb-src http://nginx.org/packages/debian/ stretch nginx' > /etc/apt/sources.list.d/nginx.list
RUN apt update && apt remove -y nginx && apt install -y nginx && apt clean

COPY ./file/mu-web.conf /etc/nginx/conf.d/

EXPOSE 80

CMD /usr/sbin/nginx -g "daemon off;"

1行目のベースとするDocker ImageはCircleCIに存在するNode.jsのイメージを利用します。
タグは Node.jsのバージョン-Debianのコードネーム になっています。

Pre-Built CircleCI Docker Images - CircleCI

因みに、利用可能なイメージのタグ一覧はここ

後はnginxをインストールして、設定ファイルを配置。
最後にnginxをデーモンとしてではなく、フォアグランドで起動することでコンテナが終了しないようにしています。

CircleCIの設定

えー、流石にもう最初にどうUIポチポチして連携したか覚えてない……。
確かどのリポジトリと連携するかをやったと思います。
そして、対象リポジトリ.circleci/config.yml を配置することでジョブが実行されていきます。
ファイルペタペタで申し訳ないが、作成した .circleci/config.yml はこれ。

version: 2
jobs:
  build:
    docker:
      - image: circleci/node:12-stretch
    steps:
      - checkout
      - setup_remote_docker
      - run:
          name: Docker image build 
          command: docker build -t mu-web .
      - run:
          name: Check docker run
          command: |
            docker run -d --name mu-web-container mu-web
            docker exec mu-web-container curl --retry 10 --retry-connrefused http://localhost/status | grep 'Connection OK'
      - run:
          name: Save docker image
          command: docker image save mu-web > ./mu-web.tar
      - persist_to_workspace:
          root: .
          paths:
            - ./mu-web.tar
workflows:
  version: 2
  build:
    jobs:
      - build

jobs で実行するジョブを定義していきます。
今回だと build というジョブを定義しています。
そしてジョブでは、どのdockerイメージを使って、何を実行していくかを定義しています。
stepsの中に、checkout, setup_remote_docker というのがありますが、
これはCircleCIがビルド毎にリモート環境を構築するために必要なコマンドです。

その後に、docker buildしています。
さて、タイトルでbuildするまでとか言いましたが、その後に2ステップ挟んでいます。

1つ目はビルドしたイメージで想定した通りに起動しているかの確認です。
正直、別に入れなくても良かったかなと思っている代物です。
nginxの設定で以下を追加しておくと、localhostでの接続の際に文字列を返してくれます。
そのチェックをして、nginx動いているなーって確認してます。

server {
  listen 127.0.0.1:80;

  location /status {
    return 200 'Connection OK';
  }
}

2つ目はイメージを保存しています。
これは次回のECRにpushするイメージをまた生成させる必要がないので
既にビルドしたイメージを保存して流用しようとしたものです。
先ほどジョブごとに環境が~みたいなことを書きましたが、
persist_to_workspaceの設定をしてあげるとワークフロー間で対象を共有できます。
なので、そこに作成したtarファイルを追加しておきます。

そうして、jobsの定義が済んだら
ジョブをどう繋げるかのworkflowsの設定をします。
ここでは単純にbuildジョブを実行するだけですが、他にも実行に制限を掛ける機構が備わっています。




これはここまでです。
次回、ECRにpushするまでを書きたいと思います。
思いますが、一体どれほど覚えているかな……。そんなにないはず……。