ItamaeというIaCツールのCIについて2020-09-26
第53回 情報科学若手の会うなすけ自己紹介
名前 : うなすけ
所属 : フリーランス
インフラ寄りサーバーサイドエンジニア
Itamae メンテナ

GitHub @unasuke
Mastodon @unasuke@mstdn.unasuke.com
Twitter @yu_suke1994

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

Itamaeと若手の会と僕冬の陣2018
CIが通らない話

第51回
メンテナに直アプローチした話

第53回 (今回)CIについて (？)

こいつItamaeの話ばっかしてんなItamaeというIaCツールのCIについて
travis-ci.org

ItamaeのCI
たまに落ちるItamaeのCI再実行ができない！！！！

ItamaeのCI

しかたない、移行するぞ前提知識: ItamaeのtestについてRubyのversion
2.3からheadまでの6 versions

JITの有無2.6以上のRuby(3 versions)に対してunitなのかintegrationなのか実行する環境が異なる

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

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

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: falseruns-on: ${{ matrix.os }}steps:- uses: actions/checkout@v2- uses: ruby/setup-ruby@v1
with:ruby-version: ${{ matrix.ruby }}- run: bundle install

GitHub ActionsでItamaeのunit test通る

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

integration testが通らないintegration testが通らないintegration testが通らない
tmpディレクトリへの書き込みでコケる

straceを有効にすると通るなんで？？？？

さすがに調査がしんどいので採用見送り

CircleCIでItamaeのCI
ではCircleCIをやってみよう.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", "2.5", "2.6", "2.7"]- integration:
matrix:parameters:
ruby-version: ["2.3", "2.4", "2.5", "2.6", "2.7"]# all-test-with-jit:#jobs:- unit-jit:
matrix:parameters:
ruby-version: ["2.6", "2.7"]- integration-jit:
matrix:parameters:
ruby-version: ["2.6", "2.7"]

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

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

bundlerの重複を解決できない！
結局 gem install bundler --force を手書きしないといけない2. machine executorでRubyのversionが設定できない？
docker executorとmachine executorの2種類がある
integration testはDockerを使用するためmachine executorを使いたい

machine executorで以下のようなエラーが出ている

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

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

2. machine executorでRubyのversionが設定できない？
machine executorにおいて circleci/ruby がうまく動かない

RVMのPATHが何度やっても通らない
そもそもそんなハックしたくない

しかたない、setup_remote_dockerしよう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

結果
CircleCIの採用も見送り……

(60回くらいCIを回している)what’s the next ci platform?
皆さんのお好きなCIを思いうかべてみましょうItamaeはtravis-ci.orgで実行されている
travis-ci.org ですtravis-ci.com

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

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

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

まとめ
CI serviceにはクセがあるtravis-ciのmatrixが一番書きやすい
皆さんのコードのCI、 travis-ci.com に移行できてますか？

なぜオレはあんなムダな時間を……