Github Actionsで遊んでみた

Github製のCI/CDツールの[Github Actions](https://help.github.com/en/articles/getting-started-with-github-actions)で遊んでみました。

# やってみたこと
コンテナイメージのビルドから、GKEへデプロイするところまで試してみました。

# 必要なもの
- Githubのアカウント
- DockerHubのアカウント
- GCPのアカウント

# 1. 前準備

GKEのクラスタを作成します。

```bash
PROJECT_ID=github-actions-250212
COMPUTE_ZONE=us-west1-a
CLUSTER_NAME=cluster-1
MACHINE_TYPE=g1-small
gcloud config set project ${PROJECT_ID}
gcloud config set compute/zone ${COMPUTE_ZONE}
gcloud container clusters create ${CLUSTER_NAME} -m ${MACHINE_TYPE}
```

次にGithubにリポジトリを適当に作成して、以下のシークレットを登録してきます。

|項目|説明|
|---|---|
|dockerhub_user|dockerhubのユーザ|
|dockerhub_pass|dockerhubのパスワード|
|gcp_key|サービスアカウントのキー(json)|

最後に、Dockerhubにリポジトリを作成しておきます。

- sirotosiko/nginx-test

# 2. リポジトリにpushする

以下のファイルを作成して、リポジトリにpushします。

```
.
├── .github
│   └── workflows
│       └── build.yml
├── Dockerfile
├── index.html
└── nginx.yml
```

GCPのプロジェクトIDとGKEのクラスタ名はベタ書きしています。

```build.yml
name: BuildDeploy

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@master
    - name: build image
      env:
        SHA: ${{ github.sha }}
      run: |
        echo $SHA
        dt=`date`
        sed -i -e "s/<DATE>/$dt/" index.html
        docker build . --tag sirotosiko/nginx-test:$SHA
    - name: run image
      run: | 
        docker run -d --rm --name nginx-test -p 80:80 sirotosiko/nginx-test
        docker ps
    - name: test image
      run: |
        curl http://localhost:80 > res
        grep "Github Actions Test" res
        status=$?
        exit $status
    - name: docker login
      env:
        DOCKERHUB_USER: ${{ secrets.dockerhub_user }}
        DOCKERHUB_PASS: ${{ secrets.dockerhub_pass }}
      run: docker login -u $DOCKERHUB_USER -p $DOCKERHUB_PASS
    - name: push image
      env:
        SHA: ${{ github.sha }}
      run: docker push sirotosiko/nginx-test:$SHA

  deploy:

    runs-on: ubuntu-latest
    needs: build
    
    steps:
    - uses: actions/checkout@master
    - name: deploy image
      env:
        GCP_KEY: ${{ secrets.gcp_key }}
        SHA: ${{ github.sha }}
      run: |
        echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" > google-cloud-sdk.list
        sudo cp google-cloud-sdk.list /etc/apt/sources.list.d
        curl https://packages.cloud.google.com/apt/doc/apt-key.gpg > apt-key.gpg
        sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add apt-key.gpg
        sudo apt-get update
        sudo apt-get install google-cloud-sdk kubectl
        echo $GCP_KEY > gcp_key.json
        gcloud auth activate-service-account --project=github-actions-250212 --key-file=gcp_key.json
        gcloud container clusters get-credentials --zone us-west1-a cluster-1
        echo $SHA
        sed -i -e "s/<IMAGE>/sirotosiko\/nginx-test:$SHA/" nginx.yml
        kubectl apply -f nginx.yml
        kubectl get pods -o yaml
```

```Dockerfile.
FROM nginx
COPY index.html /usr/share/nginx/html
```

```index.html
<!DOCTYPE html>
<html lang=en>
<head>
<title>Github Actions Test</title>
</head>
<body>
<H1>Github Actions Test</H1>
<div>
<p>modified: <DATE></p>
</div>
</body>
</html>
```

```nginx.yml
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  sessionAffinity: None
  type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: <IMAGE>
        name: nginx
        ports:
          - containerPort: 80
```

# 3. ビルドとデプロイが実行される

あとは自動で、ビルドとデプロイが実行されます。

<img width="913" alt="a1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192584/a6f7db88-cf49-689d-e892-0abd5b4dbe24.png">

<img width="915" alt="a2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192584/a693c2c2-c0da-aeae-e9a1-721815e56ca3.png">


# 4. ブラウザから確認する

<img width="360" alt="a3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192584/bf0e7132-f1de-3841-a09d-64bc2b6bfcfc.png">


# 雑感

- 使い勝手は良さそうですが、まだドキュメントが少ない感じがします。
- runの中でパイプが使えないみたい。ちょっと不便。
- job間のデータの受け渡しはどうやるんだろう？