Github Actions เขียนดี ๆ ก็ประหยัดได้

ถ้าต้องเลือกระหว่างความสวยงามกับค่าใช้จ่าย ผมเลือกค่าใช้จ่ายนะ 😏

Siwawes Wongcharoen
3 min readOct 2, 2019

หลังจากใช้เวลากับ Github Actions มาซักพัก ก็ได้พบว่า เฮ้ย ถ้าเรายอมที่จะลดความสวยงามลง โดยไม่แบ่ง Jobs ออกเป็นหลาย ๆ Jobs และพยายามไม่ใช้ Action หลายตัวเกินไป เราจะสามารถประหยัดเวลาที่ใช้ไปได้พอสมควรเลยนะ

ก่อนที่จะไปไกล ถ้าใครยังไม่รู้จัก Github Actions ก็ลองอ่านเพิ่มเติมได้ที่นี่นะครับ

Github Actions

ตัวอย่างที่จะใช้เป็นตัวอย่าง คือการทำ Workflow ให้ทำงานดังต่อไปนี้

  1. Build Nuxt.js application
  2. ทำเป็น Docker image
  3. Push ตัว Docker image เข้า Google Cloud Container Registry
  4. สั่ง Deploy Cloud Run

ไม่งงกันนะครับ 👌👌👌

สร้าง Workflow

ในช่วงที่ ลองหาทางทำ Workflow ก็ เจอตัวอย่างที่น่าสนใจ คือ Deploying projects to Cloud Run using GitHub Actions และ Publish your Cloud Run App with GitHub Actions ซึ่งทั้งคู่ เน้นการใช้ Actions ซึ่งผมเองก็คิดว่ามันก็สวยดีนะ จึงลองเอามาเขียนเป็นของตัวเอง ได้แบบนี้

แบ่งเป็น 2 Jobs ใหญ่ ใช้ Action สวย ๆ แต่พอรัน Workflow จริง… โอ้ว ซัดไป 11 นาทีกว่า ๆ แบบนี้ไม่ดีแน่ครับ

ใช้เวลาไป 11 นาที 14 วินาที

ลองไปพิจารณาแต่ละ Step กันครับ

Job: build_and_push_to_gcp
Job: deploy_to_cloud_run

จะเห็น Build actions/... เต็มไปหมด นอกจากนี้ ถ้ามี Action เดียวกัน แต่อยู่คนละ Job ก็ต้องทำซำ้ด้วย แบบนี้ไม่น่าจะดีครับ เพราะในช่วง Beta ทาง Github ใจดี ให้ใช้ฟรีแค่ 2,000 นาทีต่อเดือน นั่นคือเราจะ Run workflow นี้ทิ้ง ๆ ขว้าง ๆ ได้ ประมาณเกือบ 200 ครั้ง เท่านั้นเองครับ

ปรับปรุง Workflow

เนื่องจาก Workflow ที่ผมใช้งาน หลัก ๆ แล้ว ต้องการแต่ใช้ คำสั่ง Docker เพื่อให้ Build image และ Push image ได้ นอกจากนี้ ยังต้องใช้คำสั่ง gcloud เพื่อให้ Push image เข้า GCP และสั่ง Deploy Cloud Run ได้

อ่ะ ถ้าแบบนี้ เอา Image google/cloud-sdk มาใช้ก็สิ้นเรื่องนี่นา ลองปรับตัว Workflow ใหม่ ได้แบบนี้ครับ

จุดที่เปลี่ยนหลัก ๆ คือ สั่งให้ใช้ Base image เป็น google/cloud-sdk และรวบ Job ให้เหลือ Job เดียว แล้วความมหัศจรรย์ก็เกิดขึ้นครับ

ใช้เวลาไป 6 นาที 29 วินาที

เมื่อปรับปรุง Workflow ใหม่แล้ว ใช้เวลาเพียง 6 นาที กว่า ๆ เรียกได้ว่า ใช้เวลาลดลงแทบจะครึ่งหนึงเลยครับ ลองไปพิจารณาแต่ละ Step กันครับ

Job: build_and_push_to_gcp_and_deploy_to_cloud_run

จะเห็นว่าจากเดิมที่มี Build actions/... เต็มไปหมด จะเหลือแค่ Initalize containers ที่ใช้เวลาไป ราว ๆ 1 นาที เท่านั้นเองครับ ก็จะสามารถ Run workflow นี้ทิ้ง ๆ ขว้าง ๆ ได้ ประมาณเกือบ 400 ครั้งเลยครับ

สรุป

ถ้ารู้ว่า Workflow ของเราใช้อะไรแค่ไหน (ซึ่งจริง ๆ แล้วควรจะต้องรู้นะครับ) ควรหาทาง Optimize ให้ได้ครับ ทำตามตัวอย่างมากไปก็เปลือง

--

--

No responses yet