Rabbit Slide Show

wakate2020

Description

第53回情報科学若手の会での発表スライドです https://wakate.connpass.com/event/165723

Text

Page: 1

ItamaeというIaCツールのCIにつ
いて
2020-09-26
第53回 情報科学若手の会
うなすけ

Page: 2

自己紹介
名前 : うなすけ
所属 : フリーランス
インフラ寄りサーバーサイドエンジニア
Itamae メンテナ
GitHub @unasuke
Mastodon @unasuke@mstdn.unasuke.com
Twitter @yu_suke1994

Page: 3

Itamaeとは?
Itamae は構成管理ツール
Ruby製
https://github.com/itamae-kitchen/itamae
おなかま: Puppet, Chef, Ansible
@ryotarai 氏によって作成された
現在のメンテナ @sue445, @ryotarai, @unasuke

Page: 4

Itamaeと若手の会と僕
冬の陣2018
CIが通らない話
第51回
メンテナに直アプローチした話
第53回 (今回)
CIについて (?)
こいつItamaeの話ばっかしてんな

Page: 5

ItamaeというIaCツールのCIについて
travis-ci.org

Page: 6

ItamaeのCI
たまに落ちる

Page: 7

ItamaeのCI
再実行ができない!!!!

Page: 8

ItamaeのCI
しかたない、移行するぞ

Page: 9

前提知識: Itamaeのtestについて
Rubyのversion
2.3からheadまでの6 versions
JITの有無
2.6以上のRuby(3 versions)に対して
unitなのかintegrationなのか
実行する環境が異なる

Page: 10

OSSのCIツール
public repoのCIが無料なのは、有名なのはこれら
GitHub Actions
CircleCI

Page: 11

GitHub ActionsでItamaeのCI
まずはGitHub Actionsをやってみよう

Page: 12

GitHub ActionsでItamaeのunit test
name: "unit test on ubuntu"
on:
push:
branches: "*"
jobs:
test:
strategy:
matrix:
os: [ubuntu-16.04, ubuntu-18.04]
ruby: [2.2, 2.3, 2.4, 2.5, 2.6, 2.7, head]
fail-fast: false
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v2
- uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby }}
- run: bundle install

Page: 13

GitHub ActionsでItamaeのunit test
通る

Page: 14

GitHub ActionsでItamaeのintegration test
通らない!!!!!

Page: 15

integration testが通らない

Page: 16

integration testが通らない

Page: 17

integration testが通らない
tmpディレクトリへの書き込みでコケる
straceを有効にすると通る
なんで????
さすがに調査がしんどいので採用見送り

Page: 18

CircleCIでItamaeのCI
ではCircleCIをやってみよう

Page: 19

.circleci/config.yml
version: 2.1
orbs:
ruby: circleci/ruby@1.0.7
executors:
docker:
docker:
- image: cimg/base:stable
docker-1804:
docker:
- image: cimg/base:stable-18.04
machine:
machine:
image: circleci/classic:201808-01
jobs:
unit:
parameters:
ruby-version:
type: string
exec:
type: executor
default: ""
executor: << parameters.exec >>
steps:
- checkout
- ruby/install:
version: << parameters.ruby-version >>
- run: gem install bundler --version 1.17.3 --force
- run: bundle install -j4
- run: ruby -v
- run: bundle exec rake spec:unit
integration:
parameters:
ruby-version:
type: string
executor: machine
# executor: docker
steps:
- checkout
- setup_remote_docker:
version: 18.06.0-ce
- ruby/install:
version: << parameters.ruby-version >>
- run: gem install bundler --version 1.17.3 --force
- run: bundle install -j4
- run:
command: |
ruby -v
export PATH=$HOME/.rvm/bin:$PATH
ruby -v
- run: bundle exec rake spec:integration:all
unit-jit:
parameters:
ruby-version:
type: string
executor: docker
steps:
- checkout
- ruby/install:
version: << parameters.ruby-version >>
- run: gem install bundler --version 1.17.3 --force
- run: bundle install -j4
- run: ruby -v
- run: RUBYOPT=--jit bundle exec rake spec:unit
integration-jit:
parameters:
ruby-version:
type: string
# executor: machine
executor: docker
steps:
- checkout
- setup_remote_docker:
version: 18.06.0-ce
- ruby/install:
version: << parameters.ruby-version >>
- run: gem install bundler --version 1.17.3 --force
- run: bundle install -j4
- run: ruby -v
- run: RUBYOPT=--jit bundle exec rake spec:integration:all
workflows:
version: 2
all-test:
jobs:
- unit:
exec:
name: docker-1804
matrix:
parameters:
ruby-version: ["2.3"]
- unit:
exec:
name: docker
matrix:
parameters:
ruby-version: ["2.4",
- integration:
matrix:
parameters:
ruby-version: ["2.3",
# all-test-with-jit:
#
jobs:
- unit-jit:
matrix:
parameters:
ruby-version: ["2.6",
- integration-jit:
matrix:
parameters:
ruby-version: ["2.6",
"2.5", "2.6", "2.7"]
"2.4", "2.5", "2.6", "2.7"]
"2.7"]
"2.7"]

Page: 20

CircleCIでItamaeのCI、壁たち
1. ruby/install-depsの挙動
2. machine executorでRubyのversionが設定できない?
3. setup_remote_dockerではvolume mountが使えない

Page: 21

1. ruby/install-depsの挙動
CircleCI公式Orb circleci/ruby を使用
Gemfile.lock があることを期待している
アプリケーション向きでライブラリ向きではない
別になくてもいい (オプション指定可能)
bundlerの重複を解決できない!
結局 gem install bundler --force を手書きしないといけない

Page: 22

2. machine executorでRubyのversionが設定できない?
docker executorとmachine executorの2種類がある
integration testはDockerを使用するためmachine executorを使いたい
machine executorで以下のようなエラーが出ている

Page: 23

2. machine executorでRubyのversionが設定できない?
Ruby 2.6なのに --jit オプションを渡せない?

Page: 24

2. machine executorでRubyのversionが設定できない?
Ruby 2.6のテストでRubyのversionを出力してみると、こう
Ruby 2.3になっとるやんけ!!!!!!

Page: 25

2. machine executorでRubyのversionが設定できない?
machine executorにおいて circleci/ruby がうまく動かない
RVMのPATHが何度やっても通らない
そもそもそんなハックしたくない
しかたない、setup_remote_dockerしよう

Page: 26

3. setup_remote_dockerではvolume mountが使えない
CircleCIのdocker executor内でdockerを使用するしくみ
テストを実行しみると落ちる
どうやらvolume mountに失敗している?
ジョブ空間からリモート Docker 内のコンテナにボリュームをマウ
ントすること (およびその逆) はできません。
https://circleci.com/docs/ja/2.0/building-docker-images/
#section=configuration

Page: 27

結果
CircleCIの採用も見送り……
(60回くらいCIを回している)

Page: 28

what’s the next ci platform?
皆さんのお好きなCIを思いうかべてみましょう

Page: 29

Itamaeはtravis-ci.orgで実行されている
travis-ci.org です

Page: 30

travis-ci.com
https://blog.travis-ci.com/2018-05-02-open-source-projects-on-travis-ci-
com-with-github-apps

Page: 31

Itamaeはtravis-ci.orgで実行されている
travis-ci.org です
travis-ci.org から travis-ci.com に移行すると、どうなる?

Page: 32

Itamae CI on travis-ci.com
“Restart build” できる!

Page: 33

まとめ
CI serviceにはクセがある
travis-ciのmatrixが一番書きやすい
皆さんのコードのCI、 travis-ci.com に移行できてますか?
なぜオレはあんなムダな時間を……

Other slides