LoginSignup
14
8

More than 3 years have passed since last update.

Github Actionsで遊んでみた

Last updated at Posted at 2019-08-18

Github製のCI/CDツールのGithub Actionsで遊んでみました。

やってみたこと

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

必要なもの

  • Githubのアカウント
  • DockerHubのアカウント
  • GCPのアカウント

1. 前準備

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

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. ビルドとデプロイが実行される

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

a1.png

a2.png

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

a3.png

雑感

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
8