Automate deployment เป็นกรรมวิธีนึง ที่เราจะทำงานต่อจาก Git ฮะ เพราะไหนๆ เราก็เอา code ของเราไปวางไว้ที่ Git แล้ว ก็ให้มัน test แล้วก็ deploy ไปเลยสิ

บล็อกนี้เลยเล่าถึงวิธีทำ automate deployment แบบง่ายๆ ใช้ Google Cloud Build กันฮะ

อ้อ ถ้าสนใจเรื่อง git พื้นฐาน ขอให้ลองอ่านบล็อกที่เคยเขียนไปแล้วข้างล่างนี้นะฮะ

มาลองเล่น Git กัน
Git เป็นเครื่องมือตัวนึงที่ทำหน้าที่เป็น Repository หรือคลังสมบัติของเรานั่นเอง ใช้เก็บรักษา source code ต่างๆ และยังอำนวยความสะดวกในการปรับปรุง หรือแก้ไขอีกด้วย

CI/CD คืออะไร

CI/CD ย่อมาจาก "Continuous Integration / Continuous Delivery" เป็นหัวใจสำคัญของ automate deployment เลยแหละ

Continuous Integration หมายความถึงการเชื่อมโยงกัน (integrate) ระหว่าง source code ใน git กับการทำ automate test ส่วน Continuous Delivery นี่คลุมไปถึงการ deliver  code ที่ทำ test เสร็จแล้วนำไป deploy

ทีนี้ ขั้นตอนที่จะบอกว่าต้องทำอะไรบ้างเนี่ย มันถูกเขียนใน build definition ฮะ เช่น ให้ทำ unit test ตามด้วย integration test แล้วค่อย deploy แล้วใครเขียน? ก็คนเขียน code น่ะแหละ ไปกำหนดเอาว่าต้องทำอะไรบ้าง


แล้ว Google Cloud Build คืออะไร

Google Cloud Build มันก็เป็น CI/CD tool ตัวนึง ท่ามกลางหลายๆ ตัว เช่น Jenkins หรือ Github Action และความที่ผมใช้ Google Cloud Platform มันก็มีเจ้านี่มาให้พร้อมแล้วอ่ะนะ

การจะเริ่มใช้งาน ก็ต้องไป enable Google Cloud Build API ก่อน

หน้านี้คือ build history เรา build อะไรไปบ้าง เห็นหมด

ส่วนอันนี้คือ trigger โชว์ทุก trigger ที่มี เราจะมาเพิ่ม ลบ แก้ไขอะไรตรงนี้ได้หมด

แล้วเรายังสามารถเล่นอะไรกับมันได้อีกเยอะ เช่น พอ build เสร็จก็สั่งให้ส่ง Google Chat notification แบบนี้เป็นต้น ถ้าสนใจเรื่องนี้ ไปตามลิงก์ข้างล่างนี้ได้เลยฮะ

(Google Cloud) Build เสร็จแล้ว ให้ทัก (Google) Chat มา
ถ้าใครที่กำลังใช้ Google Cloud Build เพื่อทำ CI และมี Google Workspace เราสามารถสร้าง process ให้มีข้อความบอกทันทีที่ Build เสร็จได้แล้วนะฮะ ตามนี้เลย

เอาล่ะ ได้เวลา เรามา deploy CI/CD pipeline ด้วย Google Cloud Build กัน


โจทย์วันนี้

เราต้องการ copy JSON file ที่อยู่ใน repo เราเนี่ยแหละ ไปไว้ที่ Google Cloud Storage และต้องตรวจสอบก่อนว่า file พวกนั้นถูกต้องตาม format JSON แล้ว

ขั้นตอนก็ควรจะเป็นว่า

  1. Verify ว่า JSON file ทั้งหมดถูกต้อง
  2. Copy JSON file ทั้งหมดไปไว้ที่ Google Cloud Storage

มาเริ่มกันเลย

Connect repo

มันก็มีหลายวิธีนะฮะ ที่เราจะเชื่อม Google Cloud Build เข้ากับ repo ของเราเอง ส่วนตัวผมใช้ Github เลยเสนอวิธีง่ายๆ สองแบบตามนี้ฮะ

1. Github App

แค่ติดตั้ง Cloud Build Github app ก็ใช้งานได้เลย

(1) Connect Repository

(2) ยืนยันตัวตนและติดตั้ง

(3) ติดตั้งที่หน้า Github page

(4) เลือก repo

2. Mirror repo

วิธีนี้คือ การที่เราสร้าง repo เสมือนเอาไว้ที่ Google Cloud Source Repository จากนั้น ทุก commit ที่เกิดขึ้นที่ repo ต้นทางก็จะโผล่มาให้เห็นที่ repo เสมือนนี้เหมือนกันฮะ รองรับทั้ง Github และ BitBucket เลยนะ

(1) create repo ที่ Cloud Source Repo

แรกสุดเลย เราจะต้อง create repo ที่ Google Cloud Source Repository กันก่อน ไปที่ https://source.cloud.google.com/ แล้วกดปุ่มสร้าง

(2) Connect external repository

(3) Authorize to Github

(4) เลือก repo

(5) Mirror เรียบร้อย

สร้าง trigger

ขั้นตอนต่อมาคือ การสร้าง trigger ไว้ทำ CI/CD job.

เราสามารถสร้างผ่าน web ก็ได้นะฮะ ที่ลิงก์นี้ https://console.cloud.google.com/cloud-build/triggers แต่บล็อกนี้ขอเสนอการทำผ่านgcloud command

1. ถ้าเราใช้ Github app

gcloud beta builds triggers create github \
--name=<TRIGGER_NAME> \
--region=<REGION> \
--repo-name=<REPO_NAME> \
--repo-owner=<OWNER_NAME> \
--branch-pattern=<BRANCH_PATTERN> \
--build-config=<CLOUDBUILD_YAML_FILEPATH>
  • TRIGGER_NAME: ตั้งชื่อ trigger ปกติจะตั้งให้สื่อ project, environment, แล้วก็ branch
  • REGION: region ของ trigger
  • REPO_NAME: ชื่อของ source repo
  • OWNER_NAME: ชื่อเจ้าของ repo
  • BRANCH_PATTERN: branch pattern เช่น ^main$ คือ branch "main" หรือ ^feature-.* คือ branches ที่ขึ้นต้นว่า "feature-"
  • CLOUDBUILD_YAML_FILEPATH: path ของ build definition ปกติจะเป็น "cloudbuild.yaml" สำหรับ Google Cloud Build ฮะ

2. ถ้าเราใช้ mirroring

gcloud beta builds triggers create cloud-source-repositories \
--name=<TRIGGER_NAME> \
--repo=<REPO_NAME> \
--branch-pattern=<BRANCH_PATTERN> \
--build-config=<CLOUDBUILD_YAML_FILEPATH>

Check trigger

สร้างแล้วก็ดูผล มันควรจะเป็นหน้าตาประมาณนี้นะฮะ

Setup Cloud Build file

เอาล่ะ ตรงนี้คือประเด็นหลักแล้ว เพราะมันคือการกำหนดว่าแต่ละขั้นของ build จะทำอะไรบ้าง แล้วแต่ละ CI/CD tool ก็มี syntax ของมันเอง อย่างเช่นอันนี้ของ Google Cloud Build

เริ่มจากต้องขั้นต้นด้วย steps แล้วตามด้วย list

แต่ละ item ใน list ควรจะมี name ของ image และ args ที่เอาไว้บอกว่าจะทำอะไรกับ image นี้

จากตัวอย่างข้างต้น เรามี 2 step นะ

  1. step แรกให้ id ว่า "check-json"
    step นี้ เราเลือกใช้ image name ว่า "gcloud" ซึ่งไม่ต้องรอ หรือ waitFor อะไรเลย เริ่มทำได้ทันที และเมื่อ image พร้อมก็สั่ง build และเข้าใช้ entrypoint "bash" จากนั้นก็ป้อน args ว่าให้ "update ตามด้วย install 'jq' และสั่ง execute 'jq empty' เพื่อ check ว่า JSON files ถูกต้องนะ"
  2. step ที่สองมี id ว่า"copy-json"
    ใช้ image name "gsutil" และกำหนดให้รอ (waitFor) step "check-json" ก่อน เมื่อ image พร้อมก็ให้ทำงานโดย copy ("cp") JSON file ไปยัง bucket ตามที่ระบุในargs

รายละเอียดเต็มๆ ไปตามได้ที่ลิงก์นี้ฮะ

Build configuration file schema | Cloud Build Documentation | Google Cloud

commit และ push

เมื่อเราพร้อมแล้ว ก็ push commit แล้วรอสักแป๊บนึง เราจะเห็นว่า Cloud Build มันทำงาน จิ้มไปดูได้ว่าผ่านรึเปล่า ไม่ผ่านก็แก้แล้ว commit ใหม่ฮะ

ส่วนถ้าเป็นกรณี Github app ก็สามารถจิ้มตรงเครื่องหมายหน้า commit ID ได้เลย มันจะบอกสถานะว่าผ่าน ก็เป็นติ๊กถูกสีฟ้า ไม่ผ่านก็กากบาทสีแดงฮะ

จิ้มแล้วมันจะเด้งมาหน้านี้ บอกรายละเอียดได้

ดู build result

เอาล่ะ ตอนนี้ก็ build ผ่าน เรามาดูผลว่า file มันควรจะไหลมาที่ bucket นะ สมบูรณ์แบบมากฮะ

อันนี้ก็เป็นตัวอย่างง่ายๆ ทำตามได้ ซึ่งเราสามารถปรับแต่งให้ซับซ้อนหรือทำงานหลายๆ อย่างได้ตามใจเราเลยฮะ


และ source code ก็สามารถดูได้ที่ repo ข้างล่างนี้ฮะ

GitHub - bluebirz/cloudbuild-sample
Contribute to bluebirz/cloudbuild-sample development by creating an account on GitHub.