Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
GitLab + Dokku で作る CI/CD 環境
Search
Kazuhiro NISHIYAMA
July 29, 2017
Technology
2
400
GitLab + Dokku で作る CI/CD 環境
GitLab と Dokku を組み合わせて CI/CD 環境を作成する例を紹介します。
Kazuhiro NISHIYAMA
July 29, 2017
Tweet
Share
More Decks by Kazuhiro NISHIYAMA
See All by Kazuhiro NISHIYAMA
Rubyの日本語リファレンスマニュアルの現在と未来
znz
0
15
devise-two-factorを4.xから5.xに上げた話
znz
0
52
docs.ruby-lang.org/ja/ の生成方法を変えた
znz
0
39
Ubuntuのriscv64版をqemuで動かした
znz
0
40
lilo.linux.or.jpをbusterからbullseyeに上げた
znz
0
47
小規模個人アプリをRails 7.xにバージョンアップした話
znz
0
33
Ruby リファレンスマニュアル改善計画 2022 進捗報告
znz
0
98
Rubyist Magazine Reboot
znz
0
130
History of Japanese Ruby reference manual, and future
znz
0
1.6k
Other Decks in Technology
See All in Technology
初心者向けAWS Securityの勉強会mini Security-JAWSを9ヶ月ぐらい実施してきての近況
cmusudakeisuke
0
120
ドメインの本質を掴む / Get the essence of the domain
sinsoku
2
150
iOSチームとAndroidチームでブランチ運用が違ったので整理してます
sansantech
PRO
0
130
個人でもIAM Identity Centerを使おう!(アクセス管理編)
ryder472
3
200
これまでの計測・開発・デプロイ方法全部見せます! / Findy ISUCON 2024-11-14
tohutohu
3
370
AWS Media Services 最新サービスアップデート 2024
eijikominami
0
190
社内で最大の技術的負債のリファクタリングに取り組んだお話し
kidooonn
1
550
Lambda10周年!Lambdaは何をもたらしたか
smt7174
2
110
【令和最新版】AWS Direct Connectと愉快なGWたちのおさらい
minorun365
PRO
5
750
Terraform未経験の御様に対してどの ように導⼊を進めていったか
tkikuchi
2
430
ドメイン名の終活について - JPAAWG 7th -
mikit
33
20k
Oracle Cloud Infrastructureデータベース・クラウド:各バージョンのサポート期間
oracle4engineer
PRO
28
12k
Featured
See All Featured
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
42
9.2k
Designing the Hi-DPI Web
ddemaree
280
34k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
6.9k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Scaling GitHub
holman
458
140k
Designing Experiences People Love
moore
138
23k
How STYLIGHT went responsive
nonsquared
95
5.2k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
229
52k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
Building Better People: How to give real-time feedback that sticks.
wjessup
364
19k
Transcript
GitLab + Dokku で作る CI/ CD 環境 Kazuhiro NISHIYAMA 第78回
Ruby関西 勉強会 2017/07/29 Powered by Rabbit 2.2.0
自己紹介 西山和広 id:znz (github, twitter など) Ruby コミッター 1/25
GitLab + Dokku GitLab GitLab CI Dokku (+ Heroku) 2/25
GitLab とは? 簡単にいえば OSS の GitHub クローンのよ うなもの Git ホスティング
Merge Request (GitHub の Pull Request) Issue 管理など色々 GitHub にない機能もある https://about.gitlab.com/features/ 3/25
GitLab CI とは? Continuous Integration/Continuous Delivery (CI/CD) Jenkins のジョブを実行しないマスターのよ うなものが
GitLab に組み込み GitLab Runner (Jenkins の slave のようなも の) を動かすマシンが別途必要 repository の .gitlab-ci.yml で設定 (.travis.yml などと同様) https://about.gitlab.com/features/gitlab-ci-cd/ 4/25
GitLab Runner とは? マシン上で直接実行する (Shell executor) Docker の中で実行する (Docker executor)
これを使用 その他 https://docs.gitlab.com/runner/ 5/25
Dokku とは? Docker を使った OSS のミニ Heroku (PaaS) ssh 経由の
git で deploy できる http://dokku.viewdocs.io/dokku/ 6/25
組み合わせた状態 ブランチに push → Dokku に Review App を deploy
Merge Request をマージ → Review App を 停止 master に push → Staging に deploy 確認後、クリックで Production に deploy https://about.gitlab.com/features/review- apps/ 7/25
deploy 例 https://docs.gitlab.com/ce/ci/examples/ deployment/README.html では dpl gem で heroku に
deploy する例がある Dokku との組み合わせは独自研究 8/25
組み合わせ方 .gitlab-ci.yml で設定する deploy 用の ssh 秘密鍵などは secret variables に設定
9/25
.gitlab-ci.yml の設定例 使用する docker image を指定 image: ruby:2.3.3 Rails アプリなので
https://hub.docker.com/r/_/ ruby/ を使用 10/25
cache per-branch caching: cache: key: "$CI_COMMIT_REF_NAME" untracked: true https://docs.gitlab.com/ce/ci/yaml/#cache-key 11/25
テスト用 variables services で指定する postgres image で使用 (DATABASE_URL は Rails
で使用) variables: # for test POSTGRES_DB: dbname POSTGRES_USER: dbuser POSTGRES_PASSWORD: dbpass DATABASE_URL: "postgres://dbuser:dbpass@postgres:5432/dbname" https://hub.docker.com/r/_/postgres/ 12/25
deploy 用 variables # for deploy DOKKU: ssh dokku@$DOKKU_HOST APP_NAME:
$CI_ENVIRONMENT_SLUG DB_NAME: $CI_ENVIRONMENT_SLUG-database DOKKU はあとで短く表記するため APP_NAME は Dokku でのアプリ名 (サブド メイン名) DB_NAME はデータベースコンテナ名 (内部 用なので識別できれば何でも良い) 13/25
stages stages: - test - review - staging - production
ブランチに push → test → review master に push → test → staging → production (後述の例 (1)) master に push → test → staging / タグを push → test → production (後述の例 (2)) 14/25
before_script before_script: - 'apt-get update -qq && apt-get -o dir::cache::archives="/cache/apt"
install -y -qq sqlite3 libsqlite3-dev nodejs' - gem install bundler --no-ri --no-rdoc - bundle install --jobs $(nproc) --path=/cache/bundler - ln -nfs .test.env .env 開発環境に合わせてテスト環境でも sqlite3 が必要 js runtime も必要なので nodejs インストール時に /cache を使用 dotenv (dotenv-rails) でテスト用環境変数設 定 15/25
.before_ssh .before_ssh: &before_ssh # https://docs.gitlab.com/ce/ci/ssh_keys/README.html - 'which ssh-agent || (
apt-get update -y && apt-get -o dir::cache::archives="/cache/apt" install -y openssh-client )' - eval $(ssh-agent -s) - ssh-add <(echo "$SSH_PRIVATE_KEY") - mkdir -p ~/.ssh # Set `ssh-keyscan $DOKKU_HOST` to SSH_SERVER_HOSTKEYS - '[[ -f /.dockerenv ]] && echo "$SSH_SERVER_HOSTKEYS" > ~/.ssh/known_hosts' - '[[ -f /.dockerenv ]] && echo "$SSH_CONFIG" > ~/.ssh/config' .で始まるキーは後で参照する用途に使える Dokku や Heroku に ssh で git push するとき の前処理 secret variables から ssh-agent に秘密鍵と known_hosts と ssh confg を設定 16/25
.deploy_script .deploy_script: &deploy_script - $DOKKU apps:create $APP_NAME || echo $?
# require `sudo dokku plugin:install https://github.com/dokku/dokku-postgres` - $DOKKU postgres:create $DB_NAME || echo $? - $DOKKU postgres:link $DB_NAME $APP_NAME || echo $? - $DOKKU config:set --no-restart $APP_NAME TZ=Asia/Tokyo RAILS_SERVE_STATIC_FILES=1 NO_FORCE_SSL=1 RACK_DEV_MARK_ENV=review - git push dokku@$DOKKU_HOST:$APP_NAME HEAD:refs/heads/master - $DOKKU -tt run $APP_NAME bundle exec rake db:seed app と db がなければ作成 TZ などの環境変数設定 HEAD:refs/heads/master という指定で push -tt で強制的に tty を確保して rake db:seed 17/25
rake test rake: stage: test services: - postgres:latest script: -
bundle exec rake db:setup RAILS_ENV=test - bundle exec rake services に指定した postgres image とリン クした状態で実行 データベースの初期設定をしてテスト実行 18/25
staging deploy (1) staging: stage: staging variables: APP_NAME: hello-app-staging.example.jp before_script:
*before_ssh script: - git push dokku@$PRODUCTION_DOKKU_HOST:$APP_NAME HEAD:refs/heads/master environment: name: staging url: https://hello-app-staging.example.jp/ only: - master before_script は sqlite3 のインストールなど の代わりに ssh 設定 Pipelines の Environments からリンク master に push したときのみ 19/25
production deploy (1) production: stage: production variables: APP_NAME: hello-app.example.jp before_script:
*before_ssh script: - git push dokku@$PRODUCTION_DOKKU_HOST:$APP_NAME HEAD:refs/heads/master environment: name: production url: https://hello-app.example.jp/ when: manual only: - master staging の後に手動実行 master に push したときのみ 20/25
staging deploy (2) staging: stage: staging variables: APP_NAME: hello-app-staging script:
- gem install dpl - dpl --provider=heroku --app=$APP_NAME --api-key=$HEROKU_STAGING_API_KEY environment: name: staging url: https://$APP_NAME.herokuapp.com/ only: - master master に push したときのみ dpl で heroku に deploy 21/25
production deploy (2) production: stage: production variables: APP_NAME: hello-app script:
- gem install dpl - dpl --provider=heroku --app=$APP_NAME --api-key=$HEROKU_PRODUCTION_API_KEY environment: name: production url: https://$APP_NAME.herokuapp.com/ only: - tags タグを push したときのみ dpl で heroku に deploy 22/25
review deploy review: stage: review before_script: *before_ssh script: *deploy_script environment:
name: review/$CI_COMMIT_REF_NAME url: http://$CI_ENVIRONMENT_SLUG.$DOKKU_DOMAIN on_stop: stop_review only: - branches except: - master review 用の Dokku アプリを deploy master 以外のブランチに push したときのみ 23/25
stop review stop_review: stage: review variables: GIT_STRATEGY: none before_script: *before_ssh
script: - $DOKKU apps:destroy $CI_ENVIRONMENT_SLUG --force || echo $? - $DOKKU postgres:destroy $CI_ENVIRONMENT_SLUG-database --force || echo $? environment: name: review/$CI_COMMIT_REF_NAME action: stop when: manual only: - branches except: - master postgres は使用中だとエラーになるので apps から停止 リンクも消える 24/25
まとめ GitLab と Dokku を組み合わせて CI/CD 環境 を作成する例を紹介 環境構築に使っている Ansible
Playbook は https://github.com/znz/ansible-playbook- gitlab-dokku ブログ記事は http://blog.n-z.jp/blog/ categories/gitlab/ 25/25 Powered by Rabbit 2.2.0