tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

【CircleCI】CircleCI 2.0からはじめる個人での簡単なCI導入方法 - githubとの連携まで

はじめに

仕事でcircleciをなんとなーく使っていますが
使いこなしたくなったので改めて個人でもいろいろ試してみるメモです。

f:id:tweeeety:20180209194628p:plain

アジェンダ

  1. CircleCIとは
    • CIってなんぞや
    • CircleCIってなんぞや
    • CircleCIの特徴
    • CircleCIの料金
    • CircleCIに必要なもの
  2. CircleCIを使ってみる
  3. CircleCI/githubの連携を確認する

1. CircleCIとは

ここではCircleCIってこんなもの!とわかるような内容を簡単にまとめておきます。

CIってなんぞや

CI(continuous integration: 継続的インテグレーション)とはなんぞやというのは知ってる前提ですが一応載せておきます。
安定のwikipediaから引用..

CI(英: continuous integration)とは、主にプログラマーのアプリケーション作成時の品質改善や納期の短縮のための習慣のことである。
エクストリーム・プログラミング (XP) のプラクティスの一つで、狭義にはビルドやテスト、
インスペクションなどを継続的に実行していくことを意味する[1]。
特に、1990年代後半以降の開発においては、継続的インテグレーションをサポートするソフトウェアを使用する傾向が強まってきた。

引用: wikipedia

もうちょっとわかりやすい説明は以下のスライドのP6がわかりやすかったです。
こちらも引用させて頂きますが

  • CI(継続的インテグレーション)
    • コンパイル/テストといったビルド処理を頻繁に繰り返すこと で問題の早期発見や品質改善を目指す手法
  • CIすると嬉しいこと
    • バグの早期発見
      • ローカルでテストをするのをうっかり忘れてもCIでテストが落ちたことを検知できる
    • 仮想環境(CirlceCIのVM)という共通の環境でテストができる -「自分のローカル環境ではテストが通ったけど、何故か他の人の環境ではテストが落ちる」という問題を防げる、原因の追求がしやすい

引用: CircleCIを勝手に紹介・宣伝 + おまけ [OSC Hokkaido 2015 LT]

CircleCIってなんぞや

とうぜんといえばとうぜんですが、CIサービスです。
URLはこちら
https://circleci.com/

Jenkinsとの比較

他CIサービスのjenkinsと比較して一番にあがるのは、
Jenkinsは自前でJenkinsサーバを立てる必要があるのに対して
クラウドwebサービスというところでしょうか。

CircleCIはwebサービスなので、
アカウント登録してクラウド上でCIを実行する形を取ります。

CircleCIアカウント

アカウント登録はgithubアカウントとの連携(登録)が必須になります。

CircleCIの特徴

特徴を列挙します

CircleCIの料金

料金は公式サイトの以下のページで確認できます。
https://circleci.com/pricing/

コンテナが1つ、ビルド時間が1,500分(25時間)なら無料です。
コンテナを1つ増やすたびに$50ほどかかります。個人だと$50もまぁまぁしますね...

2018/01現在の料金体系について、無料版と最低価格の比較だけ載せておきます

- free(1 Container) 2 Container
repos 無限 無限
users 無限 無限
build 1 monthに1500分のビルド時間 無限
container 1 2
concurrent build 1 2

CircleCIに必要なもの

すでに特徴でも書いていますがgithubアカウントが必要です。
でもそれだけ!!

2. CircleCIを使ってみる

使ってみる際のながれです。

  • github上でアカウントを作る
  • github上でciするrepository(circleciでいうプロジェクト)を作成する
  • ③ CircleCI上でgithubアカウントと連携する
  • ④ ローカルでリポジトリに設定ファイル(.circleci/config.yml)を作る
  • ⑤ CircleCI上でbuild開始してみる

ということで、この流れで使ってみます。

github上でアカウントを作る

省略します。
さすがにciしようというくらいならありますよね!

github上でciするrepository(circleciでいうプロジェクト)を作成する

今回はこの記事用に作ったリポジトリを例に使います。
https://github.com/tweeeety/go-test-circleci-sample

中身はgoで書いたソースとtestです。

構成
$ tree .
.
├── README.md
├── sample01.go
└── sample01_test.go
sample01.go
package sample01

func HelloWorld(s string) string {
  return "hello world, " + s
}
sample01_test.go
package sample01

import (
  "testing"
)

func TestHelloWorld(t *testing.T) {
  actual := HelloWorld("hoge")
  expected := "hello world, hoge"
  if actual != expected {
    t.Errorf("actual %v\nwant %v", actual, expected)
  }
}

③ CircleCI上でgithubアカウントと連携する

ここからCircleCIとgithubの連携です。

公式ページも再掲します。
https://circleci.com/

Sign Up

まずはgihubアカウントを利用してSign Upします

  • メニューPricingから行ってみます
    f:id:tweeeety:20180209194534p:plain

  • freeで始めてみるのでそのままSign upします
    f:id:tweeeety:20180209194653p:plain

  • Sign Up with GitHubからGithubアカウントにてAuthorizeします
    f:id:tweeeety:20180209194705p:plain

  • Authorizeを求められるのでAuthorize circleciをクリックします f:id:tweeeety:20180209194717p:plain

  • githubのパスワードを入力すれば登録完了です。簡単ですね!! f:id:tweeeety:20180209194740p:plain

  • 登録できればCircleCIのDashboard画面が開きます
    f:id:tweeeety:20180209194754p:plain

ciするプロジェクトを選択

利用できる準備は整ったので、CircleCI上でプロジェクトを選択します。

CircleCI上ではPROJECTSといいますが、
githubのrepositoryのことです。

  • Add projectsからci対象とするprojectsを登録します f:id:tweeeety:20180209194838p:plain

  • ciするプロジェクトのSetup projectを選択します f:id:tweeeety:20180209194854p:plain

  • これでciの準備が整いました。今回は設定はこのまま進みます f:id:tweeeety:20180209194908p:plain

④ ローカルでリポジトリに設定ファイル(.circleci/config.yml)を作る

最後に開いた画面の説明の通り、
リポジトリ直下に.circleci/config.ymlを追加します。

Sample .yml Fileには以下のように表示してくれているのでこれをコピって作ります。

# Golang CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-go/ for more details
version: 2
jobs:
  build:
    docker:
      # specify the version
      - image: circleci/golang:1.8
      
      # Specify service dependencies here if necessary
      # CircleCI maintains a library of pre-built images
      # documented at https://circleci.com/docs/2.0/circleci-images/
      # - image: circleci/postgres:9.4

    #### TEMPLATE_NOTE: go expects specific checkout path representing url
    #### expecting it in the form of
    ####   /go/src/github.com/circleci/go-tool
    ####   /go/src/bitbucket.org/circleci/go-tool
    working_directory: /go/src/github.com/{{ORG_NAME}}/{{REPO_NAME}}
    steps:
      - checkout

      # specify any bash command here prefixed with `run: `
      - run: go get -v -t -d ./...
      - run: go test -v ./...
.circleci/config.ymlの作成

yamlはコピーしますが、working_directoryの今回用に作ったリポジトリに変えておきます。

working_directory: /go/src/github.com/{{ORG_NAME}}/{{REPO_NAME}} ↓ working_directory: /go/src/github.com/tweeeety/go-test-by-circleci-sample

# リポジトリに移動してファイル作成
$ cd [path to repo]
$ mkdir .circleci

# 内容はそのまんまコピー
# working_directoryだけ自分のリポジトリに
$ vim .circleci/config.yml

# 普通にpush
$ git add . 
$ git commit -m 'add .circleci/config.yml'
$ git push origin master

⑤ CircleCI上でbuild開始してみる

Start buildingを押すと、追加した設定を元にciのbuildを実行してくれます。
f:id:tweeeety:20180209195124p:plain

CIが回ってtestが成功すればSUCCESSと表示されるのが確認できると思います。 f:id:tweeeety:20180209195136p:plain

3. CircleCI / githubの連携を確認する

githubとの連携も確認してみます。

github上からpull requestを送ったらciが回る、みたいなやつですね。
特別な設定はいらず、ここまでの設定にてすでにそうなっています。

pullreq作る

用意したリポジトリにためしにpull requestを送ってみます。

$ git checkout -b sample-branch

# 適当に編集
$ vim README.md

# pull request送る
$ git add .
$ git commit -m 'modify readme'
$ git push origin sample-branch

このあとはgithub上でpull requestを作成します。

CircleCI上でbuildがまわる

pull requestの作成をトリガーに、CircleCI上でbuildが回ります f:id:tweeeety:20180209195154p:plain

github上に結果が表示される

また、CircleCIでbuildがまわったと同時に
pull request上には結果が表示されます。
f:id:tweeeety:20180209195211p:plain

補足 - build結果のslack通知

この記事では基本的なciの連携までを書きました。

このあとはbuild結果をslackに通知したりしたいですよね。
その辺は別記事で書いてみました。
【CircleCI】CircleCI 2.0からはじめる個人での簡単なCI導入方法 - Build結果をSlack通知

おわり

jenkinsと違って自分で立てなくて良いのでサクっとはじめられますね!\(^o^)/