GitHub Actionsの超基本！特別な設定が不要なCIサービス

本記事では

- GitHub Actionsとは何か？
- CircleCIとの違いは何か？
- どうやって始めれば良いか？

を扱います。

動画で確認したい方はこちらをどうぞ！
[【YouTube動画】10分で学ぶ GitHub Actionsの超基本！CircleCIとの比較から始め方まで](https://youtu.be/Vaslap4nHh0)
[![10分で学ぶ GitHub Actionsの超基本！CircleCIとの比較から始め方まで](https://img.youtube.com/vi/Vaslap4nHh0/0.jpg)](https://www.youtube.com/watch?v=Vaslap4nHh0)

# GitHub Actionsとは何か？
GitHub ActionsはGitHubが公式で提供するCI/CDサービスです。
デフォルトで使えるため、webhookなどの**登録は不要**で ``.github/workflows`` 以下に**ymlファイルを置くだけ**で動かすことができます。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/820131a4-5233-d71f-0681-bbedb391db5e.png' width='600'>

テスト結果などは、GitHubリポジトリの各プロジェクトの上の方にある Actionsタブから確認できます。

![スクリーンショット 2020-11-09 10.34.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/33520fa3-b18c-7a8f-5aa3-9e5b775ee087.png)

何もActionsを設定していない場合、以下のようにテンプレート画面が表示されます。
![_2020-11-04_20.11.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/bd87feca-f0c8-49c9-cfc7-ed1b78d8b969.png)


## 利用料について
基本無料です！
GitHubの無料ユーザーの場合は、月2,000 分 無料で使用できます<sup>[1](#補足)</sup>。
上限を超えると使えなくなりますが、毎月リセットされます。追加で課金して使うこともできます。
いつの間にか無料枠を超えていて、差額を請求されるということはないので安心して使えます。
![スクリーンショット 2020-11-09 10.42.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/b59d87cf-412f-43fb-72f6-0f90757c9d0c.png)


# CircleCIとの違いは何か？
CircleCIでは、1つのファイルに複数のワークフローを設定できました。
GitHub Actionsでは1ファイル 1ワークフローになります。
またGitHub Actionsでは、ファイルやディレクトリを指定して、差分が生じた時にテストを実行することができます。

# 設定ファイルの書き方
Rubyをセットアップして、Hello Worldを表示するファイルは次のようになります。
このファイルをリポジトリに置くと、テストが実行されます。

```yml
# .github/workflows/ruby.yml

name: Ruby

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Set up Ruby
      uses: ruby/setup-ruby@ec106b438a1ff6ff109590de34ddc62c540232e0
      with:
        ruby-version: 2.6
    - name: Hello World
      run: echo Hello World
```

テスト結果を確認するために、Actionsタブを開きます。
ワークフローごとにテストが実行されています (今回ワークフローは1個しかないですが...)。
![_2020-11-04_20.06.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/7924e598-58c8-c338-4614-dbc9d91ad69b.png)

サイドバーのワークフロー名をクリックすると、jobごとにのページに遷移し、テスト結果を確認できます。
Hello Worldと出ていますね。
![_2020-11-04_20.05.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/408ecc8c-d97c-6dea-8f32-fe8bccc492dc.png)

## 設定ファイルの詳細
それでは、設定ファイルを細かくみていきます。

nameはワークフローの名前を設定するのに使います。
ファイルの名前と一致する必要はないです。

```yml
name: <ワークフロー名>
```

onでテストを実行するタイミングを指定できます。
下の場合はpushした場合とPRをopenしたりしたときに実行します。

その他の実行タイミングについては、以下で確認できます。
[ワークフローをトリガーするイベント Webhookイベント](https://docs.github.com/ja/free-pro-team@latest/actions/reference/events-that-trigger-workflows#webhook-%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88)

```yml
on:
  push: ...
  pull_request: ...
```

ブランチはbranchesで指定します。
指定方法はいくつかあります。

```yml
branches: [main, dev, feature]
```

```yml
branches:
  - main
  - dev
  - feature
```

job名はjobs以下に書いたものになります。

```yml
jobs:
  <ジョブ名>:
```

runs-onでjobを実行する仮想環境を指定できます。
OSとして、Windows, Mac, Ubuntuを選ぶことができます。

```yml
runs-on: <仮想環境>
```

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/c57a4683-bb4b-238b-ae55-e0d78247f67b.png' width='500'>

steps以下で仮想環境内で実行するコマンドを指定できます。

```yml
steps:
<実行したいコマンド>
```

actions/checkout@v2でリポジトリのコードを仮想環境内に移すことができます。
@以下でバージョンやコミット番号などを指定します。

```yml
- name: checkout
  uses: actions/checkout@v2 # 使用するアクションを指定 今はv2が最新
```

Rubyのセットアップはruby/setup-rubyリポジトリを使用します。
withで環境変数を設定できます。

```yml
- name: Set up Ruby
  uses: ruby/setup-ruby@ec106b438a1ff6ff109590de34ddc62c540232e0
  with:
    ruby-version: 2.6
```

最後はechoコマンド実行しています。

```yml
- name: Hello World
  run: echo Hello World
```

# まとめ
GitHub Actionsは日本語ページも存在するので、気になった方はぜひ確認してみてください！！
https://docs.github.com/ja/free-pro-team@latest/actions

actionsの例は以下に主要なものがあるそうです。
https://github.com/marketplace?type=actions

## 補足
仮想環境として、macOSやWindowsも選択できます。Linuxでは月2,000 分無料ですが、macOSでは月200 分, windowsでは月1,000 分が無料枠の上限になります。また、GitHubのpricingページにある通り、パブリックリポジトリでは制限なく使えます。

![スクリーンショット 2020-11-11 16.04.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/e4d282bd-a7fd-70ad-70df-5b24ae0aff2f.png)

![スクリーンショット 2020-11-11 16.29.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/145429cb-5e91-2181-98ff-3a739e957d81.png)