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. ビルドとデプロイが実行される
あとは自動で、ビルドとデプロイが実行されます。
4. ブラウザから確認する
雑感
- 使い勝手は良さそうですが、まだドキュメントが少ない感じがします。
- runの中でパイプが使えないみたい。ちょっと不便。
- job間のデータの受け渡しはどうやるんだろう?