GitHubActionsクイックスタート

# 概要
[GitHubActions](https://github.co.jp/features/actions)はCI/CDツールとして後発にも関わらず、デファクトスタンダードと言っていいほど定着しており気になっていた。
***関連記事は山ほどあるが、クイックスタートするという観点では情報不足であったり、初心者（ワイ含む）には難しくてちょうどいい記事がないなと*** 。
#### 「それじゃ、とりあえず触ってみて初心者の速習用にワイが記事を投稿してやるぜ！」ということで、まとめてみました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">マトリックスビルドまでできた😄❗<a href="https://twitter.com/hashtag/GithubActions?src=hash&amp;ref_src=twsrc%5Etfw">#GithubActions</a> <a href="https://t.co/7f6pRpaDUE">https://t.co/7f6pRpaDUE</a></p>&mdash; LittleBear (@littlebear_6w6) <a href="https://twitter.com/littlebear_6w6/status/1550811512326852609?ref_src=twsrc%5Etfw">July 23, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#### ☆当記事で使用するコードは、私のGithubで公開しています☆彡
https://github.com/LittleBear-6w6/TryPyGitAction

# 準備
GithubActionsでテスト実行するコードを準備する。  
今回は、Pythonで作成した簡単なソースコードをテストすることにしよう。

Pythonで作成した関数をテスト対象にする。
「名字、名前、ミドルネームの３つを引数に渡すとそれぞれの頭文字を大文字にして返却する」単純なソースコード。
__「ミドルネーム？？」、欧米の方にも対応していますよ～！__

```python:テスト対象コード
def get_formatted_name(first,last,middle=''):
    """フォーマットされたフルネームを返す。"""
    if middle:
        full_name = f"{first} {middle} {last}"
    else:
        full_name = f"{first} {last}"
    return full_name.title()
```

加えて、この関数をテストするテストコードも用意しましょう！
このテストコードをGithubActionsで実行するわけですよ！

```python:テストコード
import unittest
from name_function import get_formatted_name

class NamesTestCase(unittest.TestCase):
    """name_function.pyをテストする"""

    def test_first_last_name(self):
        formatted_name = get_formatted_name('test', 'taro')
        self.assertEqual(formatted_name,'Test Taro')

    def test_first_last_middle_name(self):
        formatted_name = get_formatted_name('test' , 'taro', 'hanako')
        self.assertEqual(formatted_name, 'Test Hanako Taro')

if __name__ == '__main__':
    unittest.main()
```

### これで、GithubActionsを体験する準備は整った！

# GithubActionsを試そう！
1. GitHubで「Actions」を押す！
![GitHubActions1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793264/783ccdad-8e5c-3618-5dd1-34c049455206.jpeg)
1. Pythonで作成したテストコードを実行したいので、「set up a workflow yourself」をクリック
![GitHubActions2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793264/2565f734-7328-a379-98d0-579f69b2fb07.jpeg)
サンプルコードが表示！
![GitHubActions3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793264/d679ae2e-1b6c-234d-08b2-ef8e05803ae2.jpeg)
3.「Start commit」でサンプルコードをコミット！
### これでひとまずworkflowができたよ！
```yaml:サンプルworkflow
# This is a basic workflow to help you get started with Actions

name: CI

# Controls when the workflow will run
on:
  # Triggers the workflow on push or pull request events but only for the "main" branch
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# 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"
  build:
    # 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@v3

      # Runs a single command using the runners shell
      - name: Run a one-line script
        run: echo Hello, world!

      # Runs a set of commands using the runners shell
      - name: Run a multi-line script
        run: |
          echo Add other actions to build,
          echo test, and deploy your project.

```

### ちょっと解説
- workflowを実行するタイミングを指定しているのは？
「on」で、実行タイミングを指定する。
サンプルコードの場合は「main」ブランチに『Push』もしくは『Pull Request』されたらworkflowを実行💨
- 実行環境は？
buildの内の「runs-on」に指定する。
サンプルコードの場合は、**Ubuntuの最新版**で実行！
それ以外には、「Mac」もしくは「windows」の環境を指定できるよ。
- 実行する内容は？
steps以下に記述
処理名を「name」で指定し、実行内容を「run」に指定する。
サンプルコードの場合は、echoコマンドを実行するだけのシンプルな感じ。
- 開発したソースコードは、実行環境に自動的に配置されるの？
明示的に「git checkout」する必要がある。
でもどうやってやるの？「run」でコマンド実行？？
「uses」でできあいの優れものがあるんですよ！
__「気づいていますよ！」__ という方も多いかと思います。そういうワイもすぐ気づきました！
「uses」でできあいの優れものを使用できる！
__そうです。この部分👇__
```yaml:Checkoutのできあいの優れものを使用する
- uses: actions/checkout@v3
```
https://github.com/actions/checkout

_**「オイオイ！、Pythonのテストコードを実行するんじゃないのかよ？」**_ と思った方、

**お待たせしました！Pythonのテストコード実行に着手しますよ！**

## Pythonのテストコードを実行する
まずは環境ですな。
**初心者はこれも優れものを使いましょう！**

https://github.com/actions/setup-python

Usageを参考にサンプルコードに追記すれば、実行できちゃうんです。
書いてみるとこんな感じ(^o^)！
__折角だから複数のPythonバージョン（環境）で走らせるテスト（workflow）を作成してみたよ！__
こういうworkflowを見るとで『できるイケてるエンジニア』感出るよね(*^^*)
```yaml:Python環境の整備とテストコードの実行
jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: ['3.7','3.8','3.9','3.10']

    # 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@v3
      - uses: actions/setup-python@v4
        with:
          # python-version: '3.8'
          python-version: ${{ matrix.python-version }}
          architecture: 'x64'

      # Runs a single command using the runners shell
      - name: Run a one-line script
        run: echo Hello, world!

      # Runs a set of commands using the runners shell
      - name: Run a multi-line script
        run: |
          echo Add other actions to build,
          echo test, and deploy your project.
      
      - name: Try Python UnitTest
        run: |
          python3 --version
          python3 ./src/test_name_function.py
```

### ちょっと解説
- Python環境をセットアップ
優れものを使うよ！
その前に、テストで使用するPythonのバージョンを設定
今回は、「3.7」～「3.10」を設定してみたよ！
```yaml:Pythonのバージョンを設定
strategy:
      matrix:
        python-version: ['3.7','3.8','3.9','3.10']
```

設定したPythonバージョンをインストールした環境をビルド🔧
「uses acitons/setup-python@v4」で優れものを使用して環境をビルドする。
その際に、「with」にビルドするPythonのバージョンと環境のビット数を指定
今回は、「matrix」で使用した設定を使ってPythonのバージョンを指定して、64bits版ね！

```yml:Python環境整備
steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          # python-version: '3.8'
          python-version: ${{ matrix.python-version }}
          architecture: 'x64'
```

- テストコードを実行
もうわかってますよ！、stepsに「run」にテストコードのPythonを実行するスクリプトを記述でしょ！
今回は、マルチPython環境で実行しているのを確認するために、テストコード実行前にPythonのバージョンを表示するようにしたよ！
```yaml:テストコード実行
 - name: Try Python UnitTest
        run: |
          python3 --version
          python3 ./src/test_name_function.py
```

## 実行結果
このworkflowのymlファイルをコミットすると、CI（Actions）が実行される！
![実行結果.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793264/d291ee6b-c929-1647-a22d-1f4e0a681464.jpeg)
👇マルチのPython環境で実行できているでしょ(*^^*)！
![実行結果2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793264/f302d950-95b0-b35c-6903-62c414873a5d.jpeg)
「build(3.10）」を押して見ると、実行結果が見れるよ！
![実行結果3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793264/f045216c-249c-2384-5c9b-41e2012204f0.jpeg)
👇Pythonのテストコードもちゃんと実行できているよ😆！
![実行結果4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793264/a7b7838f-453f-454f-5452-52e7a18a30d6.jpeg)

# まとめ
実際やってみると、簡単なCIはGitHubActionsで簡単に作れる！
なぜなら、[MarketPlace](https://github.com/marketplace?type=)に優れたworkflowがあるから、それを「uses」で活用することでワークフローは簡単に作成できる。
それゆえ、我々Developerはテストコードを書くことに集中できる。
凝ったCI/CDのワークフローを作成するとなると、恐らく難しいんだろうけど。

# 参考文献
- Eric Mattes著、鈴木たかのり、安田善一郎訳、「最短距離でゼロからしっかり学ぶ Python入門　必修編」、技術評論社、2021年6月11日 初版 第3刷、P244~251