1. ก่อนเริ่มต้น
การตั้งค่าสภาพแวดล้อมด้วยตนเอง
- ลงชื่อเข้าใช้ Google Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี
- ชื่อโครงการคือชื่อที่แสดงของผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ และคุณอัปเดตได้ทุกเมื่อ
- รหัสโปรเจ็กต์ต้องไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและจะเปลี่ยนแปลงไม่ได้ (เปลี่ยนแปลงไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันขึ้นมาโดยอัตโนมัติ ซึ่งโดยมากคุณไม่สนใจก็ได้ว่านี่คืออะไร ใน Codelab ส่วนใหญ่คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (และมักจะระบุเป็น
PROJECT_ID
) ดังนั้นหากคุณไม่ชอบรหัสนี้จะสุ่มขึ้นมาอีก 1 รหัส หรือคุณจะลองใช้รหัสของคุณเองแล้วดูว่าใช้ได้หรือไม่ จากนั้นจึง "ตรึง" ไว้หลังจากที่สร้างโปรเจ็กต์ขึ้น - ค่าที่ 3 คือหมายเลขโปรเจ็กต์ที่ API บางรายการใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 ค่าเหล่านี้ในเอกสารประกอบ
- ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของระบบคลาวด์ การทำงานในโค้ดแล็บนี้แทบจะไม่เสียค่าใช้จ่ายใดๆ เลย หากต้องการปิดใช้ทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินหลังจากบทแนะนำนี้ ให้ทําตามวิธีการ "ล้างข้อมูล" ที่แสดงอยู่ท้าย Codelab ผู้ใช้ใหม่ของ Google Cloud มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD
2. กำลังเตรียมพื้นที่ทำงาน
- เปิดเครื่องมือแก้ไข 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
- ให้สิทธิ์แก่ CloudDeploy
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) แต่ขีดจำกัดลับที่งานใน 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 ที่กำหนด Container Registry ของโปรเจ็กต์ ตรวจสอบค่าด้วยคําสั่งด้านล่าง
echo $IMAGE_REPO
- สร้างทริกเกอร์ Webhook ของ CloudBuild โดยใช้ตัวแปรที่สร้างไว้ก่อนหน้านี้ ระบบจะดึงตำแหน่งที่เก็บแอปพลิเคชันจากเนื้อหาของคำขอจาก 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
- ไปที่ที่เก็บแอปพลิเคชันและตรวจสอบ Webhook ที่กําหนดค่าใหม่
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
ตรวจสอบทริกเกอร์ CloudBuild
สคริปต์ตั้งค่าทริกเกอร์โดยอัตโนมัติ
- ตรวจสอบทริกเกอร์ Cloud Build ในคอนโซลโดยไปที่ลิงก์นี้
- ตรวจสอบประวัติการสร้างในหน้านี้