ここがすごいよGitLab CI #gitlabjp

sue445

2017/03/02 GitLab Meetup Tokyo #1

自己紹介 sue445

  • Go Sueyoshi a.k.a sue445
  • 株式会社ドリコム 所属
    • インフラストラクチャー部
    • 社内gemを中心にアプリからインフラまでだいたいサーバサイドを浅く広く見てる
  • 今まで作った主要なものは sue445 Advent Calendar 2016 - Qiita を参照
  • 「ドリコムのプリキュアの人」として社内外で有名
  • Twitterは上級者向けのアカウントなのでフォロー厳禁 :warning:

GitLab関係で作ったものをいくつかピックアップ

今期の嫁:キュアカスタード

cure custard

本気の嫁:キュアピース

cure peace

:beer: スポンサートーク :beer:

drecom

drecom

drecom

アジェンダ

  • ドリコムとGitLab
  • GitLab CIについて
  • ドリコムでの利用例

ドリコムとGitLab

drecom-gitlab

GitLab CIについて

  • GitLab付属のCIツール
  • https://about.gitlab.com/gitlab-ci/
  • 元々GitLab(リポジトリ)とGitLab CIは別アプリだったが、v8.0.0で本体に統合された
  • リポジトリと一体化してるのでJenkinsと比べて設定や連携がすごい楽

構成

architecture

ドリコムでの利用例

  • Railsアプリ開発
  • gem開発
  • packageのビルド&デプロイ
  • Terraform実行

Railsアプリ開発

pipeline_rails

yamlだけでスッキリ書ける

# .gitlab-ci.yml(中略)
stages:
  - test
  - deploy
rspec:
  stage: test
  script: ./gitlab-ci/rspec.sh
index_shotgun:
  stage: test
  script: ./gitlab-ci/index_shotgun.sh
rubocop:
  stage: test
  script: ./gitlab-ci/rubocop.sh
  allow_failure: true
deploy_staging:
  stage: deploy
  script: ./gitlab-ci/deploy.sh staging
  only:
    - develop

Werckerでも似たようなことはできる

wercker_workflow

  • ジョブの枝分かれはできるけど、枝分かれ後の合流ができない。
    • 2つ以上のジョブが全部終わったら次のジョブを実行するというのができない

画面ポチる必要があってyamlだけで完結しないのが難点

wercker_setting

gem開発

pipeline_gem

  • Travis CIのように複数のRubyのバージョンでテストを実行

GitLab CIだと複数のDockerfileを指定できる

# .gitlab-ci.yml
.job_template: &job_definition
  # 共通する設定をここに書く
ruby2.1:rspec:
  <<: *job_definition
  image: drecom/centos-ruby:2.1.10
ruby2.2:rspec:
  <<: *job_definition
  image: drecom/centos-ruby:2.2.6
ruby2.3:rspec:
  <<: *job_definition
  image: drecom/centos-ruby:2.3.3
ruby2.4:rspec:
  <<: *job_definition
  image: drecom/centos-ruby:2.4.0
rubocop:
  <<: *job_definition
  image: drecom/centos-ruby
  • WerckerもDockerイメージを使えるが1つしか使えない
  • .job_template のようにドットで始まるkeyはGitLab CIで無視されるので、共通設定を抽出するのに使える
  • 各Rubyのバージョンでrspecを実行
  • rubocopは各Rubyのバージョンで動かす意味はあまりないので最新のRubyのみで実行
  • OSSで公開してるgemで実際に使ってるファイル: https://gitlab.com/sue445/gitlab_awesome_release/blob/master/.gitlab-ci.yml

GitLab CIで向いていない事例

jenkins_axis

  • ビルドパラメータの軸が2つ以上ある場合GitLab CIだと厳しいのでJenkinsやTravis CI使うのがいい

packageのビルド&デプロイ

package_build

GitLab CIでやってること

pipeline_package

  • ブランチをpushしたらpackageをビルド
  • tagをpushしたらpackageをビルドし、rpmファイルやdebファイルをS3にpush
  • あとはlambdaがいい感じにpackageを公開してくれる

.gitlab-ci.yml(一部)

before_script:
  - docker info
stages:
  - build
  - deploy
build_centos5:
  stage: build
  script:
    - ./gitlab-ci/build.sh centos5
  except:
    - tags
deploy_centos5:
  stage: deploy
  script:
    - ./gitlab-ci/build.sh centos5 deploy
  only:
    - tags

Terraform実行

  • Terraformとはインフラの構成管理ツール
  • ドリコムではサービスごとにAWSのアカウントを管理していて、全てのアカウントを同じ構成にするためにTerraformを利用している
  • 手で実行すると面倒なことが多いので(後述)、実行をGitLab CIで自動化した

構成

terraform

  • account1-terraform
    • AWSのアカウントごとに作ったリポジトリ(ドリコムだと10個以上ある)
    • 実行したいterraformのファイルを配置
  • terraform-base
    • terraformを実際に実行するためのスクリプトを配置したリポジトリ
    • account1-terraformからcloneして使う
    • スクリプトの共通化のためにリポジトリを分割

tarraform plan(本実行前の変更内容の確認)の流れ

  1. MRで tarraform plan を実行
    • terraform.tfstate(Terraformの状態管理ファイル)が暗号化されてコミットされてるので実行前に復号化する
    • terraform.tfstateにはRDSのパスワードやIAMのキーが生で入ってるので直接git管理したくない
    • ローカル実行だと手元のterraform.tfstateが古い場合に大惨事になるので、確実に最新のterraform.tfstateを使うためにGitLab CIで自動実行してる
  2. ビルド時のログでplan結果を見て問題なければMRをアクセプト

terraform apply(本実行)の流れ

  1. MRをアクセプトしたら tarraform applyが自動実行
    • 実行前に暗号化されてるterraform.tfstateを復号化する
  2. tarraform applyが終わったらterraform.tfstateを暗号化してcommitしてpushする
    • コミットメッセージに [ci skip] を入れないと、さらに terraform apply してcommitしてpushしてという無限ループになるので注意

【まとめ】GitLab CIの所感

  • GitLab CIはyamlだけでビルドの並列・直列実行が簡単にできて、今まで自分が使ったCI系のツール(Travis CI, Circle CI, Wercker, Jenkins)の中では一番自分の理想に一番近い
  • GitLabの他にはビルドを実行するRunnerを用意すればいいので、既存リポジトリへの導入が楽
    • 1箇所設定できてしまえば後は .gitlab-ci.yml を他リポジトリにコピペするだけで使える

【おまけ】GitLab CIでGitLab Pagesにページを公開する

このスライドもGitLab CIでビルドしてGitLab.comのGitLab Pagesに公開しています :innocent:

WE’RE HIRING !!

メンバー積極採用中です。
社員・契約社員・個人事業主・アルバイト etc..
http://www.drecom.co.jp/recruit/

募集職種

  • エンジニア
    • Web/アプリ/フロントエンド
    • 基盤・インフラ
  • デザイナー
  • ディレクター/プランナー
  • データサイエンティスト and more !!