[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 đây

1
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
2
gcloud 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:

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
3
gcloud 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
8
EXISTING_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
4
FULL_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 application
1
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/

Author

Ming

Posted on

2020-02-06

Updated on

2021-04-10

Licensed under

Comments