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
450
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
riscv64.rubyci.org internal
znz
0
7
Rubyの日本語リファレンスマニュアルの現在と未来
znz
0
51
devise-two-factorを4.xから5.xに上げた話
znz
0
200
docs.ruby-lang.org/ja/ の生成方法を変えた
znz
0
71
Ubuntuのriscv64版をqemuで動かした
znz
0
88
lilo.linux.or.jpをbusterからbullseyeに上げた
znz
0
90
小規模個人アプリをRails 7.xにバージョンアップした話
znz
0
78
Ruby リファレンスマニュアル改善計画 2022 進捗報告
znz
0
140
Rubyist Magazine Reboot
znz
0
200
Other Decks in Technology
See All in Technology
キャディでのApache Iceberg, Trino採用事例 -Apache Iceberg and Trino Usecase in CADDi--
caddi_eng
0
140
脅威をモデリングしてMCPのセキュリティ対策を考えよう
flatt_security
4
1.7k
開発効率と信頼性を両立する Ubieのプラットフォームエンジニアリング
teru0x1
0
140
Kotlinで学ぶ 代数的データ型
ysknsid25
5
1.1k
Introduction to Sansan for Engineers / エンジニア向け会社紹介
sansan33
PRO
5
38k
自分を理解するAI時代の準備 〜マイプロフィールMCPの実装〜
edo_m18
0
110
成立するElixirの再束縛(再代入)可という選択
kubell_hr
0
280
In Praise of "Normal" Engineers (LDX3)
charity
2
940
ゆるSRE #11 LT
okaru
1
630
AIエージェントの継続的改善のためオブザーバビリティ
pharma_x_tech
6
1.2k
Amplifyとゼロからはじめた AIコーディング 成果と展望
mkdev10
1
250
IIWレポートからみるID業界で話題のMCP
fujie
0
360
Featured
See All Featured
Being A Developer After 40
akosma
90
590k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
20
1.3k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
130
19k
Building Adaptive Systems
keathley
43
2.6k
A designer walks into a library…
pauljervisheath
206
24k
The Invisible Side of Design
smashingmag
299
51k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.3k
A Modern Web Designer's Workflow
chriscoyier
693
190k
The World Runs on Bad Software
bkeepers
PRO
68
11k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
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