Dockerを使ったCICDパイプラインの構築(個人的備忘録)

##Gitの設定
```haml
1.任意の名前でリポジトリの作成
2.publicの設定
3.「create repository」をクリック
4.ユーザー設定
-# アプリのディレクトリで行う
% git config user.name ”ユーザー名”
% git config user.email “githubの登録メール”
-# 設定したユーザー名、emailが登録されていることを確認する。
% git config user.name
% git config user.email
5.リモートリポジトリの紐付け
% git remote add origin リポジトリのURL.git
-# 紐付けの確認
% git remote -v
```

## リポジトリにpushする
```haml
% git add .
% git commit -m ‘first commit’
% git push origin master
```
リポジトリにアプリがpushできているか確認する。

##Travis CIに登録
```
1.右上のSign inをクリック
2.「SIGN IN WITH GITHUB」をクリック
3.「Authorize travis-ci」をクリック
4.Githubの情報を入力
5.左の「+」をクリックする
6.任意のリポジトリをクリックし同期させる
7.上部の「Dashbord」をクリックし、「Active repositories」に選んだリポジトリがあることを確認する。
```
##.travis.ymlの作成
```
-# アプリのホームディレクトリに作成する
% vim .travis.yaml
```
```yaml:.travis.yaml
# sudo権限で実行
sudo: required
# dockerの使用宣言
services: docker

# コンテナの起動
before_install:
  - docker-compose up --build -d

script:
  # DBの準備
  - docker-compose exec —env 'RAILS_ENV=test' web rails db:create
  - docker-compose exec —env 'RAILS_ENV=test' web rails db:migrate
  # テストの実行
  - docker-compose exec —env 'RAILS_ENV=test' web rails test

Travi CIを動かすにはgithubにコードをpushする必要がある。

docker-compose.ymlの記述
version: '3'
# dockervolumeここにデータが保存される
volumes: 
  db-data:

services:
  web:
    build: .
    ports:
      - '3000:3000'
    volumes:
      - '.:/product-register'
# コンテナの環境変数設定、本来は直接パスワードを書いてはいけない。
    environment:
      - 'DATABASE_PASSWORD=postgres'
    tty: true
    stdin_open: true
# dbサービスが作られたら作成される
    depends_on:
      - db
# webからdbにアクセスできる
    links:
      - db
# postgresのコンテナ
  db:
    image: postgres
# ホストのdb-dataにデータを保管
    volumes:
      - 'db-data:/var/lib/postgresql/data'
    environment:
      - 'POSTGRES_USER=postgres'
      - 'POSTGRES_PASSWORD=postgres'
# localhost以外でpostgresを動かす場合に必要
      - 'POSTGRES_HOST_AUTH_METHOD=trust'
```

##gitへpushする
```
% git add .
% git commit -m ‘update travis and compose’
% git push origin master
```
ここでtravisのページで実際に実行されている状況が確認できる。

##Herokuの準備
```
1.ログインする
2.「create new app」をクリック
3.「APP name」に任意の名前をいれる。
4.「Create app」をクリック
5.作成されたら「Resources」をクリック。
6.「Add-ons」でpostgresで検索。「Heroku Postgres」を選択
7.「Provision」をクリック。
8.「Settings」をクリック、「Reveal Config Vars」をクリック。
9.config/master.keyの値をVALUEに入力する。
10.KEYの入力に「SECRET_KEY_BASE」と入力する。
11.「Add」をクリックする。
12.「Deploy」のタブをクリック。
13.「Deployment method」のGitHubをクリック
14.「Connect to GitHub」でリポジトリの名前を入力、「Search」をクリック
15.任意のリポジトリの「Connet」をクリック
16.「Automatic deploys」のWait for CI to pass before deploy(CIを通過してからデプロイ)にチェックする。
17.「Enable Automatic Deploy」をクリック
```


##databese.ymlの最下部をこのように設定する
```yaml:config/databese.yml
# You can use this database configuration with:
#
production:
  url: <%= ENV['DATABASE_URL'] %>
#
# production:
#   <<: *default
#   database: product-register_production
#   username: product-register
#   password: <%= ENV['PRODUCT-REGISTER_DATABASE_PASSWORD'] %>
```

##.travis.ymlの修正
```yml:.travis.yml
# sudo権限で実行
sudo: required
# dockerの使用宣言
services: docker

# コンテナの起動
before_install:
  - docker-compose up --build -d
# HerokuのDockerレジストリにログイン
  - docker login -u "$HEROKU_USERNAME" -p "$HEROKU_API_KEY" registry.heroku.com

script:
  # DBの準備
  - docker-compose exec --env 'RAILS_ENV=test' web rails db:create
  - docker-compose exec --env 'RAILS_ENV=test' web rails db:migrate
  # テストの実行
  - docker-compose exec --env 'RAILS_ENV=test' web rails test

deploy:
  provider: script
  script:
    docker build -t registry.heroku.com/$HEROKU_API_NAME/web -f Dockerfile.prod .;
    docker push registry.heroku.com/$HEROKU_API_NAME/web;
    heroku run --app $HEROKU_API_NAME rails db:migrate;
  on:
    branch: master
```

コメントアウトを入れると不具合が見られるので極力入れない方が良し。

##Travis CIに環境変数を設定する
```haml
-# Heroku-cliをインストール
% brew tap heroku/brew && brew install heroku
-# Tokenの取得
% heroku authorizations:create
```
1.Travis CIを開きリポジトリを開く。
2.「More options」の「Settings」をクリック
3.「Environment Variables」のNAMEに「HEROKU_USERNAME」、VALUEに「 _ 」を入力し、
「Add」をクリック。同じようにNAMEに「HEROKU_API_KEY」、VALUEには先ほどのTokenを入力、「Add」をクリック。また「HEROKU_API_NAME」にはherokuのリポジトリ名をいれる。

##Herokuに環境変数を設定する
1.Herokuを開き、任意のアプリをクリック
2.「Settings」タブをクリックし、「Reveal Config Vars」をクリック。
3.docker-compose.ymlに設定している、dbサービスのenvironmentの”DATABASE_PASSWORD=postgres”をKEYにDATABASE_PASSWORD、VALUEにpostgresとし「Add」をクリック。

##Dockerfile.prod(本番環境用)の作成
```
% vim Dockerfile.prod
```
```dockerfile:Dockerfile.prod
FROM ruby:2.5
RUN apt-get update && apt-get install -y \
    build-essential \
    libpq-dev \
    nodejs \
    postgresql-client \
    yarn
WORKDIR /product-register
COPY Gemfile Gemfile.lock /product-register/
RUN bundle install
# カレントディレクトリのコードを全てコンテナに移す
COPY . .
# railsサーバの起動
CMD [ "rails", "s"]
% git add .
% git commit -m ’add deploy code’
% git push origin master
```

##実際の開発フロー
1.ブランチの作成 % git checkout -b hoge
2.作業を行う
3.変更したファイルをadd % git add .
4.変更をコミットする % git commit -m ’messege’
5.ブランチにpush % git push origin huge
(Travis CIが動く)
6.プルリクの作成
7.プルリクをmergeする(Travis CI完了後)
8.Travis CIが動く
9.Herokuにデプロイされる。