[Circle CI] Auto deploying ứng dựng trên Google Cloud
- Bài viết sẽ giải thích các tham số để có thể auto deploy 1 project lên Google Cloud. Các bước cụ thể hãy đọc theo Quickstart vì nó khá đơn giản
- Để tự động deploy được thì tài liệu đang sử dụng deploy trên Google Kubernetes Engine. Các App Engine hay Compute Engine có được hay không thì tác giả không rõ
Project Demo: https://github.com/CircleCI-Public/circleci-demo-k8s-gcp-hello-app
Docs: https://circleci.com/docs/2.0/deployment-integrations/#google-cloud
0. Yêu cầu
Bạn có thể tự deploy thủ công ứng dụng với Google Kubernetes Engine, ít nhất cũng theo hướng dẫn này
https://cloud.google.com/kubernetes-engine/docs/quickstart
1. Giải thích các tham số cấu hình
- GCLOUD_SERVICE_KEY:
<base64-encoded GCP service account key value>
Đây là giá trị mã hóa base-64 file JSON chứa key của service accout của bạn. Copy giá trị trong file auth.json
đó và đưa lên trang https://www.base64encode.org/ lấy nội dung cho vào biến này.
- GOOGLE_PROJECT_ID: e.g. hello-app-12345
- GOOGLE_CLUSTER_NAME: e.g. cluster-1 (the cluster will be created if it doesn’t yet exist)
- GOOGLE_COMPUTE_ZONE: e.g. us-central1-a
- DOCKER_IMAGE_NAME: e.g. gcr.io/hello-app-12345/hello-app (should match project id)
Giá trị hellp-app-12345 đó là project id
Tham khảo thêm tại đây1
docker push [HOSTNAME]/[PROJECT-ID]/[IMAGE]
- DELETE_CLUSTER_AT_END_OF_TEST: true|false (If set to true, the deployment’s resources including the cluster named by GOOGLE_CLUSTER_NAME will be deleted after the test. This will prevent unwanted charges incurring on your GCP account)
2. Giải thích CircleCI config
Nội dung file config: https://github.com/CircleCI-Public/circleci-demo-k8s-gcp-hello-app/blob/master/.circleci/config.yml
2.1. Build Jobs
name: Generate full image name for new docker image
Phần này chắc không cần giải thích đâu nhỉ, nó chỉ là sinh tên cho docker image
Tên này được lưu vào biến full_docker_image_name
name: Build image
Build image xây dựng được từ bước trên.
name: Push image
1 | echo $GCLOUD_SERVICE_KEY | base64 --decode --ignore-garbage > gcloud-service-key.json |
Lấy nội dung biến env GCLOUD_SERVICE_KEY đã mã hóa base 64 ở trên, nội dung file JSON được sinnh từ Google Cloud lưu vào file mới với tên gcloud-service-key.json
1
2gcloud auth activate-service-account --key-file gcloud-service-key.json
gcloud --quiet auth configure-docker
Tiếp theo là gcloud xác thực user và config docker thôi.
Chi tiết:
- https://cloud.google.com/sdk/gcloud/reference/auth/activate-service-account
- https://cloud.google.com/sdk/gcloud/reference/auth/configure-docker
name: Test local image
Bật (run) docker
2.2. Deploy Jobs
name: Deploy
Đây là các việc cần làm khi thủ công để tiến hành deploy 1 project len Google Cloud. Để deploy tự động được, bạn phải sử dụng Kubernetes Engine
Các lệnh trong Jobs này thực hiện tương tự GKE Quickstart
Đầu tiên sẽ là xác thực và cấu hình project id, zone với gcloud
1
2
3gcloud auth activate-service-account --key-file gcloud-service-key.json
gcloud --quiet config set project $GOOGLE_PROJECT_ID
gcloud --quiet config set compute/zone $GOOGLE_COMPUTE_ZONE
Bước tiếp theo là tạo hoặc kết nối với GKE cluster:1
2
3
4
5
6
7
8EXISTING_CLUSTER=$(gcloud container clusters list --format="value(name)" --filter="name=$GOOGLE_CLUSTER_NAME")
if [ "${EXISTING_CLUSTER}" != $GOOGLE_CLUSTER_NAME ]
then
# Create cluster if it doesn't already exist
gcloud --quiet container clusters create $GOOGLE_CLUSTER_NAME --num-nodes=1
else
gcloud --quiet container clusters get-credentials $GOOGLE_CLUSTER_NAME
fi
Tiếp theo là: Deploying an application to the cluster:1
2
3
4FULL_DOCKER_IMAGE_NAME=$(cat workspace/full_docker_image_name)
# Replace DOCKER_IMAGE_NAME placeholder in manifest with actual image name
KUBE_CONFIG=$(cat hello-app/manifests/helloweb-all-in-one.yaml.template | sed "s|DOCKER_IMAGE_NAME|$FULL_DOCKER_IMAGE_NAME|g")
echo "$KUBE_CONFIG" | kubectl apply -f -
Inspecting the application1
kubectl get pods
Như vậy là deploy xong rồi đó :D
name: Test deployed application
Kiểm tra xem đã deploy thành công chưa thông qua curl
và các tham số được lấy từ kubectl
command.
name: Tear down application and resources if configured (since this is a demo)
Cái này chắc khỏi cần giải thích.
3. Test auto deploy
Để thử xem nó đã tự động deploy chưa, bạn chỉ cần tạo một commit và đẩy thằng vào master thôi. Kết quả thực sự đúng như ý
https://github.com/minhnv2306/circleci-demo-k8s-gcp-hello-app/commit/dbe2cdcf49def4bd3c2ccd23ce98e39886465e36
Ngon thật.
4. Tổng kết
- Như vậy để ứng dụng Auto deploy trên CircleCI, bạn cần tìm hiểu Kubernetes Engine deploy qua các Cluster chứ không thể dùng Compute Engine deploy trên các VM Instance được.
Cần kết hợp thêm docker và push lên Container Registry nữa nhé. Đau đầu @@.
Đây mới chỉ là auto deploy ứng dụng example trên trang chủ, hi vọng bài viết tiếp theo sẽ deploy được project laravel =))
Tài liệu tham khảo
[Circle CI] Auto deploying ứng dựng trên Google Cloud
http://yoursite.com/2020/02/06/Circle-CI-Auto-deploying-ung-dung-tren-Google-Cloud/