ก่อนจะเริ่ม GitLab CI เราก็ต้องมารู้จักกับ GitLab Runner กันเสียก่อน GitLab Runner คือ Agent ที่จะคอยรันงานที่ส่งมาจาก GitLab นั่นเอง บางคนอาจคิดไปถึงว่า เราจะ Test โปรแกรมของเราได้อย่างไรในเมื่อ Environment ของเราไม่เหมือนกันคนอื่น บางคนเขียน Ruby บางคน Java บางคน Python อย่างนี้ก็ต้องสร้างเครื่องมาเฉพาะหมดเลยหรือเปล่า คำตอบก็คือ ใช่ และ ไม่ใช่ ที่บอกว่าใช่ ก็เพราะว่า เวลาจะทดสอบระบบอะไรนั้น เราก็ต้องทำ Environment ขึ้นมาแน่นอน อันนี้หลีกเลี่ยงไม่ได้ แต่ที่บอกว่าไม่ใช่ก็ตรงที่ว่า เราไม่ต้องสร้างเครื่องใหม่หลายๆ เครื่อง อย่าลืมว่ายุคนี้มี Docker แล้ว การจะตั้ง Containner ที่มี Environment อย่างที่เราต้องการเป็นเรื่องหมูๆ เอาจริงๆ แทบจะ Copy สคริปที่ชาวบ้านทำๆ กันเอาไว้มาใช้ ส่วนใหญ่ก็แทบจะใช้งานได้ทันทีถ้าเราพัฒนามาในรูปแบบที่คนส่วนใหญ่ทำกัน ซึ่ง GitLab Runner ก็อาศัยพวก VM เนี่ยล่ะในการในการทำให้เครื่องหนึ่งเครื่องเป็น Enviromment อะไรก็ได้ ซึ่งสำหรับผมจะเลือกใช้ Docker เป็นหลักครับ
อ่อ สำหรับคนที่ใช้ GitLab ที่มี Runner พร้อมใช้อยู่แล้ว อย่างเช่นคนที่จะใช้ Share Runner บน gitlab.com ก็สามารถข้ามบทนี้ไปได้เลยครับ
ลง GitLab Runner บน Docker
ความเป็นจริงเราสามารถลง GitLab Runner ได้บนหลาย Environment มาก ซึ่งปรกติเราก็ควรจะมีเครื่อง Server ตั้งขึ้นมาเป็น Runner โดยเฉพาะ สำหรับการลง Runner นั้นก็สามารถติดตั้งตามคู่มือได้เลย ส่วนสำหรับ Entry นี้ ผมจะขอ Advance ขึ้นไปอีกหน่อยโดยรัน Runner ที่วางอยู่บน Docker อีกชั้นหนึ่ง ด้วยเหตุผลที่ว่าอยากให้เครื่อง Server หนึ่งตัวมี Runner หลายๆ ตัว เพราะงานที่ผมใช้สามารถรัน Unit Test พร้อมๆ กันได้ และมี test เยอะมาก แต่ว่าแต่ละ test ไม่ได้กิน CPU สักเท่าไหร่ รวมถึงให้เครื่องนั้นสะอาดที่สุดเท่าที่จะเป็นไปได้
1. ลง Docker
สมมุติว่าเราใช้ Ubuntu การลง Docker นั้นทำได้ง่ายมาก เพียงแค่รัน sudo apt-get install docker-ce ถ้าใครใช้ Platform อื่นก็สามารถไปอ่านคู่มือได้ที่เว็บ Docker https://docs.docker.com/engine/installation/
2. ลง GitLab Runner บน Docker [REF]
หลังจากมี Docker แล้ว เราก็สามารถโหลด Image ของ GitLb Runner มาใช้ได้ง่ายๆ ด้วยคำสั่ง
1 2 3 4 |
docker run -d --name CONTAINER-NAME --restart always \ -v /srv/gitlab-runner/config:/etc/gitlab-runner \ -v /var/run/docker.sock:/var/run/docker.sock \ gitlab/gitlab-runner:latest |
*แก้ CONTAINER-NAME เป็นชื่อ Container ที่ต้องการ ตัวอย่างเช่น gitlab-runner-1
แล้วก็ลองรัน docker ps ดู เราก็น่าจะเป็น Container รันอยู่
3. Register GitLab Runner เข้ากับ GitLab
ขั้นตอนนี้คือการทำให้ GitLab รู้จักกับ Runner ที่เรากำลังจะลง ซึ่ง GitLab มี API สำหรับใช้งานได้ง่ายๆ อยู่แล้ว ทีนี้ต้องทำความรู้จักกับชนิดของ Runner กันสักหน่อย ตัวแรกก็คือ Shared Runner หมายความว่าโปรเจคไหนก็ได้สามารถเข้ามาใช้ Runner นี้ได้ แบ่งๆ กันใช้ อีกชนิดก็คือ Specific Runner เป็น Runner นี่ผูกไว้กับ Project โดยมันจะรันให้เฉพาะโปรเจกต์ที่กำหนด นอกจากนั้นเรายังสามารถตั้งให้ Project ใดๆ รันบนเฉพาะ Runner ที่เจาะจงได้ด้วย เพื่อป้องกัน Source Code ตกไปอยู่ใน Runner ที่เราไม่ไว้ใจ
ก่อนจะ Register สิ่งแรกที่จะต้องเตรียมก็คือ Token สำหรับ Runner สำหรับ GitLab สำหรับ Admin ที่จะสร้าง Shared Runner ให้กับทุกคน สามารถไปเอา Token ได้จากหน้า admin/runners เราจะเห็น Registration Token แสดงอยู่ ให้ Copy เก็บเอาไว้
จากนั้นก็รันคำสั่ง docker exec -it CONTAINER-NAME gitlab-runner register
เหมือนเดิม เปลี่ยน CONTAINER-NAME เป็นชื่อ Container ที่ตั้งเอาไว้ก่อนหน้า
จากนั้นก็จะมี Prompt ขึ้นมาถามข้อมูลต่างๆ ก็กรอกลงไปให้ตรงกับข้อมูลที่เรามี
ที่ต้องระวังหน่อยก็คือคำถามที่ว่า Runner นี้ใช้สำหรับ Specific Project หรือเปล่า ถ้าจะให้เป็นแชร์ก็ต้องบอกว่าไม่ และอีกเรื่องก็คือตอนถามว่าจะรันด้วยอะไร ในที่นี้เราจะรันด้วย docker นะครับ หมายความว่า เวลาเกิด Job ขึ้น Runner ก็จะสร้าง Docker Container ขึ้นมาใหม่ รันเสร็จแล้วก็ลบทิ้งไป
หลังจากกรอกข้อมูลเสร็จแล้วก็มา Refresh ที่ GitLab ในหน้า admin/runners ดู ถ้าทุกอย่างถูกต้องก็จะเห็นรายการของ Runner ที่เราเพิ่งเพิ่มขึ้นมาให้เห็น 🙂
ส่งท้าย
สังเกตว่าการสร้าง Runner นั้นง่ายมาก ง่ายจนน่าตกใจ ในบทต่อไปเดี๋ยวเราจะมาเริ่มรัน Test บน GitLab CI กัน
สำหรับใครที่ยังงงๆ เรื่อง Runner สามารถตามเข้าไปอ่านเพิ่มเติมได้ที่นี่ครับ https://docs.gitlab.com/runner/