circle-ciを使ってみる

## 概要
今まで、jenkinsを使っていましたが、運用が面倒なため、クラウドを試してみる。
雑誌で見かけて、１コンテナ無料なのでまた使ってみることにしました。
とりあえず、環境を整える意味で試してみたことをメモする。

## 必要なツール
- Docker Toolbox on macOS
- `git`コマンド
- `circleci`コマンド

### Dockerインストール
Mac上でDockerを使うために`Docker Toolbox`をインストールする。
( ※ Docker for macは遅いので、Toolboxを選択 )

Macなので、`Homebrew`でサクッとインストールする。
( ※ ダウンロードしてのインストールはうまくいかないことがある )

```bash:ターミナル
$ brew update
$ brew cask install docker-toolbox
```

### `git`コマンドのインストール
※ インストール済みの場合は省略

```bash:ターミナル
$ brew install git
$ git --version
git version 2.19.1
```

### `circleci`コマンドのインストール
```bash:ターミナル
$ brew install circleci
$ circleci version
0.1.3923+6fecf9d
```

## リポジトリ作成
下記のようにgitコマンドにてリポジトリを作成する。
※ 例は、bitbucket.orgを利用したものです。
※ 今回は、`~/circleci/`フォルダに作成することにします。

```bash:ターミナル
# 作業フォルダ作成
$ mkdir ~/circleci/
$ cd ~/circleci/

### リポジトリ作成 ＆ コミット
$ git init
$ echo '# circle-ci' > README.md
$ git add README.md
$ git commit -m "first commit."

# リモート設定 & プッシュ
$ git remote add origin git@bitbucket.org:*****/*************.git
$ git push -u origin master
```

## 設定ファイルの作成
下記のように設定ファイルを作る

```yaml:.circleci/config.yml
version: 2
jobs:
  build: 
    docker:
      - image: circleci/node:8.11.3
    steps:
      - run: echo "hello world"
```

## 設定ファイルのチェック
設定ファイルの記述が間違っていないかチェックする。

```bash:ターミナル
$ circleci config validate
Config file at .circleci/config.yml is valid.
```

## ローカル実行
macにインストールした`docker toolbox`で実行してみる。
アプリケーション -> Docker -> Docker Quickstart Terminal.app
![toolbox.png](https://qiita-image-store.s3.amazonaws.com/0/142279/ac975b6f-1bd5-8ef5-e27c-98edec0ccf11.png)

Dockerが起動したら、下記のコマンドを実行してみる。

```bash:ターミナル
$ circleci local execute
　　・
　　・
　　・
====>> echo "hello world"
  #!/bin/bash -eo pipefail
echo "hello world"
hello world
Success!
```

## bitbucketへのコミットで実行
circle-ciの管理画面から`プロジェクト追加`を行い、bitbucketのリポジトリを登録する。

**Circle Ci / Add Projects**
https://circleci.com/add-projects/bb/reflet

bitbucketへコミット ＆ プッシュする。

```bash:ターミナル
$ vi README.md   <- 説明文を修正
$ git add README.md
$ git commit -m "ドキュメントの更新"
$ git push origin master
```
ジョブが自動実行され、CircleCiの管理画面で下記のように実行結果が見れる。
![exec.png](https://qiita-image-store.s3.amazonaws.com/0/142279/e650c7ce-3f7a-3535-96c5-1d85edd57d98.png)

## CIをスキップしたいとき
動作に関係ない説明文(README.md)の修正など、CIを回したくないのでそういった場合には、
コミットメッセージに`[ci skip]`を追加したらいいようです。

```bash:ターミナル
$ git commit -m "ドキュメントの更新[ci skip]"
```

実行例) skippedとなっている
![skip.png](https://qiita-image-store.s3.amazonaws.com/0/142279/1e91830d-5bca-8504-80ff-92d0268e5d47.png)

## ssh接続してみる
デバックなどの目的でSSH接続できるようなので、試してみる。
Circle-Ciの管理画面で、Jobsメニューから接続したいジョブの詳細ページで「Return workflow」メニューから「Return job with SSH」を選択する。
![ssh.png](https://qiita-image-store.s3.amazonaws.com/0/142279/f03a757d-f464-93b2-0350-40bebf7f6ffd.png)

下記の表示がされるので、そこに記載のコマンド（IPアドレス）で接続してみる。
![ssh2.png](https://qiita-image-store.s3.amazonaws.com/0/142279/d04fd589-d6e4-6161-c405-69edf6b11b7a.png)


```bash:ターミナル
$ ssh -p 64*** ***.***.***.***

# パス確認
circleci@46cc590a9841:~$ pwd
/home/circleci

# ファイル確認
circleci@814b5d524352:~$ ls -la
total 24
drwxr-xr-x 3 circleci circleci 4096 Nov  8 05:28 .
drwxr-xr-x 5 root     root     4096 Nov  8 05:28 ..
-rw-r--r-- 1 circleci circleci  220 Nov  5  2016 .bash_logout
-rw-r--r-- 1 circleci circleci 3515 Nov  5  2016 .bashrc
-rw-r--r-- 1 circleci circleci  675 Nov  5  2016 .profile
drwxr-xr-x 2 circleci circleci 4096 Nov  8 05:28 project

# projectフォルダの中は空っぽ？
circleci@814b5d524352:~$ ls -la project
total 24
drwxr-xr-x 3 circleci circleci 4096 Nov  8 05:28 .
drwxr-xr-x 5 root     root     4096 Nov  8 05:28 ..

# 終了
circleci@46cc590a9841:~$ exit
exit
Connection to ***.***.***.*** closed.
```

コンテナは、起動したら10分間ぐらい接続可能なようです。
必要なくなったら、SSH終了後、Circle-Ciの画面からジョブを終了した方が良さそう。
(次のジョブがScheduledになって実行されないようなので・・・)

以上

## 参考サイト
- [Docker Toolbox on macOS](https://docs.docker.com/toolbox/toolbox_install_mac/)
- [macOSのSierraではDocker Toolboxのインストールが出来ない](https://qiita.com/Ryosuke-Hujisawa/items/67f9dff2fadd729165dc)
- [github / circleci-cli](https://github.com/circleci-public/circleci-cli)
- [WEB＋DB PRESS vol.107 実践CircleCI](https://gihyo.jp/magazine/wdpress/archive/2018/vol107)