0. 前提
- Dockerで構築したRailsアプリケーションをHerokuでデプロイしていること
手動デプロイを毎回行うのが面倒なので、CI/CDを導入しデプロイを自動化する
CIとは
- 継続的インテグレーション(Continuous Integration)
- ソースコードを変更してGitHubにアップする度にビルドやテストを自動実行し、コードの品質を一定に保つ方法
CDとは
- 継続的デリバリー(Continuous Delivery)
- テストを通った変更→レビューOK→マージされたらデプロイを自動的に行う仕組み
CircleCIとは
- CI/CDを構築するためのサービス
- ビルド・テスト・デプロイをCloud上で行ってくれる
1. コードをGitHubにアップする
- Git
- コードはGitでバージョンを管理
- 元に戻せる
- 変更履歴が分かる
- コードはGitでバージョンを管理
- GitHub
- Gitで管理しているソースコードをオンライン上で共有するためのサービス
GitHub上でリポジトリ作成
- GitHubのYour Repositoriesにアクセス→newボタン押下
- Ownerを選択し、Repository nameにはここまでで作ってきたHerokuのアプリケーション名を入力
- Publicを選択し、Create Repositoryボタン押下
Gitでコードを管理
$ cd ~/Documents/rails_docker/ # アプリケーションディレクトリに移動
$ git init # Gitの管理下(リポジトリ)におくコマンド
リポジトリ
・・・ディレクトリやファイルの状態を記録する場所
.gitignore
ファイルを修正
-
.gitignore
・・・バージョン管理する必要の無いファイルをGitのバージョン管理下から外すことができる- データベースの接続先情報など、GitHubにアップすると情報漏洩の危険性があるもの
-
bundle install
でダウンロードしてくるファイルのコードも変更履歴を管理する必要がない -
.gitignore
ファイルに管理不要なファイルを指定しておくことで、そのファイルをバージョン管理から外すことができる -
.gitignore
ファイルはRailsがデフォルトで用意してくれている
1. .gitattributes
と.gitignore
の2ファイルが現在srcファイル内にあるが、プロジェクトのディレクトリ直下に移動させる
terminal $ mv src/.gitignore . $ mv src/.gitattributes .
2. .git
を削除
-
git init
をすると作られるが、こいつがsrcディレクトリ配下にもあり二重管理でエラーになってしまうので.git
ファイルを削除する
$ rm -rf src/.git/
-
-rf
・・・指定したディレクトリ以下全部のファイルを消す
3. ファイルを修正
- すべてにsrcを付ける
- srcディレクトリに入ってしまっている為、ディレクトリの構造を合わせる
-
src/db/mysql_data
も管理下から外す- mysqlの実行中のデータで、ソースコードとは関係がないファイルのため
.gitignore
に追記する -
src/db/mysql_data
はdocker-compose
ファイルのvolumesで指定している
- mysqlの実行中のデータで、ソースコードとは関係がないファイルのため
src/.bundle
src/log/*
src/tmp/*
!src/log/.keep
!src/tmp/.keep
src/tmp/pids/*
!src/tmp/pids/
!src/tmp/pids/.keep
src/storage/*
!src/storage/.keep
src/public/assets
src/.byebug_history
src/config/master.key
src/public/packs
src/public/packs-test
src/node_modules
src/yarn-error.log
src/yarn-debug.log*
src/.yarn-integrity
4. add, commit, push
$ git status
$ git add .
$ git commit -m "first commit"
$ git branch -M main
$ git remote add origin https://github.com/Ryo-exid/rails-docker-gucci.git
$ git push -u origin main
pushの際にUsernameとPasswordの入力を求められる場合、Passwordにはアクセストークンを入力すよう注意する
GitHubへのアップ完了!👏
2. CI
テストコードを記載
require "test_helper"
class HomesControllerTest < ActionDispatch::IntegrationTest
test "the truth" do
assert true
end
end
CircleCIに登録
「GitHubで登録」を選ぶ
- プロジェクトの登録も一緒に行う
configを設定
- プロジェクトディレクトリ直下に
.circleci
ディレクトリを作成し、その配下にconfig.yml
を作成
version: 2.1
orbs:
ruby: circleci/ruby@1.1.2
heroku: circleci/heroku@1.2.3
jobs:
build:
docker:
- image: circleci/ruby:2.7
working_directory: ~/rails-docker-gucci/src
steps:
- checkout:
path: ~/rails-docker-gucci
- ruby/install-deps
test:
docker:
- image: circleci/ruby:2.7
- image: circleci/mysql:5.5
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: app_test
MYSQL_USER: root
environment:
BUNDLE_JOBS: "3"
BUNDLE_RETRY: "3"
APP_DATABASE_HOST: "127.0.0.1"
RAILS_ENV: test
working_directory: ~/rails-docker-gucci/src
steps:
- checkout:
path: ~/rails-docker-gucci
- ruby/install-deps
- run:
name: Database setup
command: bundle exec rails db:migrate
- run:
name: test
command: bundle exec rake test
workflows:
version: 2
build_and_test:
jobs:
- build
- test:
requires:
- build
-
解説
-
orbs:
は事前に定義したjobs:
をシェアできるもの - 今回は
build:
とtest:
というjobs:
を定義 -
workflows:
で今回build_test_and_deploy:
というものを作っている - 構造としては
workflows:
が中心で、workflows:
で定義された順番にjobs:
の処理を行う
-
database.yml
のhostの値を書き換える
- CircleCIだとdocker-composeを使っていない為、
'db'
という指定の仕方ができない- 環境変数のAPP_DATABASE_HOSTに値がsetされていたらそのままhostの値として使い、なかった時はdbを使用
- ローカルではdocker-composeを使用する為、dbを取るようにしている
test:
<<: *default
database: app_test
host: <%= ENV.fetch("APP_DATABASE_HOST") { 'db' } %>
環境変数を設定
- configディレクトリ配下に
master.key
があるのでそのファイルの中身の値を環境変数として設定- ソースコードを動かす上で必要な値が記されているが、流出するとまずいため
.gitignore
に記載されている
- ソースコードを動かす上で必要な値が記されているが、流出するとまずいため
$ heroku config:add RAILS_MASTER_KEY='master.keyから値をコピペ' -a アプリ名
GitHubにプッシュ
$ git switch -c ci
$ git branch # ciブランチにいることを確認
$ git add .
$ git commit -m "CircleCIが動くように、configファイルを設定"
$ git push origin ci
$ git switch main
$ git pull origin main
🎉🎉🎉pushされる度に自動テストが行われるCIが完成!!🎉🎉🎉
3. CD
トピックブランチ作成&移動
$ git switch -c cd
$ git branch -d ci # ciブランチはもう使わないので削除
$ git branch # cdにいること
configを修正
version: 2.1
orbs:
ruby: circleci/ruby@1.1.2
heroku: circleci/heroku@1.2.3
jobs:
build:
docker:
- image: cimg/ruby:2.7.5
working_directory: ~/rails-docker-gucci/src
steps:
- checkout:
path: ~/rails-docker-gucci
- ruby/install-deps
test:
docker:
- image: cimg/ruby:2.7.5
- image: circleci/mysql:5.5
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: app_test
MYSQL_USER: root
environment:
BUNDLE_JOBS: "3"
BUNDLE_RETRY: "3"
APP_DATABASE_HOST: "127.0.0.1"
RAILS_ENV: test
working_directory: ~/rails-docker-gucci/src
steps:
- checkout:
path: ~/rails-docker-gucci
- ruby/install-deps
- run:
name: Database setup
command: bundle exec rails db:migrate
- run:
name: test
command: bundle exec rake test
deploy:
docker:
- image: circleci/ruby:2.7.5
steps:
- checkout
- setup_remote_docker:
version: 19.03.13
- heroku/install
- run:
name: heroku login
command: heroku container:login
- run:
name: push docker image
command: heroku container:push web -a $HEROKU_APP_NAME
- run:
name: release docker image
command: heroku container:release web -a $HEROKU_APP_NAME
- run:
name: database setup
command: heroku run bundle exec rake db:migrate RAILS_ENV=production -a $HEROKU_APP_NAME
workflows:
version: 2
build_test_and_deploy:
jobs:
- build
- test:
requires:
- build
- deploy:
requires:
- test
filters:
branches:
only: main
-
orbs:
にheroku: circleci/heroku@1.2.3
を追加 -
workflows
にdeploy:
を追加 -
jobs:
にdeploy
を追加
環境変数を設定
- circleciにアクセス
Projects
→rails-docker-gucci(今回のプロジェクト)
→Project Settings
→Environment Variables
→Add Environment Variable
- config.ymlで使っていた
HEROKU_APP_NAME
を設定
- 動かす上でもうひとつ
HEROKU_API_KEY
も設定 - Name:HEROKU_API_KEY
- Value:herokuにログイン→
Account Settings
→少し下にスクロールし、API Key
をコピーしてValueに貼り付け
- config.ymlで使っていた
ローカルで起動するかどうか確認
$ docker-compose up -d
-
http://localhost:3000/
- 変更が上手く反映されていることを確認
GitHubにプッシュ→プルリク作成→マージ
$ git add .
$ git commit -m "CD用の設定を追加"
$ git push origin cd
CircleCI上記ページ上のRerun workflow from start
(こんな感じのボタン↩️)を押すともう一度build, test, deployが行われる
CircleCIでdeployがSuccessになってもHerokuへの反映には時間がかかる
その際はログ出力コマンドで状況を確認することも可能
- ログ出力コマンド
$ heroku logs -t -a アプリ名
ブラウザから確認
$ heroku open -a アプリ名
🎉🎉🎉自動テスト&自動デプロイ完了🎉🎉🎉