GitHub Actions を使用してデプロイ(サーバに入ってpull)するまでやってみた(前半戦)

弊社でCI/CD「Continuous Integration／Continuous Delivery」の導入を検討していて、GitHub Actionsについて、調査することにしました。

- 参考URL(WEBページ)  
https://docs.github.com/ja/actions/deployment/about-deployments/deploying-with-github-actions
https://hsmtweb.com/tool-service/github-actions.html#co-index-0
https://softwarenote.info/p3789/

- 参考URL(動画) 
https://www.youtube.com/watch?v=utUJtl0pDs0
https://www.youtube.com/watch?v=Vaslap4nHh0

## CI/CDツールとは
CI/CDを一言で言えば、一定の品質を保証しながら、素早くアプリケーションをデプロイする自動化の手法です。
CI/CDツールは有名なツールとして、GitHub Actionsの他に「Travis CI」「CircleCI」「Jenkins」などがあります。

## GitHub Actionsとは
GitHub Actionsは、GitHub上のpush（ファイルの変更履歴をアップロード）などの操作をトリガーとして、事前に定義しておいた処理を実行できます。

## ゴール
akipass-corporateプロジェクトは静的ページのコーポレートサイトであり、すでにGitHubの管理下にあることが前提で作業を進めますので、GitHubへの登録は省略しています。
デプロイとしては

_1次ゴール_
1. 弊社のコーポレートサイト(静的HTML)のソースをGitHub上のmasterブランチをプッシュ
2. チュートリアル用のワークフローが起動
3. ワークフローの結果を確認して、それぞれのワークフローを検証

_2次ゴール(次回)_
1. 弊社のコーポレートサイト(静的HTML)のソースをGitHub上のmasterブランチをプッシュ
2. プッシュを検知し、サーバからmasterブランチをpull
3. 本番環境のコーポレートサイト(静的HTML)が変更される

### 1次ゴールの作業

#### 1. .github/workfowsフォルダとyamlファイルの作成
akipass-corporateプロジェクト直下(.gitがあるところ)に「.github/workflows/learn-github-actions.yaml」を作成

中身はGitHub Actionsチュートリアル( https://docs.github.com/ja/actions/using-workflows/about-workflows )のサンプルをコピーして貼り付け

```yaml
name: learn-github-actions
run-name: ${{ github.actor }} is learning GitHub Actions
on: [push]
jobs:
  check-bats-version:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: '14'
      - run: npm install -g bats
      - run: bats -v
```

#### 2. GitHubにPush(プッシュ)して、GitHubにログイン
プッシュ後に、GitHubにログインして下記を確認
* 該当するリポジトリを選択
* Actionsタブを開く
* 設定したworkflows(左側)のファイルが出来ているのでクリック
* 右側のAll workflowsに緑のチェックボックスがついていることを確認

![7d8a644f-ee9e-4ab0-8bcb-d39c7094ffcd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669217/47a744da-150a-b2d7-10f4-248fcab00caa.png)

#### 3. 実行を確認
右側のAll workflowsで実行した箇所をクリックすると実行した結果を確認できます。

![af9a02ea-bf73-4fd8-88ad-cb41a2884d91.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669217/4d071d63-75b3-4da1-2dba-8709e0c15646.png)

#### 4. ワークフローのyamlファイルと実行についてを見ながら確認

```yaml
name: learn-github-actions
run-name: ${{ github.actor }} is learning GitHub Actions
on: [push]
jobs:
  check-bats-version:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: '14'
      - run: npm install -g bats
      - run: bats -v
```

僕が理解し難かったり、重要そうと思った箇所は太字にしています。

- name: learn-github-actions
省略可能 - GitHub リポジトリの [アクション] タブに表示されるワークフローの名前。

- run-name: ${{ github.actor }} is learning GitHub Actions
"省略可能" - ワークフローから生成されたワークフロー実行の名前。これは、リポジトリの [アクション] タブのワークフロー実行の一覧に表示されます。この例では、github コンテキストの式を使って、ワークフロー実行をトリガーしたアクターのユーザー名を表示します。 詳しくは、「GitHub Actions のワークフロー構文」を参照してください。

- **on: [push]**
このワークフローのトリガーを指定します。 この例では、push イベントを使用しているため、変更がリポジトリにプッシュされるか、pull request がマージされるたびに、ワークフロー実行がトリガーされます。 
**特定のブランチの指定もできるのでReleaseブランチにプッシュされたらデプロイを行うなども可能**

- jobs:
learn-github-actions ワークフローで実行されるすべてのジョブをグループ化します。

- check-bats-version:
check-bats-version という名前のジョブを定義します。 子キーは、ジョブのプロパティを定義します。

- **runs-on: ubuntu-latest**
Ubuntu Linux ランナーの最新バージョンで実行されるようにジョブを構成します。 これは、ジョブが GitHub によってホストされている新しい仮想マシンで実行されるということです。
**つまり、この作業GitHub Actionsに定義された作業をどの仮想マシンでやるかということです。
仮想マシンはMacOSやWindowsも選べたりするので、ローカルのことかと思ってしまって混乱した**

- steps:
check-bats-version ジョブで実行されるすべてのステップをグループ化します。 このセクションで入れ子になった各項目は、個別のアクションまたはシェル スクリプトです。

- **uses: actions/checkout@v3**
usesはGitHubが提供しているactionを実行してくれるようです。
actions/checkout アクションの v3 を実行することを指定します。 これは、リポジトリをランナーにチェックアウトするアクションであり、コードに対してスクリプトまたは他のアクション (ビルド ツールやテスト ツールなど) を実行できます。 チェックアウト アクションは、リポジトリのコードに対してワークフローが実行されるたびに使用する必要があります。

- with
```
  - uses: actions/setup-node@v3
      with:
        node-version: '14'
```
指定されたバージョン (この例では、v14 を使用) の Node.js をインストールします。 これにより、node と npm の両方のコマンドが PATH にプッシュされます。

- **run: npm install -g bats**
runはusesと違って自分で実行するコマンドを記述します。
run キーワードは、ランナーでコマンドを実行するようにジョブに指示します。 この場合は、npm を使用して bats ソフトウェア テスト パッケージをインストールします。

- **run: bats -v**
最後に、ソフトウェアのバージョンを出力するパラメーターを指定して bats を実行します。
ワークフロー実行時の下記にあたる部分になります。


```
Run bats -v
Bats 1.9.0
```

### 2次ゴール(次回)の作業

基礎はわかったので、それではいよいよ。
実際の簡単なデプロイをやってみたいと思いますが、、、、次回に持ち越しです。


## 今後実現したいこと
難易度が低い順に実現したいと考えています。

- 株式会社サルのコーポレートサイトとアキパスLPページのデプロイをGitHub Actionsで自動化
- お客さんのサイトのSFTPでのアップをGitHub Actionsで自動化
- お客さんのLaravelサイトのアップをSSHで入ってからのgit pullでのデプロイをGitHub Actionsで自動化

下記はさらに今後の課題
- アキパスの管理画面のデプロイをGitHub Actionsで自動化
- アキパスのiOS/AndroidのソースをGitHub Actionsで自動化