[CI, Docker, Git] สอนการทำ GitLab CI ด้วย Docker runner service

Update 07/05/2018

หากใครก็ตามที่ไม่อยากให้ CI มัน Build ให้ทุกครั้งที่มีการ  Push ไปบน Git Server ให้ใส่ข้อมความใน git commit ว่า “[ci skip]” นะครับ ตัว CI จะไม่ทำงานให้เราใน commit ที่เราได้ทำการ Push ไป

วันนี้ผมจะมาสอนการทำ Server Git แบบ Private สำหรับคนที่อยากมี Server เป็นของตัวเองกัน ในราคาถูก แถมมี CI ให้ด้วย โดยการใช้ Docker เป็นตัวรัน Unittest ให้ ซึ่งในบทความนี้ผมเลือกใช้ DigitalOcean ในการสร้าง Server หรือใครมีโซลูชันอื่นๆ ก็ไม่ว่ากัน เดียวเรามาเริ่มกันเลย

Prerequisites

  • Server 1 ตัว
  • Docker
  • ความรู้การเขียน Docker Compose หรือ Dockerfile
  • ความรู้การใช้ OS Server

 


Installation GitLab

วิธีการติดตั้งก็จะมีสองวิธีสำหรับคนใช้ DigitalOcean ก็คือกดจากหน้าเว็บได้เลย ส่วนอีกวิธีที่คือลงเองจาก Link สอนใน DigitalOcean ซึ่งผมเลือกกดจากหน้าเว็บขั่นตอนดังนี้

  • กดไปที่ Tab “One-click apps” แล้วเลือก GitLab ตามภาพ

  • เมื่อกดเลือกแล้วระบบจะบังคับให้เราเลือก Spec server ได้ขั่นต่ำคือ $15/เดือนเท่านั่น สาเหตุนั่นผมไม่แน่ใจ แต่ใครอยากใช้ Server ถูกให้แนะนำให้ติดตั้งเองครับ จากลิ้งที่ผมแปะไว้ด้านบน

 

เมื่อเลือก Server จนพอใจแล้วก็กดสร้างเลยครับ เสร็จแล้วก็ทำการ SSH เข้าไปใน Server ก่อนนะครับ แล้วจะพบข้อความนี้

ถ้าเป็นการกดมาจาก “One-click apps” เราต้องเข้ามาเพื่อตั้งค่าก่อนใช้งานจริง ก็ให้ตอบ “Y” ไปแล้วทำตามขั่นตอนปกติ หลังจากเส็จแล้วลองเข้าที่ IP ของ Server หรือ Domain Name ก็จะได้หน้าตาแบบนี้ถือว่าผ่านครับ


Installing the GitLab CI Runner Service

หลังจากที่ GitLab เราทำงานได้รีบร้อยแล้วถึงคราวที่จะมาติดตั้งตัว CI กันโดยก่อนอื่น SSH เข้าไปที่ Sever ตัวเองก่อนครับ แล้วพิมพ์คำสั่งไปตามเลย

 


Shared Runner or Project-Specific Runner

การสร้าง Runner มีสองแบบ แบบที่สร้างเฉพาะโปรเจคกับแบบใช้งานร่วมกันทุกโปรเจค มาดูแบบแรกก่อนแบบเฉพาะเจาะจงแค่โปรเจค

แบบเจาะจงโปรเจค

Login ด้วย User root ของ GitLab

  • ไปที่โปรเจคของเรา จากนั่นกดที่ Settings > CI / CD

 

  • กดตรงหัวข้อ Runners settings จะเห็นว่ามี URL กับ token อยู่เราจะเอาอันนี้ไปใช้ในการ setup service หรือใครอยากเล่นผ่าน Kubernetes ก็ได้

 

แบบแชร์เพื่อใช้งานร่วมกันทุกโปรเจค

Login ด้วย User root ของ GitLab

  • ไปที่รูปเครื่องมือ Admin area

 

  • กดที่ไปเมนู Runner เราก็จะเจอ Token ที่เราจะเอาไปใช้งานครับ

 

 


Setup Runner with Token on the GitLab Server

  • กลับไปที่หน้าต่าง Terminal ของ Server แล้วก็พิมพ์คำสั่งนี้ครับ

 

  • เมื่อเราพิมพ์คำสั่งไปแล้วระบบจะถามเราเกี่ยวกับ token และการตั้งค่าเพิ่มเติมให้ดูคำอธิบายด้านล่างได้เลยครับ

 

  • เพื่อดูว่าไม่มีความผิดพลาดใดๆ ลองพิมพ์คำสั่งเพื่อเรียกดู Runner ถ้าออกมาปกติแล้วลองเช็คที่ Token ว่าตรงกับที่เราใส่ไหม ถ้าตรงถือว่าเสร็จครับ

 

 


Install Docker on server

พอเราติดตั่ง Runner service เสร็จแล้ว อย่าลืมลง Docker ใน Server นะครับ ไม่งั่น CI ทำงานไม่ได้ ผมจะไม่สอนการลง Docker นะ สามารถไปหาเองได้

 


How to run GitLab CI

ก่อนอื่นให้สร้างไฟล์ชื่อ “.gitlab-ci.yml” ใน root โฟรเดอร์ของโปรเจคเลยนะครับ ทุกครั่งที่มีการ git push เกิดขึ้น GitLab ก็จะทำงานตามคำสั่งที่เราใส่ไว้ในไฟล์ให้ โดยการเขียน CI ของ GitLab นั่นก็คล้ายๆ เจ้าอื่นลองอ่าน document ดูได้ครับ เดียวเรามาเรียนคราวๆ กันก่อนจบบทความครับ

 

ตัวนี้เป็นไฟล์ที่ผมเขียนขึ้นมาทดสอบ Unittest ของ Ruby On Rails ไม่ต้องไปโฟกัสที่คำสั่ง Ruby นะครับ เดียวเรามาดูคำสั่งของ CI ที่ละอันคร่าวๆ

stages – เป็นเหมือนกับการเขียนว่าเราจะมี job อะไรบ้างใน CI  เราอาจจะมีการ build ตัว Docker container ก่อน จากนั้นก็มา test แล้วก็ deploy ระบบ ตัวอย่าง

stage –  ตัวนี้จะเป็นตัวที่บอกว่าบล๊อคที่เราสร้างขึ้นมาเป็นของ stages ไหนแล้ว (คำสั่งต่างกันตรงที่มี s กับไม่มีนะครับ) ถ้าดูจากคำสั่งที่ผมสร้างคือผมประกาศบล๊อคผมก่อน (ชื่ออะไรก็ได้) จากนั่นผมก็ใส่ stage เพื่อให้รู้ว่าบล๊อคนี้เป็นการทำงานของ stages ไหน

image – เป็นคำสั่งที่บอกว่าเราจะใช้ Docker image ตัวไหนแค่นั่นเองครับ คล้ายๆ กับเราเขียน docker composer เลย

service – เป็นการสร้างว่า Docker container จะมีการเชื่อมต่อกับอะไรมัง ในตัวอย่างนี้คือผมเชื่อมต่อกับ Database หรือความหมายคือการเชื่อม Docker container ตัวอื่นๆ นั้นเอง

variables – เอาไว้สร้างตัวแปร ENV  ถ้าเราเกิดใช้ Docker container ที่ต้องการใช้ ENV ก็ให้ประกาศไปในส่วนนี้ครับ หรือว่าโปรเจคเราต้องมี ENV บางตัวถึงจะทำงานเพื่อเรียกใช้ในโค้ดของระบบ ก็ให้ใส่ไปในส่วนนี้เหมือนกัน

before_script – เป็นส่วนของการ Build เพื่อเตรียมการรัน Unittest หรือการติดตั่ง Library และพวก pre-command ต่างๆ ที่จำเป็นลงไป ถ้าใครใช้ Docker เป็นอยู่แล้วตรงนี้ก็เหมือนกับการเขียน Dockerfile กับ docker compose ครับ นอกจากนี้เราสามารถรันคำสั่งของ Ubuntu หรือ Server ที่เราใช้ก็ได้

script – เป็นส่วนการรันคำสั่งเพื่อรัน Unittest ครับ ตรงนี้ก็คล้ายๆ กับ final command ครับ หลังจากที่ติดตั่งอะไรต่างๆ เสร็จแล้ว

 


Example after git push

  • หน้าตาของ Job ที่กำลังทำงาน หรือไม่ผ่านก็แบบนี้ครับ

 

  • กดเข้าไปเราก็จะไปเจอ หน้า Build step  ที่บอกว่า CI ทำไรอยู่ ถ้า Test ผ่านก็จะขึ้นบอกสถานะให้ ถ้าพังก็อ่าน Error จากในนี้ได้

 


Security Alert

ในบทความนี้ผมไม่ได้ทำ SSL กับ Server ทำให้ GitLab เราอาจจะไม่ปลอดภัยนะครับ แนะนำให้ทำด้วยเป็น HTTPS ไป และผมก็ยังใช้ User: root ที่ตัวระบบเขาสร้างมาให้ แนะนำให้ทำการทำเรื่อง Security ด้วยนะครับ สามารถไปอ่านการเพิ่มเติมได้ตามนี้ (Initial Server Setup with Ubuntu 16.04) (How To Install and Configure GitLab on Ubuntu 16.04)

ก็หมดไปแล้วครับ กับการสอนทำ GitLab และการใช้ CI ด้วย Docker สำหรับการเขียนไฟล์ .gitlab-ci.yml ซึ่งผมคงสอนไม่ได้ทุกคำสั่งเพราะมันเยอะมากจริงๆ แนะนำให้อ่าน Document เพิ่มเอาเพื่อสร้างคำสั่งที่เหมาะกับระบบของเราครับ

 

Facebook Comments