Github Actions 入門編 (ざっくり系)


qiita に記事があまりなかったので掲載しました。

github action の概念は知っているものの、コードかけない、めんどくさい、怖いと言う方が中にはいらっしゃるのではと思います。ここではそんな人達向けに記事を書きました。あくまできっかけづくりです。

サンプルコードがあった方がわかりやすいと思うので、ここではサンプルコードと合わせて解説します。	

相当手抜きで解説しますが、ご了承願います。

## Github Actionとは

一応一言で言うと github が提供する CICD のサービスです。
制約について公式ドキュメントだったり、色々な人の記事を読んでいただければと思います。



## 格納先

基本的に GitHub Actions は全て .github/workflow の配下におきます。yml 形式です。

つまり、my_repostiory というレポジトリがあったら、`my_repository/.github/workflow/<some_work>.yml` に格納します。



## コード

### サンプルコード

サンプルがあるとわかりやすいので、それをベースに解説します。
(自分にとっての基礎を鍛えるためのいいサンプルかと思います。)

以下 Pull Request ごとにテストが走るサンプルコードです。

```yml

name: Pull_Request

on:
  pull_request:
    branches:
      - master

jobs:
  test_job:
    runs-on: ubuntu-latest
    env:
      GITHUB_TOKEN: ${{ secrets.TOKEN }}
    steps:
      - name: Setup Python
        uses: actions/setup-python@v1
        with:
          python-version: '3.8.x'

      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ secrets.REGION }}
          
      - name: Get Actions
        uses: actions/checkout@v2
        with:
        	repository: username/repo
          token: ${{ secrets.TOKEN }}
          ref: master
          
      - name: Run Test
        run: pytest
          
      - name: Get Actions From Another Repository
        uses: actions/checkout@v2
        with:
        	repository: username/repo
          token: ${{ secrets.TOKEN }}
          path: another_repo
          ref: master
          
      - name:  Run Test 2 of another repository
        run: |
          cd another_repo
          pytest
          

  deploy:
  	needs: [test_job]
    runs-on: ubuntu-latest
    steps:
      - name: Get Actions
        uses: actions/checkout@v2
        with:
        	repository: username/repo
          token: ${{ secrets.TOKEN }}
          ref: master
      - name: Get Actions
        run: |
          cd deploy_items
          bash deploy.sh


```





### 解説

#### 全体の流れ
上記が何をしているかをざっくり説明すると：

- `test_job` と `deploy` という2つのジョブがある
- `test_job` ジョブ では複数のタスクを実行している
- `deploy` ジョブ ではデプロイを実行している


#### 各要素の説明

上記のコードを図で示すと：
![Screen Shot 2020-11-29 at 17.07.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650642/109729c2-98c1-4127-0a0b-6d24c8998af6.png)



言葉で説明すると：

`on`：どのタイミングで実行するかを定義。今回の場合はPR の時であり、その中でも master ブランチのPRの時である。
`jobs` :  環境をまっさらにした時の試験単位。今回の場合は `build_job` と `deploy` のジョブを実行する時に何もない環境からスタートする。
`runs-on` : どのような環境でテストするかを定義。windows, Mac-OS も可能。[リンク](https://docs.github.com/en/actions/configuring-and-managing-workflows/configuring-a-workflow#choosing-a-runner)
`env`: 環境変数の格納場所。ジョブ実行時に各ステップで共有したい場合に使用する。
`steps ` : ジョブ内でタスクを実行する単位。レポジトリクローンしたら、ジョブが終了するまで残る。
`name` : ステップの名前。github actions で実行している際に表示する。なくても動作可能。
`uses`: 他actions の参照。従来、run 等でいろいろコマンド打ったりしないといけないがそれらの作業を回避することができる。
`run`: コマンドベースで実行する箇所。run と uses は併用不可能。
`needs` : 他のジョブに依存する時に使用可能。

以上で大体のことはわかるのではと思います。残りは公式ドキュメント等読んでいただけると幸いです。

#### actions について

ちなみに uses で定義している action にて説明すると：
`actions/setup-python@v1` : python 環境設定
`actions/checkout@v2` : レポジトリをpull する action. レポジトリを指定していなかったら、作業レポジトリをクローンする。 他のブランチやレポジトリをpull することも可能。public であれば、key はいらない。
`aws-actions/configure-aws-credentials@v1` : aws にアクセスするための設定。
今回代表的な物を用意したが、他にもいろいろ便利なアクションがあるので、ぜひ他のアクションもみてみてください。


#### その他, tips
- github secrets は 隠れ変数のことで、レポジトリの settings にて設定可能。echo したら **** と表示。
- steps の結果を参照する際に `id`を使って参照することも可能
- run の中で、環境変数を　`echo "<SOME_ENV>=<VALUE>" >> GITHUB_ENV` (前までは `echo ::set-env name=<SOME_ENV>::<VALUE>`) と設定することで他のステップで利用することも可能  ( `${{ env.<SOME_ENV> }}` )
- 環境変数に改行を含む文字をいれると `\n` が認識できない場合があるので、その場合は以下の処理を実施してみてください。

```
          text="${text//'%'/'%25'}"
          text="${text//$'\n'/'%0A'}"
          text="${text//$'\r'/'%0D'}"
```


解説は以上！

以下、おまけのサンプルコードです。



## サンプルコード



#### サンプル1  Pull Request マージ時にテストを実行

````yml
# PR 情報利用するなら・・・
on:
  pull_request:
    branches:
      - master
    types: [closed]
    

jobs:
  test_job:
    runs-on: ubuntu-latest
    if: github.event.pull_request.merged == true
    steps:
       ...
    
      - name: Extract Pull Request Info 
        id: extract_pull_request_info
        run: |
          # Get Info
          echo pull id is ${{ github.event.pull_request.number }}
          echo "PR_NUM=${{ github.event.pull_request.number }}" >> GITHUB_ENV
          echo pull request is ${{ github.event.pull_request.title }}
      
# そのまま使うなら、
on:
  push:
    branches:
      - master
````



#### サンプル2 マニュアルでテストしたいとき

```yml
name: Manual Release Workflow
on:
  workflow_dispatch:
    inputs:
      name:
        description: '名前を入力してください。'
        default: 'Watanabe'
        required: true
      age:
        description: '年齢を入力してください'
        default: '12'
        
....
      - name: Get Value
        run: |
          echo ${{ github.event.inputs.name }}
          echo ${{ github.event.inputs.age }}
```





#### サンプル3  Pull Request をマージしたときに Release を作成

```yml
on:
  pull_request:
    branches:
      - master
    types: [closed]
    
jobs:
  test_job:
    runs-on: ubuntu-latest
    if: github.event.pull_request.merged == true
    steps:
       ...
    - name: Create Release
      id: create_release
      uses: actions/create-release@v1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token
      with:
        tag_name: ${{ github.event.pull_request.title }}
        release_name: ${{ github.event.pull_request.title }}
        body: |
          ${{ github.event.pull_request.head.ref }}
        draft: false
        prerelease: false
```