ラベル CircleCI の投稿を表示しています。 すべての投稿を表示
ラベル CircleCI の投稿を表示しています。 すべての投稿を表示

2021年12月6日月曜日

CircleCI の Concurrency と Parallelism

この記事は「CircleCI Advent Calendar 2021のカレンダー | Advent Calendar 2021 - Qiita」の6日目です。

CircleCI が無料プランで 30 同時実行可能になったので、Parallelism との関係を調べてみました。

Parallelism とは?

CircleCI ではワークフローのジョブとジョブはそれぞれ並行実行されます。
参考:ワークフローを使用したジョブのスケジュール - CircleCI#ワークフローの構成例 

一方、Parallelism はジョブの中の処理を並列実行する仕組みです。
参考:テストの並列実行 - CircleCI

Parallelism はジョブの steps をそれぞれのワーカーで同じように実行されますが、各ワーカーに付与される CIRCLE_NODE_INDEX 環境変数の値(0,1,2...)でテストを分割したり条件分岐できます。
この Parallelism はプランによって使用できる上限が決まっています。
筆者の場合は今月頭の時点で 16 でした。

さて、ここで少し疑問がわきました。
16 parallelism のジョブを 2 つ使ったら 30 同時実行されるのでしょうか?

Parallelism を含むジョブを 30 以上実行したらどうなるか?

筆者が CI サービスのまとめをしてるリポジトリで検証してみました。

まとめルートリポジトリ:https://github.com/srz-zumix/ci-specs
同時実行の関連まとめ:https://github.com/srz-zumix/ci-parallel

ジョブの開始・終了時刻を記録、その情報から json を生成して chrome://tracing で可視化しています。
この方法は以前「ブログズミ: chrome://tracing で並列処理の可視化をしてみたらすごく便利だった話」で詳細に書いてますので、そちらを参照してください。
ジョブ設定はこちらを参照してください。
https://github.com/srz-zumix/ci-parallel/blob/master/.circleci/config.yml

16 parallelism x 2 job

16 -> 16 という感じでジョブは同時実行されませんでした。
続いて Parallelism を減らし、ジョブ数を増やしてみます。

4 parallelism x 8 job

今度は 28 -> 4 という感じで実行されました。
組み合わせたらダメとうわけではないようです。

(1 parallelism x ) 31 job

最後に Parallelism なし(1)を 31 job です。

当然ですが、30 -> 1 のように実行されました。

まとめ

Parallelism の数分だけ空きがないとそのジョブはキュー待ちする
同時実行数に収まるように Parallelism 数を決めると良さそうですね。
※この挙動に関しては 2021/12/05 時点での結果であり将来的に変わる可能性はあります。

以上。

2021年6月18日金曜日

iutest の CircleCI ワークフローにパスフィルターを適用した

ブログズミ: CircleCI でモノレポ上の指定パスに変更があったらテストを走らせる
こちらの続き

iutest にも組み込んでみた

個人開発している C++ テスティングフレームワークの iutest にも早速組み込みました。
iutest ではたくさんの CI サービスを利用しているので、他の CI サービスの YAML の更新などで CircleCI が回らないようにしてみました。

できた YAML はこちらです。
https://github.com/srz-zumix/iutest/blob/master/.circleci/config.yml
https://github.com/srz-zumix/iutest/blob/master/.circleci/ci.yml

前回ブログからの差分としては

noop ジョブを追加して、フィルターにマッチしなくてなにもすることがなくなると失敗扱いになってしまうのを回避しています。


前回からあまり変わりばえないですが、今回は以上。では。。

2021年5月6日木曜日

DockerHub / GitHub Actions での docker build が No space left on device だったので CircleCI でビルドした話

無料になったIntel compilerをCentOS8にインストールしてみる - Qiita
Intel compilerが2021年になってから実質的に無料になってしまったというのを知り、勢いで作ったのが↓のリポジトリ
https://github.com/srz-zumix/docker-icx
(現在は名前変えてます。https://github.com/srz-zumix/docker-oneapi-hpckit
公式がサポートしてない Ubuntu 16.04 で oneAPI のセットアップをしてます。
(intel-basekit と intel-hpckit。パッケージリストはこちらを参照)

DockerHub Automated Build

で、いつもどおり DockerHub の Automated Build でビルドしたんですが、「No space left on device」でビルドできませんでした。


デカイからなぁ・・(上が公式、下が自前)

GitHub Actions でビルド

space を増やすのもめんどくさそうなので、別の CI サービスを使おうと考え、GitHub Actions でビルド、DockerHub に push するようにしてみました。
(とりあえず build までで https://github.com/srz-zumix/docker-icx/blob/main/.github/workflows/dockerhub.yml

「No space left on device」!!
ググると prune しろとか出てきたので試すも変わらず。うーん。

CircleCI ・・・その前に

じゃあ、しょうがないし他のサービスにするか。
というわけで次点で CircleCI !というふうに決めたわけじゃないです。
拙著「あつまれ CI サービス タダではじめる継続的インテグレーション生活」に記載されている各CIサービスの実行環境の空きディスク容量を参考にして小さいサービスを避けて決めました。




これは本から一部抜粋しましたが、GitHub Actions の Linux エージェントは 20GB ほどしか空きがないのでダメなのもなんとなく納得。
CircleCI の Linux machine:true は 90GB ありそうだったので大丈夫やろ、という気持ちで決めました。
CircleCI でビルド

というわけで、CircleCI でビルドしました。
目論見通り成功です!


最後に

作ったイメージはこちらにあります。
https://hub.docker.com/r/srzzumix/oneapi-hpckit
とはいえ、公式のイメージがあるので特に理由(Ubuntu 16.04 じゃなきゃだめとか)がなければそちらを使うのがいいと思います。(↑のは1レイヤーにまとめすぎて pull が遅い…)
https://hub.docker.com/r/intel/oneapi-hpckit

また intel-oneapi-compiler-dpcpp-cpp-and-cpp-classic パッケージだけをインストールしたイメージも作ったのでこちらに置いてあります。
https://hub.docker.com/r/srzzumix/oneapi-cxx
hpc-kit は結構イメージサイズがデカイので、 C++ Compiler だけ欲しい人がそのパッケージだけインストールしたイメージを作ると良さそうです。
私はこちらを Intel C++ Compiler でのビルド・テストに利用したいと思ってます。

今回は以上。ではでは。


2021年4月26日月曜日

CircleCI でモノレポ上の指定パスに変更があったらテストを走らせる

 「GitHub Actions でモノレポ上の変更があったプロジェクトだけテストを走らせる
これを読んで、

からの

これで、公式から記事も紹介してもらったのでやってみた。

Setup Wrokflows とは
現在 OpenPreview 中の機能です。
最初に読み込む config.yml がセットアップワークフローになって、後続のワークフローを動的に構築できる感じですかね。
その1つの使い方として、変更があったパスごとに実行するワークフローを変えるとかができるってことですね。
使い方は公式記事を見ると良いと思いますが、こちらでも簡単に手順を追ってみます。

  1. 「Project Settings」の「Advanced」にある「Run Setup Workflows (PREVIEW)」を有効にする

  2. config.yml に「setup: true」を足すとセットアップワークフローになります
  3. あとは、もともと config.yml にあったワークフローを別ファイルにし、config.yml にはセットアップワークフローを書く感じになります。
試してみた

実際にやってみないとわからないので、タイトルに書いたとおりパスフィルターを設定して特定のワークフローを実行させてみました。
パスフィルターには「Path filtering Orb」が必要になります。使い方はリンク先もしくは、試してみたリポジトリの YAML を見ればわかると思いますが、こちらでも説明していきます。

https://github.com/srz-zumix/ci-trigger/pull/15

まずはもともとあった config.yml を別ファイルにリネームします。
これはセットアップワークフローから呼び出すファイルになります。

次に config.yml を以下のように書きます。

version: '2.1'
# Enable the Setup Workflows setting to true (it is under “Advanced” in the project settings)
setup: true

orbs:
  path-filtering: circleci/path-filtering@0.0.1

workflows:
  generate-config:
    jobs:
      - path-filtering/filter:
          base-revision: master
          config-path: .circleci/path-filtered-config1.yml
          mapping: |
            .circleci/.* build-pipeline true
            README.md build-docs true

      # https://twitter.com/srz_zumix/status/1385426925531762691
      # {"message":"Pipeline is not in setup state."}
      # - path-filtering/filter:
      #     base-revision: master
      #     config-path: .circleci/path-filtered-config2.yml
      #     mapping: |
      #       .circleci/.* build-pipeline true
      #       README.md build-docs true

「setup: true」を忘れると怒られます。

config-path にはリネームした config.yml を書く感じになると思います。ここに指定した YAML に定義されたワークフローをパラメーター付きで実行することになります。
mapping にパスフィルター(正規表現)とフィルターマッチしたときに付与するパラメーターを指定します。
↑の例では .circleci/ 以下のファイルに変更があったときに「build-pipeline: true」
README.md に変更があったときには「build-docs: true」が与えられます。
(base-revision は差分の比較対象になるブランチ名です。今回は master としてますが、PR の場合は base branch にしたくなる気がしてます。こちらは課題として引き続き検証したいと思います。)

最後に呼び出される YAML にパラメーターの定義とワークフローの when で条件付けします。
パラメーター定義

version: 2.1
parameters:
  build-docs:
    type: boolean
    default: false
  build-pipeline:
    type: boolean
    default: false
  build-other:
    type: boolean
    default: false

条件付け

workflows:
  build-docs:
    when: << pipeline.parameters.build-docs >>
    jobs:
      - build
  build-pipeline:
    when: << pipeline.parameters.build-pipeline >>
    jobs:
      - build
  build-other:
    when: << pipeline.parameters.build-other >>
    jobs:
      - build

こちらの実行結果が↓です。
セットアップジョブには「SETUP」ってついてますね。
この PR には .circleci/.* と README.md どちらも差分があるので、セットアップの実行後に、 build が pipeline/docs の分の2つが実行されました。(other は実行されない)

また、README.md だけの更新 PR の場合は↓です。

ちゃんと build-docs だけの実行になってますね!

ちなみにセットアップジョブを複数書いたらどうなるかも試しました。
↑の config.yml のコメントを外して試してみたのですが、エラーで片方しか実行できませんでした。

こちらは自分の書き方が悪いだけかもしれませんが、追い検証はのちのち。。
最後に

CircleCI がどんどん便利になっていくなーと感じました。
今回はパスフィルターを使って、パラメーターから when で実行するワークフローを on/off させましたが、パラメーターは step 型も扱えちゃうので複雑な制御もいろいろできそうだなと思いました。

セットアップワークフローはまだ Preview 状態なので、引き続きウォッチしていきたいと思います。では。


2020年11月10日火曜日

Travis CI の新プランについて

 The Travis CI Blog: The new pricing model for travis-ci.com

Travis CI の新しい料金プランが 2020/11/02 より始まり、あっという間にクレジットを使い切りました。


新しいプランでは 10,000 クレジットが毎月与えられ、それを消費するスタイルですが、圧倒的に足りない・・

こちら↑はブログからの抜粋ですが、マイニングとかに悪用されたのが理由のようです。
制限かかっても仕方がないな…とは思います。
が、今まで CI サービスの中でも制限ゆるい方だったのが、一気にキツめの部類になったので辛いですねぇ…
まぁ、今まで無料だからと気にせずマトリックス組んでましたが、このままではキツイので体制を見直すことにしました。(自作 C++ テスティングフレームワークの iutest で主に使ってて、複数パターンでテストしてました↑)
ただ、それでも 10,000 クレジットはあっという間になくなってしまうと予測されるので、サポートに OSS クレジットを申請してみました。

結果が来たら追記したいと思います。

Travis CI のかわりにオススメの CI サービスは?
さて、これを機に Travis CI から引っ越しする方も多いと思います。
GitHub Actions に移る方が多そうですが、別のサービスもオススメしておきます。

  • CircleCI
    まぁこれは知ってる人も使ってる人も多いと思うので、こっちに移る人も多いかも。
    OSS プランであれば 400,000 クレジット使えます。
    iutest の 2020/10 月の利用結果はこちら。まだ余裕あり
  • Drone.io
    Drone (Cloud)は OSS であれば完全フリーで使えます。
    並列数とか制限ありません(ただし、リソースは限られてる)
    iutest では gcc/clang の各バージョンでのテストをしています。
  • Azure Pipelines
    GitHub Actions よりは少ない 10 並列ですが、それでも強力な CI サービスです。
    GitHub Actions は(まだ)YAML のアンカー・エイリアスに対応していないので、独自のテンプレート構文が使える Azure Pipelines のほうが、マトリックスは組みやすいと思います。
    Travis CI でマトリックス組んでた人にはオススメです。
  • その他
    iutest では他にもたくさんの CI サービスを利用しているのでよければ参考にしてください。
最後に
DockerHub の pull rate limit の対応をしてたんですが、これまたインパクトのデカイ変更でした。。。このような CI サービスの悪用は他のサービスでも起こりそうな気がしてますが。。。今後の CI as a Service はどうなっていくんでしょうね。。。

2020年6月2日火曜日

Windows Performance Analayzer で C++ ビルド時間のプロファイルをしてみよう!


最近 clang の -ftime-trace オプションと chrome://tracing を使ってビルド時間の可視化をしてみましたが、Microsoft が提供している WPA(Windows Performance Analyzer | Microsoft Docs)も便利そうということで試してみました。


使い方
セットアップ
使い方は↑のツイートのリンク先ブログにも記載されています。

必要なのは VS2019 と Windows ADK です。
リンク先からダウンロードしてインストールしてください。
VS2019 では Community Edition でも問題なくプロファイリングできます。

次に VS2019 のインストールディレクトリから perf_msvcbuildinsights.dll を ADK のインストールディレクトリにコピーします。

「C:\Program Files (x86)\Microsoft Visual Studio\2019\{Edition}\VC\Tools\MSVC\{Version}\bin\Hostx64\x64」
→「C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit」

(Visual Studio の方のパスは環境によって変わるので適宜変更してください。筆者環境では「C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\bin\Hostx64\x64」でした)
筆者が試したときは、ADK インストールディレクトリにすでに同名ファイルがありましたので、バックアップを取ってコピーしました。


このコピーをしておかないと C++ Build Insights (Template instantiations や Files)が見られないので注意してください。

トレース
準備が整ったらプロファイルを取得してみましょう。
こちらもブログの手順のとおりに行えば ok です。

まずは、「x64 Native Tools Command Prompt for VS 2019」を管理者権限で起動します。(vcvarsall.bat などから環境セットアップしたプロセスでも ok)


vcperf /start /level3 name

でトレースを開始します。
開始できたら、普通に Visual Studio でビルドしてください。(IDE からでもコマンドからでもどちらでも ok)

ビルドが終わったら vcperf を停止させます。このとき出力ファイルを指定します。

vcperf /stop /templates name output.etl


WPA で表示する
etl ファイルができたら WPA で表示してみましょう。
etl ファイルをダブルクリックすれば WPA が起動します。
ローディングが終わると以下のように表示されます。


あとは、Diagnostics から項目を選んでいけばビルドで何にどれだけ時間がかかっているのかが確認できます。



CircleCI で vcperf
ローカル環境でプロファイルを取得することもできますが、面倒なので CI でやるようにしてみました。今回使用した CI サービスは CircleCI です。
ターゲットとなるのはおなじみ「自作 C++ テスティングフレームワーク」の iutest です。

CircleCI を選択した理由は、すでに -ftime-trace の結果を CircleCI の成果物として保存するようにしていたので、vcperf の成果物も CircleCI に置こうと思ったからです。
それ以外の理由は特にありません。VS2019 がインストールされている Windows エージェントが使用可能なサービスであれば他でも問題ないと思います。(AppVeyor, Azure Pipelines, GitHub Actions, ...)
(※ CI-Spec で調査)

config.yml と計測用に追加したバッチファイルがこちら。
orbs:
  win: circleci/windows@2.2.0

jobs:
  vcperf:
    executor: win/default
    environment:
      CMAKE_GENERATOR_NAME: "Visual Studio 16 2019"
      CMAKE: "C:/CMake/bin/cmake.exe"
    steps:
      - checkout
      - run:
          name: install
          command: |
            $ProgressPreference = "SilentlyContinue"
            Invoke-WebRequest -URI https://github.com/Kitware/CMake/releases/download/v3.16.4/cmake-3.16.4-win64-x64.zip -OutFile $Env:HOMEPATH\cmake-3.16.4-win64-x64.zip
            Expand-Archive $Env:HOMEPATH\cmake-3.16.4-win64-x64.zip -DestinationPath "C:\"
            Rename-Item "C:\cmake-3.16.4-win64-x64" -NewName CMake
      - run:
          name: cmake
          shell: bash.exe
          command: |
            mkdir build && cd build && ${CMAKE} ../projects/cmake -G "${CMAKE_GENERATOR_NAME}" -A x64
      - run:
          name: vcperf
          shell: cmd.exe
          command: .circleci\vcperf_build.bat
      - store_artifacts:
          path: .\iutest.etl    
    call tools\VisualStudio\vcperf.bat /start /level3 iutest
%CMAKE% --build .\build
call tools\VisualStudio\vcperf.bat /stop /templates iutest iutest.etl

計測用にバッチファイルを別途用意しているのは config.yml の command で1つずつ処理しようとしたら vcvarsall.bat の exit 0 で処理が止まってしまったからです。
vcvarsall は vcperf.bat から呼び出されるようになってます。
もっと良い解決方法あれば教えて下さいmm

このジョブが完了すると Artifacts に iutest.etl がアップロードされています。
ダウンロードして WPA で確認してみましょう。

iutest のプロファイルを見てみる
では CircleCI で取得した etl ファイルを見てみましょう。

Build Explorer
まずは「Build Explorer」の結果↑
どのような処理がどのくらい時間がかかったかがわかります。
1ファイルのコンパイルにおいてどのようなことをしているのかも詳細に確認することができます。

Files
次に「Files」です↑
こちらは各ファイルの処理にどれだけ時間がかかったかがわかります。
また呼び出された回数もわかるので、Count が多いファイルは無駄に include されていないか確認すると良いかもしれません。

↑のようにファイルを展開すると、どこから include されたかどうかが1つずつ確認することができます。

Template Instantiations
最後に「Template Instantiations」です↑
こちらでは template の実体化にかかった時間がわかります。

デフォルトでは「Primary Template Name」が Visible になっているので、 すべての引数パターンが template クラス・関数名でまとめて表示されています。
こちらの Visible のチェックを外すと template 引数違いで時間順に並べられます。
これでボトルネックになっている template の実体化が見つけやすくなると思います。

また検索機能を使うことで、↓のように特定の名前に絞って表示することもできます。

Specialization Names のノードを開くと、どこから実体化されたかもわかるようになってます。

改善ポイント
さて、iutest に絞り込んだ場合 iuCsvFileParamsGenerator<float> の実体化がトップでした。
しかしながら、この iuCsvFileParamsGenerator は CSV ファイルからテストパラメータを読み込ませるときにしか実体化されない想定でした。
上記の2枚目の画像を見ていただくと、Count が 155 回記録されています。
今回記録したときのビルドでは複数のテストをビルドしていますので、おそらくテストの数(exe の数)だけ実体化されていそうです。

使うときにだけ実体化されるのが理想なので、詳細を追ってみたところ、iuCsvFileParamsGenerator<float>::ToParam の特殊化がありました。

おそらく、これが原因でしょう。
今回の記事はここまでですが、この修正結果については Twitter かブログで報告したいと思います。

最後に
WPA はプラットフォームは限られますが、clang -ftime-trace + chrome://tracing でプロファイルするよりも、ビルド時間のボトルネックになりやすい Template Instantiation を調べやすくていい感じだなと思いました。
セットアップや使い方も簡単なのでぜひやってみてください。

では。

追記(2020/06/15)

iuCsvFileParamsGenerator の特殊化をなくして、もっと低レベルでの特殊化(クラス外に追い出した)ところワーストから消えてることを確認しました。

今回の計測前後の etl ファイルをこちらに置いておいたので興味がある方は分析してみてください。


2020年3月31日火曜日

[CircleCI] CLI を Windows で使う

昨今の CI サービスは CLI ツールが用意されていることが多いです。
ジョブを実行したり、コンフィルのバリデーションをしたりでます。
だいたいは、ジョブを本番に push するまえにテストするために使うことを考えて作られていると思います。

CircleCI も例にもれず CLI コマンドがあります。
CircleCI のローカル CLI の使用 - CircleCI

インストール方法はこちらに記載されています。
ぱっと見 Mac/Linux のみで Windows 版はないようにも見えますが、ちゃんと存在しました。
手動でのダウンロード」に「GitHub リリース」へのリンクがあり、そちらから Windows 版もダウンロードできます。


ダウンロードしたら任意のパスに展開し、パスを通せば普通に使えます。

例)バリデーションエラーの様子

修正前
workflows:
  default-test:
    jobs:
      - parallel1:
        i: 0
      - parallel2:
        i: 4

修正後
workflows:
  default-test:
    jobs:
      - parallel1:
          i: 0
      - parallel2:
          i: 4

↑の違いわかりますでしょうか?
i の位置に注目してください。


CircleCI の YAML はなんか他のサービスと比べてインデントが厳しい印象・・
こちらのエラーもインデントがずれていただけでした。これ気づくの難しい・・


正解は i のインデントレベルが 1 段違うだけでした。

最後に
コンフィグをいじる際に何度も本番環境でトライアンドエラーを繰り返すとクレジットを消費してしまってもったいないので、これからはローカルでバリデーションしてから push するようにしたいと思います。

今回は以上です。
では。

2020年3月27日金曜日

[CircleCI] iutest のパイプラインを更新した&お詫びと訂正

さて今週も iutest の CI パイプライン更新を紹介します。
先週はこちら「ブログズミ: [Azure Pipelines] iutest のパイプラインを Multi-stage pipelines に変更した
今週は CircleCI です。

YAML の整理
まずは CircleCI のサンプルを参考にして、YAML をキレイに変更しました。
もともと gcc/clang でそれぞれ 4 パターンビルドしていたジョブを、アンカー・エイリアスを駆使して gcc/clang 別々のジョブに分けました。



以下、YAML の Before/After になります。
Before


After


ファイルの先頭部分はあまり変わってないですが、ファイルの末尾あたりにあるジョブの定義とワークフローの定義が YAML のアンカー・エイリアスを使ってとてもシンブルになっていると思います。

CI が定めた名前のキーではなく、任意のキーでアンカーを作って再利用するやり方はとてもいいなーと思いました。
(CI サービスによってはスキーマにないキーを許容しないサービスもあった気もするが・・)

GitHub PR の Checks に表示する
PR の Checks に表示するには「CircleCI Checks」をインストールする必要があったみたいだったので、遅ればせながらインストールしました。

「Organization Settings」の「VCS」に「Manage GitHub Checks」ボタンがあるのでそちらでインストールできます。
権限確認と適用する範囲を決めたら完了です。



このように表示されます。



お詫びと訂正


本書で、Circle CI の 4 並列制限がなくなったと書いていましたが、あれは真っ赤なウソでした。
お詫びして訂正致します。

今回並列数を増やそうとして気づきました。。




実際には、コンテナの並列数は今までどおり 4 つまでとなっているようです。(ただ、これは CircleCI 1.0 のころの設定画面なので CircleCI 2.0 になってどう管理されいるのか、まだ良くわかってません)
また、OSS プランはベースがあくまでも Free プランなので、ジョブの並列数は Pricing 記載の通り 1 つまでの制限になっているようです。
ジョブが1つずつ実行されていることを確認しました。



これを機に、各 CI サービスの並列実行のサンプルリポジトリを作成することとしました。
近いうちに CI Specs に付け加える予定です。

以上。

2018年3月19日月曜日

[CI] 各種 CI サービスのビルドスキップコメントまとめ (2018/3)

CIサービスの自動ビルドをスキップする方法まとめ - Qiita
こちらに Travis CI、Circle CI、Appveyor の場合がまとまっていますが、この記事では私が利用している CI サービスすべてをまとめたいと思います。

[ci skip] vs [skip ci]
CI サービスでスキップするためのコミットコメントの定番が [ci skip] と [skip ci] です。どちらにも対応しているサービスもあれば、片方だけだったり、これに加えて独自のメッセージに対応していたりします。

iutest では全部で10以上のサービスを利用しているので、すべてのサービスで共通して使えるコメントでないと困るので今回のまとめに至りました。
また、特定のサービスだけスキップしたいなどの要求もあるかもしれないので、そういった場合にも役立つまとめになっているかと思います。

前置きはこれくらいにして、まとめを見ていきましょう。
まとめ
サービス[ci skip][skip ci]その他ユーザー定義
Travis CI
Circle CI
AppVeyor[skip appveyor]
wercker
Shippable
Codeship--skip-ci,--ci-skip
Semaphore
Codefresh
Bitrise
Scrutinizer[skip Scrutinizer]
Rocro(INSPECODE)

以前は、[ci skip] 派と [skip ci] 派が分かれていたのですが、
現在は [ci skip]/[skip ci] どちらも使える派が主流のようです。
Rocro はスキップできないみたいですね。


ユーザー定義も可能な AppVeyor
AppVeyor ではユーザーが任意のスキップコメントをつけることもできます。
https://www.appveyor.com/docs/how-to/filtering-commits/#skip-commits

やり方は appveyor.yml に以下を追加するだけです。

skip_commits:
  message: /\[no appveyor\]/

これを設定しておけば、AppVeyor だけスキップするような使い方ができます。

自分ですべて設定する Codefresh
https://docs.codefresh.io/docs/build-1
Codefresh にはデフォルトでスキップコメント機能はついていませんでした。
ただ、上記リンクのようにコンディションに書けば対応が可能でした。

steps:
  BuildingDockerImage:
    title: Building Docker Image
    type: build
    image_name: srzzumix/ciskip
    working_directory: ./
    dockerfile:
      content: |-
        FROM ubuntu:latest
        COPY . /usr/src/myapp
        WORKDIR /usr/src/myapp
    tag: '${{CF_BRANCH_TAG_NORMALIZED}}'
    when:
      condition:
        all:
          noSkipCiInCommitMessage: |
            includes(lower("${{CF_COMMIT_MESSAGE}}"), "[ci skip]") == false && includes(lower("${{CF_COMMIT_MESSAGE}}"), "[skip ci]") == false

注意が必要なのは、スキップ設定はすべてのステップに記述しないといけない点です。
(前のステップがスキップされても、後続のステップはスキップされないです。前のステップに依存しているとビルドが失敗します。)

また、スキップしたと言ってもビルド回数はカウントアップされます。。。(フリーアカウントの場合ビルド回数制限があるので気をつけましょう)

Only the head/last commit message is checked!
Bitrise のドキュメントに以下の注意書きがありました。
Only the head/last commit message is checked!
If you push more than one commit,
only the last ("head") commit's message will be checked for the skip ci pattern!
http://devcenter.bitrise.io/tips-and-tricks/skip-a-build/

複数のコミットをまとめて push した場合、コメントは最後のコミットのものしかチェックしないようです。つまり、途中のコミットにスキップコメントを入れてもスキップされないということです。

他のサービスではどうなのか調べてみたところ、(Travis CI を除く)他のサービスも同様の挙動をしてました。

Travis CI は全部にスキップコメントが必要
Travis CI は push したときの head だけでなく、commit 毎にビルドが実行されるようなので、全部のコミットにスキップメッセージを入れないとイケナイようです。
「Auto cancel branch builds」設定ができるようになりましたが、これは新しいビルドがキューイングされたらキャンセルする機能です。
スキップコメントの commit はキューイングされないため自動キャンセルもされません。

なので、Travis CI を使う場合は [ci skip] をスキップしたいコミットにつける必要があります。

Travis CI は、スキップしたいコミットに [ci skip] をつける。
それ以外は、スキップしたいコミットを含む push を行う場合は head のコミットに [ci skip] をつける。
ということになるので、Travis CI の方が直感的かもしれませんね。

最後に
今回調べたことは、こちらのリポジトリで検証・記録として見ることができます。
https://github.com/srz-zumix/ci-skip

他に試して欲しい CI サービスなどありましたら、連絡もしくは PR ください。
では。

2018年3月13日火曜日

Circle CI 1.0 から 2.0 に移行する

Circle CI 2.0 になって大夫経ちますが、
「Action Required: We are sunsetting CircleCI 1.0 on August 31, 2018」というメールが来たので移行しました。

やり方は公式ドキュメントにありますが(Migrating from 1.0 to 2.0 - CircleCI)、今回はメールにリンクされていた Config.yml translator. を使ってみました。

手順
Using the 1.0 to 2.0 config-translation Endpoint - CircleCI

こちらは、現在の Circle CI 1.0 の yml をもとに 2.0 の yml を作成してくれる機能です。
やり方は3パターンあります。基本的には API を叩くのですが、リクエストを投げるかブラウザでやるか、もしくはコマンドでやるかの違いだけです。
今回は簡単なのでブラウザに URL 入力する方法でやりました。

ブラウザに入力する URL は以下の形式になります。
https://circleci.com/api/v1.1/project/github/bar/foo/config-translation
bar にはユーザー名、foo にはプロジェクト名を入れます。 iutest の場合は以下のようになります。
https://circleci.com/api/v1.1/project/github/srz-zumix/iutest/config-translation
こちらをアドレスバーに入力して Enter を押すと config-translation ファイルが結果としてダウンロードされます。
この config-translation ファイルを開いていただくと Circle CI 2.0 の yml 形式になったものが書かれていると思います。

あとは、.circleci/config.yml にコピペするなり、ファイルリネームするなりすれば、移行が完了します。
iutest も難なく移行が完了しました。

まとめ
移行するだけならとても簡単だったので、さくっとやってしまいましょう。
では。