Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
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
470
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 on Rails と私
znz
0
35
riscv64.rubyci.org internal
znz
0
32
Rubyの日本語リファレンスマニュアルの現在と未来
znz
0
72
devise-two-factorを4.xから5.xに上げた話
znz
0
360
docs.ruby-lang.org/ja/ の生成方法を変えた
znz
0
88
Ubuntuのriscv64版をqemuで動かした
znz
0
110
lilo.linux.or.jpをbusterからbullseyeに上げた
znz
0
110
小規模個人アプリをRails 7.xにバージョンアップした話
znz
0
100
Ruby リファレンスマニュアル改善計画 2022 進捗報告
znz
0
160
Other Decks in Technology
See All in Technology
AWS Bedrock AgentCoreで作る 1on1支援AIエージェント 〜Memory × Evaluationsによる実践開発〜
yusukeshimizu
5
360
21st ACRi Webinar - AMD Presentation Slide (Nao Sumikawa)
nao_sumikawa
0
240
Karate+Database RiderによるAPI自動テスト導入工数をCline+GitLab MCPを使って2割削減を目指す! / 20251206 Kazuki Takahashi
shift_evolve
PRO
1
460
21st ACRi Webinar - Univ of Tokyo Presentation Slide (Shinya Takamaeda)
nao_sumikawa
0
120
Edge AI Performance on Zephyr Pico vs. Pico 2
iotengineer22
0
110
Kiro Autonomous AgentとKiro Powers の紹介 / kiro-autonomous-agent-and-powers
tomoki10
0
290
Lambdaの常識はどう変わる?!re:Invent 2025 before after
iwatatomoya
0
280
AI活用によるPRレビュー改善の歩み ― 社内全体に広がる学びと実践
lycorptech_jp
PRO
1
180
LLM-Readyなデータ基盤を高速に構築するためのアジャイルデータモデリングの実例
kashira
0
200
AI時代の開発フローとともに気を付けたいこと
kkamegawa
0
2k
Oracle Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
2
110
RAG/Agent開発のアップデートまとめ
taka0709
0
130
Featured
See All Featured
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.8k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.7k
Automating Front-end Workflow
addyosmani
1371
200k
Building Adaptive Systems
keathley
44
2.9k
How STYLIGHT went responsive
nonsquared
100
5.9k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.4k
Testing 201, or: Great Expectations
jmmastey
46
7.8k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Designing for humans not robots
tammielis
254
26k
The Art of Programming - Codeland 2020
erikaheidi
56
14k
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