CircleCI を使いこなす！ JOBの設定方法を徹底解説！！

# はじめに
以前、CircleCIの始め方を解説しました。
[初心者必見！ CircleCIでHello Worldしてみよう！](https://qiita.com/yassun-youtube/items/2a09d5b1b56feace8156)

今回はCircleCIの基本設定のうち、JOBについて詳しく解説していきます。

# YouTube解説
Qiitaの記事だけでなく、YouTubeでも解説しています！
動画で確認したい方はこちらもどうぞ！
[【YouTube動画】 CircleCI を使いこなす！ JOBの設定方法を徹底解説！！](https://youtu.be/NWjNn2DLcPM)
[![CircleCI を使いこなす！ JOBの設定方法を徹底解説！！](https://img.youtube.com/vi/NWjNn2DLcPM/0.jpg)](https://youtu.be/NWjNn2DLcPM)

# 設定ファイルの復習
まず、設定ファイルを確認しましょう。

```yml
version: 2.1
jobs:
  <job_name>:
    docker: ...
    steps: ...
workflows:
  <workflow_name>:
    jobs: ...
```

次のようにjobs以下に名前付きで実行したいjobを設定します。
jobには実行したいコマンド群を記述していきます。

そのjobの実行タイミングはworkflowで指定します。
特定のタグを切った時に実行させたり、mainブランチにマージしたら実行させたりといった使い方ができます。

今回はjobsの部分について詳しく見ていきます。

```yml
jobs:
  <job_name1>:
  <job_name2>:
  <job_name3>:
workflows:
  <workflow_name>
    jobs: ...
```


# Executorタイプ
jobの一行下でどの環境でコマンドを実行させたいか (executorタイプ) を決めることができます。
指定できるのは、docker, machine, macos, windowsです。

```yml
<job_name>:
  <executorタイプ>
```

dockerでは、docker imageを指定して使います。

```yml
<job_name>:
  docker:
    - image: buildpack-deps:trusty
```

machineを指定すると、LinuxのVMで実行できます。
OSのリソースにフルアクセスしたい場合などに便利そうです。

```yml
<job_name>:
  machine:
    image: ubuntu-1604:201903-01 
```

macosを指定すると、macOSのVMで実行できます。
xcodeのバージョン指定もできます。
iOSアプリのビルドで役立ちそうです。


```yml
<job_name>:
  macos:
    xcode: 11.3.0
```

windowsを指定すると、windowsのVMで実行できます。
windows用アプリの開発で役立ちそうです。
ただ、windowsは特殊で、上記のものとは異なる設定が必要です。
[Windows Executorの使用](https://circleci.com/docs/ja/2.0/executor-types/#windows-executor-%E3%81%AE%E4%BD%BF%E7%94%A8)

# JOBの設定項目
CircleCIでDockerを使うことの方が多いと思うので、docker中心で解説していきます。

## スペック設定 resource_class
マシンスペックを指定することで、vCPUやRAMの性能を上げることができます。

```yml
docker:
  - image: <docker_image>
  resource_class: large
```

選べるスペックは以下の表のようになっています。
ただ、スペックを上げるとその分値段も上がります！
![スクリーンショット 2020-11-11 13.40.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/bef1683f-c448-6a3e-6882-d723881798e6.png)



## 環境変数の追加 environment
仮想環境内で使用したい変数はenvironmentで設定できます。

```yml
docker:
  - image: circleci/ruby:2.6.5
    environment:
      BUNDLE_PATH: vendor/bundle
```

## 並列処理の数 parallelism
これで並列で実行するコマンド数を指定できます。
詳しい話は別動画・別記事で紹介します。

```yml
docker:
  parallelism: 3
```

## steps
ここ以下にどういうコマンドを実行したいかを書きます。
ここも詳しく見ていきます。

```yml
docker:
  steps: 
```

# stepsの設定
stepsの設定を詳しく見ていきます。

## 標準的なコマンド実行 run
標準的なコマンドを実行するときに使います。

```yml
steps:
  run:
    command: echo Hello World
```

複数行の場合は次のようにも書けます。

```yml
steps:
  run:
    command: |
      echo hello
      echo world!!
```

## チェックアウト checkout
仮想環境のworking_directoryにGitHubのソースコードをチェックアウトするときに使用します。

```yml
steps:
  - checkout
```

## キャッシュ保存 save_cache
ソースコードやディレクトリのキャッシュに使えます。

node_moduleをキャッシュしておいて、テスト時に毎回入らないようにすることもできます。
pathsでキャッシュしたいディレクトリを指定できます。

```yml
steps:
  save_cache:
    key: yarn-{{ checksum "yarn.lock" }}
    paths:
      - node_modules
```

## キャッシュ取り出し restore_cache
保存したキャッシュを利用するときに使用します。
keyは前方一致です。

```yml
steps:
  restore_cache:
    key: yarn-{{ checksum "yarn.lock" }}
    paths:
      - node_modules
```

## deploy
基本的にはrunと同じ挙動です。
SSHを使用して実行されるjobでは無視されます。

```yml
steps:
  deploy: ...
```

## 実行ファイルの保存 store_artifacts
CircleCI上にテスト終了後も残しておきたいファイルを指定できます。

```yml
steps:
  store_artifacts:
    path:
      - build
```

保存した結果はARTIFACTSタブからダウンロードできます。
![スクリーンショット 2020-11-12 11.04.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/d532e8a0-28c9-9dc5-8ca8-0d4b0e34572e.png)

## テスト結果の保存 store_test_results
テスト結果の保存もできます。
テスト結果はARTIFACTSの左にあるTESTSタブから確認できます。

```yml
steps:
  store_test_results:
    path: tmp/test-results
```



## persist_to_workspaceとattach_workspace
jobが実行された状態を保存し、他のjobでも使えるように設定できます。


```yml
steps:
  persist_to_workspace:
    root: /tmp # rootフォルダの指定
    paths:
      - foo # rootフォルダないのパスを指定
```

```yml
steps:
  attach_workspace:
    at: /tmp # persist_to_workspaceで指定したディレクトリを指定する
```

## add_ssh_key 
デプロイ用のSSHキーの追加もできます。

```yml
steps:
  add_ssh_key:
  fingerprints:
    - "b7:35:a6:4e:9b:0d:6d:d4:78:1e:9a:97:2a:66:6b:be"
```

# おわり
今回はCircleCIのjobやstepsについて詳しく見ていきました。
他の項目についても動画とQiiita記事を作っていきます！