1. ก่อนเริ่มต้น
การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง
- ลงชื่อเข้าใช้ Google Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี



- ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ โดยเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ และคุณสามารถอัปเดตได้ทุกเมื่อ
- รหัสโปรเจ็กต์ต้องไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและเปลี่ยนแปลงไม่ได้ (เปลี่ยนไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งโดยปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นคืออะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (และโดยทั่วไปจะระบุเป็น
PROJECT_ID) ดังนั้นหากไม่ชอบรหัสที่สร้างขึ้น ให้สร้างรหัสแบบสุ่มอีกรหัส หรือจะลองใช้รหัสของคุณเองและดูว่ามีรหัสนั้นหรือไม่ก็ได้ จากนั้นจะ "หยุด" หลังจากสร้างโปรเจ็กต์แล้ว - นอกจากนี้ยังมีค่าที่ 3 คือหมายเลขโปรเจ็กต์ ซึ่ง API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 นี้ได้ในเอกสารประกอบ
- จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตาม Codelab นี้ไม่ควรมีค่าใช้จ่ายมากนัก หรืออาจไม่มีเลย หากต้องการปิดแหล่งข้อมูลเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ ให้ทำตามวิธีการ "ล้างข้อมูล" ที่ตอนท้ายของ Codelab ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD
2. การเตรียม Workspace
- เปิดโปรแกรมแก้ไข Cloud Shell โดยไปที่ URL ต่อไปนี้
https://ide.cloud.google.com
- ตรวจสอบว่าได้ตั้งชื่อโปรเจ็กต์ใน CLI แล้ว
gcloud config set project {{project-id}}
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
- เปิดใช้ API
gcloud services enable \
cloudbuild.googleapis.com \
secretmanager.googleapis.com
- ให้สิทธิ์แก่ Cloud Deploy
gcloud projects add-iam-policy-binding --member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" --role roles/clouddeploy.admin ${PROJECT_ID}
gcloud projects add-iam-policy-binding --member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" --role roles/container.developer ${PROJECT_ID}
gcloud projects add-iam-policy-binding --member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" --role roles/iam.serviceAccountUser ${PROJECT_ID}
gcloud projects add-iam-policy-binding --member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" --role roles/clouddeploy.jobRunner ${PROJECT_ID}
- ในหน้าต่างเทอร์มินัล ให้โคลนแหล่งที่มาของแอปพลิเคชันด้วยคำสั่งต่อไปนี้
git clone https://github.com/GoogleCloudPlatform/software-delivery-workshop.git
- เปลี่ยนเป็นไดเรกทอรีและตั้งค่าพื้นที่ทำงาน IDE เป็นรูทของที่เก็บ
cd software-delivery-workshop && rm -rf .git
cd delivery-platform && cloudshell workspace .
3. การใช้เทมเพลตแอปที่กำหนดไว้ล่วงหน้าและเทมเพลตที่กำหนดเอง
นักพัฒนาแอปควรเลือกจากชุดเทมเพลตที่ใช้กันทั่วไปภายในองค์กรได้ กระบวนการเริ่มต้นใช้งานจะสร้างชุดที่เก็บเทมเพลตแบบรวมศูนย์ซึ่งจัดเก็บไว้ในบัญชี GitHub ในขั้นตอนต่อๆ ไป ระบบจะคัดลอกและแก้ไขที่เก็บเทมเพลตเหล่านี้เพื่อใช้เป็นฐานสำหรับแอปพลิเคชันใหม่ สำหรับแล็บนี้ คุณจะต้องเริ่มต้นที่เก็บเทมเพลตด้วยโครงสร้างตัวอย่างที่ระบุไว้ที่นี่ คุณเพิ่มเทมเพลตของตัวเองได้โดยเพิ่มโฟลเดอร์เพิ่มเติมตามตัวอย่าง
ในขั้นตอนนี้ คุณจะสร้างที่เก็บของคุณเองเพื่อเก็บเทมเพลตแอปจากไฟล์ตัวอย่างที่ให้ไว้ เรามีสคริปต์ตัวช่วยเพื่อลดความซับซ้อนในการโต้ตอบกับ GitHub
ขั้นตอนเหล่านี้เป็นขั้นตอนแบบครั้งเดียวที่ใช้ในการป้อนข้อมูลที่เก็บเทมเพลต ขั้นตอนในอนาคตจะใช้ที่เก็บเหล่านี้อีกครั้ง
กำหนดค่าการเข้าถึง GitHub
ขั้นตอนในบทแนะนำนี้จะเรียกใช้ GitHub API เพื่อสร้างและกำหนดค่าที่เก็บ คุณจะต้องใช้ชื่อผู้ใช้ GitHub และโทเค็นเพื่อการเข้าถึงส่วนบุคคลในขั้นตอนต่างๆ ที่จะตามมา สคริปต์ด้านล่างจะช่วยให้คุณได้รับค่าและจัดเก็บเป็นตัวแปรในเครื่องเพื่อใช้ในภายหลัง
source ./onboard-env.sh
echo Git Username: $GIT_USERNAME
echo Git Base URL: $GIT_BASE_URL
สร้างที่เก็บเทมเพลตแอป
เรามีเทมเพลตแอปพลิเคชันตัวอย่างมาให้พร้อมกับแล็บนี้เพื่อเป็นตัวอย่างวิธีผสานรวมเทมเพลตฐานของคุณเอง ในขั้นตอนนี้ คุณจะสร้างสำเนาของไฟล์เหล่านี้ในรีโปชื่อ mcd-app-templates ในบัญชี GitHub ของคุณ
- คัดลอกเทมเพลตไปยังไดเรกทอรีการทำงาน
cp -R $BASE_DIR/resources/repos/app-templates $WORK_DIR
cd $WORK_DIR/app-templates
- สร้างที่เก็บข้อมูลระยะไกลที่ว่างเปล่าในบัญชี GitHub
$BASE_DIR/scripts/git/gh.sh create mcd-app-templates
- พุชที่เก็บเทมเพลตไปยังที่เก็บระยะไกล
git init && git symbolic-ref HEAD refs/heads/main && git add . && git commit -m "initial commit"
git remote add origin $GIT_BASE_URL/mcd-app-templates
git push origin main
- ล้างไดเรกทอรีที่ใช้งานอยู่
cd $BASE_DIR
rm -rf $WORK_DIR/app-templates
สร้างที่เก็บการกำหนดค่าพื้นฐานที่แชร์
บทแนะนำนี้ใช้เครื่องมือที่ชื่อ Kustomize ซึ่งใช้ไฟล์การกำหนดค่าพื้นฐานที่แชร์โดยหลายทีม จากนั้นจะซ้อนทับการกำหนดค่าเฉพาะแอปพลิเคชันไว้ด้านบน ซึ่งช่วยให้ทีมแพลตฟอร์มปรับขนาดในหลายทีมและสภาพแวดล้อมได้
ในขั้นตอนนี้ คุณจะสร้างที่เก็บการกำหนดค่าที่แชร์ชื่อ mcd-shared_kustomize จากตัวอย่างที่ให้ไว้
- คัดลอกเทมเพลตไปยังไดเรกทอรีการทำงาน
cp -R $BASE_DIR/resources/repos/shared-kustomize $WORK_DIR
cd $WORK_DIR/shared-kustomize
- สร้างที่เก็บข้อมูลระยะไกลที่ว่างเปล่าในบัญชี GitHub
$BASE_DIR/scripts/git/gh.sh create mcd-shared_kustomize
- พุชที่เก็บเทมเพลตไปยังที่เก็บระยะไกล
git init && git symbolic-ref HEAD refs/heads/main && git add . && git commit -m "initial commit"
git remote add origin $GIT_BASE_URL/mcd-shared_kustomize
git push origin main
- ล้างไดเรกทอรีที่ใช้งานอยู่
cd $BASE_DIR
rm -rf $WORK_DIR/shared-kustomize
เมื่อสร้างที่เก็บเทมเพลตแล้ว คุณก็พร้อมที่จะใช้ที่เก็บเหล่านั้นเพื่อสร้างอินสแตนซ์แอป
4. การสร้างอินสแตนซ์ใหม่ของแอปพลิเคชัน
การสร้างแอปพลิเคชันใหม่จากเทมเพลตมักจะต้องมีการสลับตัวแปรตัวยึดตำแหน่งกับค่าจริงในหลายไฟล์ในโครงสร้างเทมเพลต เมื่อการแทนที่เสร็จสมบูรณ์ ระบบจะสร้างที่เก็บข้อมูลใหม่สำหรับอินสแตนซ์แอปใหม่ ซึ่งเป็นที่เก็บอินสแตนซ์ของแอปที่นักพัฒนาแอปจะโคลนและใช้ในการพัฒนาในแต่ละวัน
ในขั้นตอนนี้ คุณจะแทนที่ค่าในเทมเพลตแอปและโพสต์ไฟล์ที่ได้ไปยังที่เก็บข้อมูลใหม่
กำหนดชื่อสำหรับแอปพลิเคชันใหม่
export APP_NAME=my-app
ดึงข้อมูลที่เก็บเทมเพลต Golang
cd $WORK_DIR/
git clone -b main $GIT_BASE_URL/mcd-app-templates app-templates
rm -rf app-templates/.git
cd app-templates/golang
แทนที่ค่าตัวยึดตำแหน่ง
ความต้องการที่พบบ่อยที่สุดอย่างหนึ่งในการเริ่มต้นใช้งานคือการสลับตัวแปรในเทมเพลตกับอินสแตนซ์จริงที่ใช้ในแอปพลิเคชัน เช่น การระบุชื่อแอปพลิเคชัน คำสั่งต่อไปนี้จะสร้างอินสแตนซ์ของไฟล์ .tmpl ทั้งหมดที่มีค่าที่จัดเก็บไว้ในตัวแปรสภาพแวดล้อม
for template in $(find . -name '*.tmpl'); do envsubst < ${template} > ${template%.*}; done
สร้างที่เก็บข้อมูลใหม่และจัดเก็บไฟล์ที่อัปเดต
- สร้างที่เก็บข้อมูลระยะไกลที่ว่างเปล่าในบัญชี GitHub
$BASE_DIR/scripts/git/gh.sh create ${APP_NAME}
- พุชที่เก็บเทมเพลตไปยังที่เก็บระยะไกล
git init && git symbolic-ref HEAD refs/heads/main && git add . && git commit -m "initial commit"
git remote add origin $GIT_BASE_URL/${APP_NAME}
git push origin main
เมื่อสร้างอินสแตนซ์แอปแล้ว ก็ถึงเวลาติดตั้งใช้งานการสร้างอย่างต่อเนื่อง
5. การกำหนดค่าการดำเนินการไปป์ไลน์อัตโนมัติ
ส่วนกลางของระบบการผสานรวมอย่างต่อเนื่องคือความสามารถในการดำเนินการตรรกะของไปป์ไลน์ตามเหตุการณ์ที่มาจากระบบควบคุมแหล่งที่มา เมื่อนักพัฒนาซอฟต์แวร์คอมมิตโค้ดในที่เก็บ เหตุการณ์จะเริ่มทำงานและกำหนดค่าให้ทริกเกอร์กระบวนการในระบบอื่นๆ ได้
ในขั้นตอนนี้ คุณจะกำหนดค่า GitHub ให้เรียกใช้ Google Cloud Build และเรียกใช้ไปป์ไลน์ทุกครั้งที่ผู้ใช้คอมมิตหรือติดแท็กโค้ดในที่เก็บ
เปิดใช้การเข้าถึงที่ปลอดภัย
คุณจะต้องมี 2 องค์ประกอบเพื่อกำหนดค่าการเข้าถึงไปป์ไลน์แอปพลิเคชันอย่างปลอดภัย คีย์ API และคีย์ลับที่ไม่ซ้ำกันสำหรับไปป์ไลน์
คีย์ API
คีย์ API ใช้เพื่อระบุไคลเอ็นต์ที่เรียกใช้ API ที่ระบุ ในกรณีนี้ ไคลเอ็นต์จะเป็น GitHub แนวทางปฏิบัติแนะนำที่ไม่ได้กล่าวถึงในที่นี้คือการล็อกขอบเขตของคีย์ API ให้เฉพาะ API ที่ไคลเอ็นต์จะเข้าถึง คุณสร้างคีย์ในขั้นตอนก่อนหน้า
- คุณตรวจสอบคีย์ได้โดยคลิกลิงก์นี้
- คุณตรวจสอบได้ว่าได้ตั้งค่าแล้วโดยเรียกใช้คำสั่งต่อไปนี้
echo $API_KEY_VALUE
ข้อมูลลับของไปป์ไลน์
ระบบจะใช้ข้อมูลลับเพื่อให้สิทธิ์ผู้โทรและตรวจสอบว่าผู้โทรมีสิทธิ์ในงานเป้าหมายของ Cloud Build ที่เฉพาะเจาะจง คุณอาจมีที่เก็บ 2 แห่งใน GitHub ซึ่งควรมีสิทธิ์เข้าถึงเฉพาะไปป์ไลน์ของตัวเอง แม้ว่า API_KEY จะจำกัด API ที่ github ใช้ได้ (ในกรณีนี้คือการเรียกใช้ Cloud Build API) แต่ Secret จะจำกัดงานใน Cloud Build API ที่ไคลเอ็นต์เรียกใช้ได้
- กำหนดชื่อ ตำแหน่ง และค่าของข้อมูลลับ
SECRET_NAME=${APP_NAME}-webhook-trigger-cd-secret
SECRET_PATH=projects/${PROJECT_NUMBER}/secrets/${SECRET_NAME}/versions/1
SECRET_VALUE=$(sed "s/[^a-zA-Z0-9]//g" <<< $(openssl rand -base64 15))
- สร้างข้อมูลลับ
printf ${SECRET_VALUE} | gcloud secrets create ${SECRET_NAME} --data-file=-
- อนุญาตให้ Cloud Build อ่านข้อมูลลับ
gcloud secrets add-iam-policy-binding ${SECRET_NAME} \
--member=serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-cloudbuild.iam.gserviceaccount.com \
--role='roles/secretmanager.secretAccessor'
สร้างทริกเกอร์ Cloud Build
ทริกเกอร์ Cloud Build คือการกำหนดค่าที่จะเรียกใช้กระบวนการ CICD จริงๆ
งานนี้ต้องระบุค่าคีย์ 2-3 ค่าเมื่อสร้างเพื่อให้กำหนดค่าทริกเกอร์ได้อย่างถูกต้อง
- กำหนดชื่อของทริกเกอร์และตำแหน่งของไฟล์การกำหนดค่า
export TRIGGER_NAME=${APP_NAME}-clouddeploy-webhook-trigger
export BUILD_YAML_PATH=$WORK_DIR/app-templates/golang/build/cloudbuild-cd.yaml
- กำหนดตำแหน่งของที่เก็บการกำหนดค่าพื้นฐานที่แชร์
export KUSTOMIZE_REPO=${GIT_BASE_URL}/mcd-shared_kustomize
- มีการตั้งค่าตัวแปรในสคริปต์ onboard-env.sh ซึ่งกำหนดรีจิสทรีคอนเทนเนอร์ของโปรเจ็กต์ ตรวจสอบค่าด้วยคำสั่งด้านล่าง
echo $IMAGE_REPO
- สร้างทริกเกอร์ Webhook ของ Cloud Build โดยใช้ตัวแปรที่สร้างไว้ก่อนหน้านี้ ระบบจะดึงตำแหน่งที่เก็บแอปพลิเคชันจากเนื้อหาของคำขอจาก GitHub ค่าด้านล่างอ้างอิงถึงเส้นทางในเนื้อหาคำขอที่ค่าดังกล่าวอยู่
gcloud alpha builds triggers create webhook \`--name=${TRIGGER_NAME} \` `--substitutions='_APP_NAME='${APP_NAME}',_APP_REPO=$(body.repository.git_url),_CONFIG_REPO='${GIT_BASE_URL}'/'${CLUSTER_CONFIG_REPO}',_DEFAULT_IMAGE_REPO='${IMAGE_REPO}',_KUSTOMIZE_REPO='${GIT_BASE_URL}'/'${SHARED_KUSTOMIZE_REPO}',_REF=$(body.ref)' \` `--inline-config=$BUILD_YAML_PATH \` `--secret=${SECRET_PATH}` - ตรวจสอบทริกเกอร์ Cloud Build ที่สร้างขึ้นใหม่ในคอนโซลโดยไปที่ลิงก์นี้
- กำหนดตัวแปรสำหรับ URL ของปลายทาง ซึ่ง GitHub จะใช้ในขั้นตอนถัดไป
WEBHOOK_URL="https://cloudbuild.googleapis.com/v1/projects/${PROJECT_ID}/triggers/${TRIGGER_NAME}:webhook?key=${API_KEY_VALUE}&secret=${SECRET_VALUE}"
กำหนดค่าเว็บฮุค GitHub
- กำหนดค่าเว็บฮุคใน GitHub
$BASE_DIR/scripts/git/gh.sh create_webhook ${APP_NAME} $WEBHOOK_URL
- ไปที่ที่เก็บแอปพลิเคชันและตรวจสอบเว็บบุ๊กที่กำหนดค่าใหม่
REPO_URL=${GIT_BASE_URL}/${APP_NAME}/settings/hooks
echo $REPO_URL
ตอนนี้คุณได้ทำตามขั้นตอนทั้งหมดที่จำเป็นในการสร้างแอปพลิเคชันใหม่ด้วยตนเองแล้ว ก็ถึงเวลาที่จะทำให้กระบวนการนี้เป็นแบบอัตโนมัติในสคริปต์
6. การทำให้ขั้นตอนการเริ่มต้นใช้งานทั้งหมดเป็นแบบอัตโนมัติ
ในทางปฏิบัติ การดำเนินการแต่ละขั้นตอนข้างต้นสำหรับแอปพลิเคชันใหม่ทุกรายการนั้นเป็นไปไม่ได้ แต่ควรนำตรรกะไปรวมไว้ในสคริปต์เพื่อให้เรียกใช้ได้ง่าย ขั้นตอนข้างต้นรวมอยู่ในสคริปต์ให้คุณใช้งานแล้ว
ในขั้นตอนนี้ คุณจะใช้สคริปต์ที่ให้ไว้เพื่อสร้างแอปพลิเคชันใหม่
สร้างแอปพลิเคชันใหม่
- ตรวจสอบว่าคุณอยู่ในไดเรกทอรีที่ถูกต้อง
cd $BASE_DIR
- สร้างแอปพลิเคชันใหม่
export APP_NAME=demo-app
./app.sh create ${APP_NAME}
ระบบจะดำเนินการตามขั้นตอนทั้งหมดโดยอัตโนมัติ
ตรวจสอบที่เก็บ GitHub
ตอนนี้คุณจะตรวจสอบที่เก็บใหม่ใน Github ได้แล้ว
- เรียก URL ที่เก็บ GitHub โดยเรียกใช้คำสั่งต่อไปนี้
echo ${GIT_BASE_URL}/demo-app
- เปิด URL ด้วยเว็บเบราว์เซอร์เพื่อตรวจสอบแอปพลิเคชันใหม่
- ดูตัวอย่างที่ตัวแปรเทมเพลตถูกแทนที่ด้วยค่าอินสแตนซ์ตามที่แสดงใน URL ด้านล่าง
echo ${GIT_BASE_URL}/demo-app/blob/main/k8s/prod/deployment.yaml#L24
- ตรวจสอบเว็บฮุคที่กำหนดค่าไว้ที่ URL ด้านล่าง
echo ${GIT_BASE_URL}/demo-app/settings/hooks
ตรวจสอบทริกเกอร์ Cloud Build
สคริปต์ตั้งค่าทริกเกอร์โดยอัตโนมัติ
- ตรวจสอบทริกเกอร์ Cloud Build ใน Console โดยไปที่ลิงก์นี้
- ดูประวัติการสร้างในหน้านี้