Github Actionsは良いぞ

なぜ今まで使わなかったのか

## GitHub Actionsを使い始めた
今までCodeCommitを使ってリソース管理をしていましたが、メンバーから**プルリク見にくいねん**との文句があったので、CodeCommitからGitHubに乗り換えました。
その過程で疎かにしていた開発基盤やリリース基盤の整備をしているのですが、その中で手動でデプロイするのは面倒だよね、という話になり、せっかくなので自動デプロイを取り入れようとなり、その中で使用する候補に上がったのがGitHub Actionsです。

GitHub Actionsの知見はほぼなかったのですが、着手してから1〜2時間程度で自動デプロイのActionが出来たので、ここで皆さまにその良さをご紹介しようと思います。

## GitHub Actionsの便利さ
実際に使ってみて特に便利だなと思った特徴が以下です。

1. jobがYAMLで書ける
2. デフォルトでGitHubと連携できる
3. GitHubが用意した仮想マシン上で動く
4. secretsが使える

## jobがyamlで書ける
YAML LOVEの私にとってこれは嬉しいです。
GitHub Actionsの設定はリポジトリ以下、`.github/workflows`ディレクトリにYAMLファイルを置いて、GitHub上のリポジトリにpushするだけで完結します。

以下、ハロワ

```.github/workflows/sample.yml
# This is a basic workflow to help you get started with Actions

name: Deploy

# Controls when the action will run. Triggers the workflow on push or pull request 
# events but only for the master branch
on:
  push:
    branches: [ develop ]

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  sample-deploy:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
    # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
    - uses: actions/checkout@v2

    # task
    - name: echo
      run: echo "Hello World"
```

YAMLをある程度齧ってる人は直感的にタスクが想像できるのがわかるかと思いますし、構文も非常にわかりやすくてグッドです。素敵。

## 簡単にGitHubと連携できる
GitHub Actionsを使う以上、ブランチのmergeやpushを契機にしたいと思う事がほとんどですが、その点をGitHub Actionsの記述はかなり簡易化されています。

```.github/workflows/sample.yml
# developへのpushを契機に実行
on:
  push:
    branches: [ develop ]

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  sample-deploy:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest

    # developブランチを$GITHUB_WORKSPACEにcheckout
    - uses: actions/checkout@v2
```

gitコマンドやGitHub APIを書いても良いのですが、長々と書くよりわかりやすくてスマートですよね。

## GitHubが用意した仮想マシン上で動く
GitHub Actionsは実行されると仮想マシンが一つ生成され、その上でActionsが実行されます。

`runs-on: ubuntu-latest`でUbuntuイメージが使用されているのがわかるかと思います。
なので、Ubuntuが使えるコマンドを利用して、デプロイ準備作業/デプロイ作業を定義できます。tarもscpも大抵のコマンドが動きます。インスタンスの準備は必要なし。

```yaml
    # Archive
    - name: archive package
      run: tar zcvf sample.tgz sample/*
```

今のところWindows/Ubuntu/MacOSが使える模様。詳細は以下URLのruns-onの項目をご確認ください。
https://help.github.com/ja/actions/reference/workflow-syntax-for-github-actions#

## Secretsが使える
AWSリソースにアクセスしたい、`SCP`や`SSH`したいという事もあるかと思います。
だけど、秘密鍵やDBの接続情報などをポジトリに入れる事は**極刑に値しますので**、その際に使うのがリポジトリに設定するSecretsです。
いわば、リポジトリ環境変数のようなもので、一度設定すると値は誰からも覗く事が出来なくなりますので非常に便利。リポジトリのSettingsから設定出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169808/e7b1c662-e048-7334-1e8c-f59547b7bd81.png)


で、GitHub ActionsはそのSecretsを利用する事が出来ます。書き方例は以下。

```
${{ secrets.(HOST_PASSWORD)}}
```

SSHの秘密鍵もSecretsに書いておいて、Actions実行時にid_rsaファイルへ出力して使用する、なんてことをやる方法もあります。
※参考:[GitHubの新機能「GitHub Actions」で試CI/CD](https://knowledge.sakura.ad.jp/23478/)

```
run: echo "${{ secrets.SECRET_KEY }}" > id_rsa && chmod 600 id_rsa
```

## まとめ
こんな風に、GitHubのリポジトリへのアクセス、デプロイタスク管理、実行管理が全てGitHub上で完結します。CI/CD環境を作りたいと思っていたが、Jenkinsとかめんどい、他のやつはお金がかかる、とか思っている方にはお勧めです。

一応、フリープランは実行時間2000分/月まで無料らしいのでそんな重い処理でなければ耐えられるかと思います。是非試してみてください。