

JenkinsとCircleCIは何が違うのでしょうか？  
どちらも継続的インテグレーションツールだと認識しています。


CC BY-SA 4.0
2018-05-03T13:21:22.833
43764
2018-11-05T12:38:35.577
2018-05-18T14:48:17.953
19110
28402
question
jenkins circleci
JenkinsとCircleCIは何が違うのか


Jenkinsは **ソフトウェア** なので基本的には自分でインストールを行い環境を構築する必要があります。  
CircleCIは **クラウドサービス** なので環境は用意されており、ユーザー登録さえ済ませれば利用できます。


CC BY-SA 4.0
2018-05-18T14:54:35.260
44069
2018-05-18T14:54:35.260
3060
43764
answer


# 前置き

この質問には、主観的にならざるを得ない所があるので、そのことを理解して聞いていただきたいです。

この2つは、同じ目的のために作られているため、最終的に達成出来るものは似たような物なのですが、  
そのやり方・考え方にはそれなりの差があり、使用感には大きな差のあるソフトウェアです。

# CircleCI側公式の比較

CircleCI側がJenkinsとの違いを書いたドキュメントが  
<https://circleci.com/docs/2.0/migrating-from-jenkins/>  
にあるので参考になるかもしれません。

そこのメニューを引用すると

> Job Configuration  
>  Plugins  
>  Distributed Builds  
>  Containers and Docker  
>  Parallelism

などに主な違いがあると、CircleCIとしては主張しているようです。

# 私の意見

主観的になるものの、私が経験的に感じた、いくつかの違いを以下で比べてみます。

## リポジトリ内の設定ファイルとジョブが何時でも一致するか？

CircleCIやTravisCIといったCIクラウドサービスが登場した当時の事情でいうと、  
そもそも「コードリポジトリ内に、ビルドパイプラインの設定を一緒に入れておく事ができる」という点が  
Jenkinsと比較したときの大きな利点だったように思います。

つまりcircleci.ymlファイルを1つ入れておけば、すぐにcircleciの中で動き出し、  
またコードの変更でビルドパイプラインに変更が必要になった場合は、  
設定ファイルも同時に変更することによって、追従できるというわけです。  
そのためGithubなどを利用したPullRequestベースの開発と相性がよく、OSSでの利用を中心に広がりました。

しかしその後のJenkins側もバージョンアップによって  
Jenkinsfileというスクリプトを書くことで  
ビルドパイプライン定義をリポジトリ内に格納できるようになりました。  
そのため、こういった用途には十分対応できる状態になっています。

しかし現在でも、旧来の手動登録のジョブを作ることができます。  
そのためJenkinsを使っている時、必ずしもそこで走るジョブは設定ファイルベースの物とは限りません。  
(つまり"いつの間にかコード側で理解しているジョブではないものがある"ことがあります)

## 設定ファイルの形式

この設定の書きやすさなどの面でも、好みの問題によりますが、違いがあるといえるかもしれません。  
具体的にはCircleCIの設定はYAMLファイルによる物で、Jenkinsの設定はgroovyスクリプトによるものです。  
(この良し悪しは、なおさら客観的にお伝え出来ることはないので、質問者さんがお試しになってみてください。)

## ジョブがキックされるタイミングが柔軟か？

CircleCIは基本的にはビルドパイプラインを起動するタイミングが、  
ブランチのマージのタイミングや、PullRequestの送信を行ったタイミングなど  
リポジトリの状態変更に応じたものに限定されています。  
(決まったジョブパイプラインをUI上で手で動かすことは可能です)

Jenkinsはその辺のジョブの起動条件の設定はある程度柔軟です。手動で起動させることなどもできます。  
ただしCircleCIもジョブの途中で、続きを実施してよいか？  
……を利用者に問い合わせる設定(Manual approval)は可能で、  
突然デプロイ対象システム環境が更新されるような挙動は止めることができます。

## オンプレミスか、クラウドサービスか。

Jenkinsは自分で設置し、そのサーバが上手く動いていることを自分で管理する必要があります。  
circleciはクラウドサービスなので、circleci側に任せることができます。  
ただしこのため、デプロイまでCircleCIで実施する場合、自社システムネットワーク内に対して  
CircleCI側にアクセスを許容する必要が出てきます。  
(ただしこの点に対応する有償のEnterprise版CircleCIは出ています)

## ジョブのパラメタに手動で情報を足すことができるか

Jenkinsのジョブはパラメタをつけることができ、ビルド対象などを手動で設定することも可能になっています。  
一方で、これはややこしさを生む場合もありメリットもデメリットもあります。  
CircleCIは、はじめからそういった使い方は出来ないので、  
シンプルと言えるかもしれませんし、柔軟性がないと言えるかもしれません。

# その他もろもろ...

差を色々挙げてみました。  
しかしこの手のツールは、実際に利用したほうが早く直感的な差を理解出来るかもしれません。  
小さなリポジトリを作り、実際にビルドパイプラインを構築してみることをおすすめします。


CC BY-SA 4.0
2018-11-05T12:33:19.673
49988
2018-11-05T12:38:35.577
2018-11-05T12:38:35.577
30827
30827
43764
answer