@making's memo

All Categories All Tags


パイプラインベースのCI/CDツール Concourse CI入門

Edit History

Concourse CIとは

Concourse CI

  • Simple
  • Scalable
  • Reproducable

が売りのパイプラインベースCIです。Pivotalが開発しており、Go言語で書かれています。

元々はCloud FoundryのCI/CD用に作られましたが、単独のCI/CDツールとして汎用的に使用できます。

Thought WorksのTechnology Radarでも2015 NovからASSESS(検討の価値あり)に位置付けられています。

他のCI/CDツールとの違い

JenkinsやTravis CI、GoCDとの違いはこちら

Concourse CIではYAMLで簡単にジョブ、パイプラインを記述でき、簡単にスケールでき、結果をUIで視覚的に見ることができます。

Cloud Foundryくらいの大規模プロジェクトになるるとJenkinsの設定方法ではメンテナンス・運用が難しくなったため、このツールが開発されました。
(2016 AprのTechnology RadarではJenkins as a deployment pipelineがHOLD(使うなら気をつけろ)に位置付けられています。)

Cloud Foundryのリリースのパイプラインは公開されていています。

https://runtime.ci.cf-app.com/pipelines/cf-release

image

Concourse CIを使うことにより、ジョブ間の依存関係やどこで問題が発生しているのかを視覚的に把握することができます。

アーキテクチャ

超簡易アーキテクチャを下図に示します。Worker部分でタスクが実行され、ここはスケールアウト可能です。

concourse.png

WorkerではCloud Foundry内部で利用されているGardenというコンテナマネージャーが使われており、その上でDockerイメージを用いてタスクをコンテナ上で実行します。

image

コンセプト

Concourse CIのパイプラインは以下の三つのコンセプトからなります。

  • Tasks
  • Resources
  • Jobs

です。

Taskは任意のスクリプトを隔離された環境で実行します。実際にはスクリプトの実行はDockerコンテナ上で行われます。

Resourceはバージョンチェック、プル(≒ダウンロード)、プッシュ(≒アップロード)できる任意の抽象的な存在です。例えば、Git Resource、S3 Resource、Docker Image Resourceが用意されています。またプッシュしかできないCloud Foundry Resourceや、より抽象的なTime Resourceもあります。
ResourceはJobのinput、outputとして利用可能です。プルしたものをinputとして使い、outputをプッシュすることができます。

JobはResourceとTaskを組み合わせ何かを行います。ジョブはResourceのバージョンアップをトリガーにして実行することもできますし、手動で実行することもできます。Jobは前段のJobに依存することができるため、Jobをつなげてパイプラインを構築することができます。

次のパイプラインを見てみましょう。

image

job-unit-testingdeploy-to-pwsがJobです。deploy-to-pwsjob-unit-testingに依存しています。

image

Jobの間のブロックがResourceです。
GitHubのソース(GitHub Resource)をプルして、job-unit-testing JobでユニットテストのTaskを実行し、deploy-to-pws JobでPivotal Web Services(CF Resource)にアプリケーションをプッシュしています。

image

なお、TaskはJobのブロックの中です(クリックすると見ることができます)。

インストール方法

Consource CIのインストール方法

の4種類があります。
ちょっと試すならVagrant、軽く運用するならDocker Compose、ちゃんと運用するならBOSHが良いでしょう。

パイプラインの設定ファイルは一度作成すればどこでも再利用できるので、Vagrantを使ってローカルで試したパイプラインをそのまま別の環境でも動かせます。

ここでは最も簡単なVagrantを使う方法を紹介します。

に書きました。

$ mkdir concourse
$ cd concourse
$ vagrant init concourse/lite
$ vagrant up

でConcourse CIのセットアップは完了です。

http://192.168.100.4:8080にアクセスしてください。

image

CLIのダウンロードリンクが表示されるので、対象のOSのアイコンをクリックし、ダウンロードしたファイルの名前をflyにrenameし、パスの通ったフォルダに移動してください。

flyコマンドが使えるようになったら、ログインしましょう。

$ fly -t lite login -c http://192.168.100.4:8080
target saved

はじめてのConcourse CI

Hello Worldパイプラインを試してみましょう。

hello.ymlを作成して、次の内容を記述してください。

jobs:
- name: hello-world
  plan:
  - task: say-hello
    config:
      platform: linux
      image_resource:
        type: docker-image
        source:
          repository: ubuntu
      run:
        path: bash
        args: 
        - -c
        - |
          echo "Hello, world!"

flyコマンドを使ってパイプラインを設定します。

$ fly -t lite set-pipeline -p hello -c hello.yml

パイプラインを有効にします。

$ fly -t lite unpause-pipeline -p hello

hello-worldジョブを実行しましょう。

$ fly -t lite trigger-job -j hello/hello-world --watch
started hello/hello-world #1

initializing
running bash -c echo "Hello, world!"
Hello, world!
succeeded

長くなったので次の記事に分けます。改めて1から学びましょう。


本記事の画像は同僚の@The_Shinji62から拝借しました。

このエントリーをはてなブックマークに追加