Github Actionsを使ってみよう！

# Githuub Actionとは？
[Github Actions](https://github.com/features/actions)はGitHubが提供してくれる仮想のサーバーで、使っているレポジトリを利用していろいろな作業（バッチ・CI/CD・UnitTest・Buildその他）を行えるサービスである

紹介文を見るとソフトウェアWorkFlowを自動化できるようにサポートしてくれるツールて書かれてる

### プラン
・Public Repositoryは条件付きの無料
・Private Repositoryは[リンク](https://docs.github.com/en/github/setting-up-and-managing-billing-and-payments-on-github/about-billing-for-github-actions)参考

### Github Actionsの基本概念
- Github ActionsはWorkFlow、Event、Job、Step、Actions、Runnerで構成されてる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76353/34cbad99-0360-ad67-6cac-7b5f93280d71.png)
1. WorkFlow
    - 複数のJobで構成されてる、EventをCatchする
    - YAMLで作成する
    - Project Root Directoryの.github/workflows内に配置する
2. Event
    - WorkFlowを実行する[トリガー](https://docs.github.com/en/actions/reference/events-that-trigger-workflows#external-events-repository_dispatch)
    - Github内で発生してるほとんどのEventはトリガーにできる
    - WebHook Event
    - 特定ブランチを1個・複数指定可能
3. Job
    - 複数のStepで構成され、仮想環境のインスタンス内で実行されるもの
    - 他のJobとの依存関係を作ったり、独立的に並列実行も可能
4. Step
    - Jobの中でSequentialに実行されるプロセス単位
    - ファイルシステムを利用してお互いの情報が共有できる
    - コマンドを叩いたり、Actionsを実行することが可能な単位
4. Actions
    - WorkFlowで一番小さいBlock（ブロック）
    - Jobを作るためにはStepたちを組み合わせるのが買おう
    - 再利用が可能なComponentと言える
    - 個人的に作ったActionwo利用することも可能だし、MarketPlaceに共有されてる他人のActionsも利用可能
5. Runner
    - Github Action Runnerアプリケーションがインストールされたマシンで、WorkFlowが実行されるインスタンス
    - GithubでHostingしてくれるGithub-hosted runnerと直接HostingするSelf-hosted runnerがある
    - Github-hosted runnerはAzureのStandard_DS2_v2でｖCPU 2,メモリは７GB、仮ストレジ14GB構成
    - ubuntu(16.04LTS, 18.04LTS, 20.04LTS）
    - Windows Server 2007
    - Mac OS Catalina


### サンプル
```yaml
# .github/
#      workflows/
#              main.yml
name: my first workflow              # workflow 名
on: push                             # event trigger on push

jobs:
  build:                             # job id
    name: Hello world action         # job 名
    runs-on: ubuntu-latest           # 仮想環境指定（Windows Server, Ubuntu, Mac OSをサポートする）
    steps:
    - name: checkout source code     # step 01 名
      uses: actions/checkout@master  # Source Code checkout
    - name: say hello                # step 02 名
      run: echo "hello world"        # linux command 実行

```
次のファイルを```.github/workflows``` ディレクトリ配下に```main.yaml```ていう名前で保存する。
一番基本になるWorkFlowである。
該当WorkFlowは簡単にUbuntu環境上で、該当されるGithubレポジトリをCheckoutしてHelloworldを標準出力する例文である。

```shell
git add .github/workflows/main.yml
git commit -m "my first actions workflow"
git push origin master
```

GithubのActionsタブを見たら、下記のようにWorkFlowが実行されることが確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76353/1cdd73dc-2c81-e718-e502-8f70d90a378b.png)
結局基本はWorkflowをどのように作るのかだ。より細かいWorkFlowの構成・作成方法については[リンク](https://docs.github.com/en/actions/configuring-and-managing-workflows/configuring-and-managing-workflow-files-and-runs)を確認

## 自分のActionを作成してみよう！
先に```hello-workd-docker-action```ていうGithubのPublicレポジトリを作成する。
そして、該当レポジトリをPullする。

```shell
git clone https://github.com/$USERNAME/hello-github-actions.git
cd hello-github-actions
```
該当レポジトリに ```entrypoint.sh```, ```Dockerfile```, ```action.yml``` ファイル3個を作成する予定。

```sh
vi entrypoint.sh

## ===== file 
#!/bin/sh -l

who=${1:-world}
echo "Hello" $who
```
利用者から標準入力していただいたものを標準出力でConsoleに出漁ｌする簡単なActionである。これを実行可能なScriptとして変換する。

```sh
chmod +x entrypoint.sh
```
そして、このScriptをDocker　Containerで実行してくれる```Dockerfile```を作成する

```shell
vi Dockerfile
## ===== file
FROM alpine:3.10

COPY entrypoint.sh /entrypoint.sh

ENTRYPOINT [ "/entrypoint.sh" ]
```

これで準備は全部できた。次にGithub Actionsで該当DockerイメージをStepで活用できるようしてくれる action.ymlファイルを作成する

```yaml
vi .github/workflow/action.yml
## === file
name: 'Hello World'               # action 名
description: 'Greet someone'      # 簡単な説明
inputs:
  who-to-greet:                   # id of input    
    description: 'Who to greet'
    required: true
    default: 'World'
runs:
  using: 'docker'                 # Dockerの利用を名詩
  image: 'Dockerfile'             # Dockerfileを利用してイメージを作成
  args:                           # docker run に渡すパラメータ
    - $
```

今まで作成したファイルのディレクトリの構成は下記のよう

```sh
hello-github-actions/
              entrypoint.sh
              Dockerfile
              action.yml
```

このActionをWorkflowで接近するように作成したものをGithubにUpする

```sh
git add .
git commit -m "Testing my first GitHub Action"
git push origin master
```

これで```hello-github-actions```レポジトリを含めどのGithub Action Workflowでも今回作成したActionを利用して使えるようになる。

```yaml
on: push

jobs:
  hello_world_job:
    runs-on: ubuntu-latest
    name: A job to say hello
    steps:
    - name: Hello world action step
      id: hello
      uses: $USERNAME/hello-world-docker-action@master
      with:
        who-to-greet: 'Mona the Octocat'
```

## 整理
個人的に
・GithubをメインのVCSで使ってる
・CI/CD環境の準備で悩んでる
・新しくCI/CD環境を作成する必要がある
ぐらいの悩みがあれば、Github Actionsは素晴らしいツールになると思います。

Pull Request内でコメントを自動で作成したり、Code Coverage結果をPull Requestページにファイルとしてアップロードしたり、AWS・GCP・K8ｓなど外部サービスとの連携、バッチなどのスケジューリングなどでいろいろな方法での使い方が存在し、[market place](https://github.com/marketplace)で自分たちのサービスで利用してるツールを探したり・自分が作成したものを共有したりするのができます。

ご検討中のであれば、ぜひ使ってみましょうー