เริ่มต้นหัดใช้ Gitlab CI/CD
ข้อดีของการใช้ Gitlab คือการที่ Gitlab มี Gitlab CI/CD build-in มาให้อยู่แล้ว gitlab CI/CD จะช่วยให้เราสามารถสร้าง pipeline ทั้ง build pipeline และ release pipeline ได้อย่างง่ายดาย แถมยังมี gitlab runner ที่สามารถติดตั้งได้หลายรูปแบบทั้งบน windows, docker และ kubernetes ทำให้เรามีทางเลือกในการกระจายงานออกไปใน runner ได้มากขึ้น และยังมี high availability มากขึ้นอีกด้วยเพราะเมื่อกระจายงานออกไปให้ runner ทำมากขึ้น gitlab server ก็ทำงานน้อยลง ในบทความนี้เราจะพาทุกท่านไปทำความรู้จักกับการทำ CI/CD ด้วย Gitlab แบบ step by step
เริ่มต้นสร้าง CI/CD Pipeline
สิ่งที่ต้องตรวจสอบก่อนเริ่มต้นใช่งาน gitlab CI/CD คือ
- ต้องมี account ที่เป็น maintainer หรือ owner
- ต้องมีไฟล์ .gitlab-ci.yml ใน root ของ repository ลองดูการสร้างไฟล์ .gitlab-ci.yml ได้ที่นี่
- ต้องมี runner ที่พร้อมใช้งาน ลองดูการติดตั้ง gitlab runner ได้ที่นี่
ถ้าใช้งาน gitlab แบบ on-cloud จะมี runner ให้ใช้งานหลังจากที่คุณใส่เลขบัตรเครดิต และข้อดีของการใช้ cloud คือ gitlab จะจัดการเรื่อง runner ให้เราโดยอัตโนมัติ
Gitlab Runner คืออะไร?
gitlab runner คือ engine ที่ช่วย run task งานที่เรากำหนดไว้ใน CI/CD pipeline เราไม่สามารถสั่ง run job ได้ถ้าไม่มี runner(status จะเป็น pending) ซึ่งการออกแบบให้มี runner จะทำให้เราเลือกได้ว่าจะ ให้ runner อยู่ในเครื่องเดียวกับ gitlab server หรือไม่ เพราะในการทำงานจริงเราควรจะ distribute งานออกไปยังเครื่องอื่นที่ไม่ใช่เครื่องเดียวกับ gitlab server เพราะถ้า runner ตาย gitlab server จะได้ไม่ตายไปด้วย การติดตั้ง runner ทำได้ 3 วิธี
การติดตั้ง gitlab runner ผ่านทาง docker
gitlab ได้เตรียม docker container ไว้ให้เราใช้งาน โดย image ของ gitlab runner จะอยู่ที่ gitlab/gitlab-runner เราสามารถติดตั้ง runner ขึ้นมาได้ด้วย docker command ด้านล่างนี้
docker run -d --name gitlab-runner --restart always \
-v ${PWD}/config.toml:/etc/gitlab-runner/config.toml \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
หลังจากที่เราได้ gitlab runner แล้วเราต้องทำการ register(เพื่อบอก gitlab server ว่าพร้อมใช้งานแล้วนะ) ด้วยคำสั่งนี้
docker exec -it gitlab-runner gitlab-runner register
gitlab runner ตัวแรกเป็นชื่อ container ที่เราตั้งไว้ในขั้นตอนก่อนหน้า ส่วน gitlab-runner ตัวที่สองเป็น command line ที่อยู่ใน container
การติดตั้ง gitlab runner บน windows
การติดตั้ง gitlab runner บน windows มีขั้นตอนดังนี้
- Download binary ตาม cpu architecture เราต้องตรวจสอบว่าเครื่องที่ติดตั้งเป็น 64 bit หรือ 32 bit
- ต้องเปิดสิทธิในการเขียน(Writeable) ให้กับ directory ที่มีไฟล์ exe อยู่
- Run powershell ด้วยสิทธิ admin(Run as admin)
- Register runner ด้วยคำสั่งนี้
ในกรณีที่เราไม่สามารถ connect กับ URL ของ Gitlab Server ได้เราอาจต้องแก้ไข Repo URL ใหม่ ด้วยการกำหนด configuration ใน
.\gitlab-runner.exe register
config.toml
แบบนี้[[runners]] clone_url = "http://host.docker.internal"
- ติดตั้ง gitlab runner เป็น service
cd C:\GitLab-Runner # folder ที่มี gitlab-runner.exe .\gitlab-runner.exe install .\gitlab-runner.exe start
เป็นอันเสร็จเรียบร้อย เข้าไปตรวจสอบ runner ใน gitlab server
และถ้าเกิดปัญหาระหว่างการทำงานเราสามารถ run คำสั่ง Get-WinEvent(command line) หรือเข้าไปที่ Windows Event Viewer(GUI) เพื่อดู logs ของ gitlab runner ได้
PS C:\> Get-WinEvent -ProviderName gitlab-runner
ProviderName: gitlab-runner
TimeCreated Id LevelDisplayName Message
----------- -- ---------------- -------
2/4/2021 6:20:14 AM 1 Information [session_server].listen_address not defined, session endpoints disabled builds=0...
2/4/2021 6:20:14 AM 1 Information listen_address not defined, metrics & debug endpoints disabled builds=0...
2/4/2021 6:20:14 AM 1 Information Configuration loaded builds=0...
2/4/2021 6:20:14 AM 1 Information Starting multi-runner from C:\config.toml... builds=0...
การติดตั้ง gitlab runner บน linux
ขั้นตอนการติดตั้ง gitlab runner บน Debian, Ubuntu และ Mint มีดังนี้
-
เพิ่ม repository ของ gitlab ด้วยคำสั่งนี้ (ก่อนใช้ apt-install ต้องเพิ่ม reposiory เข้าไปก่อน เพื่อให้ install gitlab runner จาก repository นี้)
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash
-
ติดตั้ง gitlab runner ผ่าน apt-get
sudo apt-get install gitlab-runner
-
ทำการ register gitlab runner
sudo gitlab-runner register
Scope ของ gitlab runners
Gitlab runner มีหลายประเภทซึ่งแตกต่างกันตาม scope ของการใช้งาน ซึ่งประกอบไปด้วย
Shared runners
Shared runners มีไว้สำหรับทุก groups และ projects ใน gitlab instance ที่ register ไว้ เราจะใช้ shared runners เมื่อเรามี jobs หลายๆตัวที่ใช้ resource เดียวกัน
เราสามารถเข้าไปจัดการกับ shared runners ได้ที่
- เข้าไปที่ Admin area แล้วเลือก Overview > Runners
- กดปุ่ม Expand ในแถบ Runners
- กดปุ่ม Register an instance runner เพื่อ register runner(token อยู่ในหน้านี้)
Group runners
Group runners มีไว้สำหรับทุกๆ project และ sub-group ที่อยู่ใน group นี้
เราสามารถเข้าไปจัดการกับ group runners ได้ที่
- ที่แถบด้านบนเลือก Main menu > Groups และเลือก group ที่ต้องการ enable runner
- ที่แถบด้านซ้ายมือเลือก Settings > CI/CD
- กดปุ่ม Expand ในแถบ Runners
- เลือก group’s Runners page
Projects runners(Specific runners)
เป็น runner ที่ใช้เฉพาะ project ใด project หนึ่งเท่านั้น
เราสามารถเข้าไปจัดการกับ specific runners ได้ที่
- เข้าไปที่ Project แล้วเลือก Settings > CI/CD
- กดปุ่ม Expand ในแถบ Runners
- เราสามารถเลือก Show runner installation เพื่อแสดงคำสั่งที่ใช้ในการ ติดตั้งและ register gitlab runner
- Specific runner จะ register ด้วย token ในหน้านี้
CI/CD minutes
CI/CD minute คือเวลาสูงสุดที่ใช้ในการ execute job เป็นการกำหนด quota ไม่ให้ใช้เวลาในแต่ละ job นานเกินไป
ส่วนเวลารวม(Amount of CI/CD minutes) นั้นจะเป็นผลรวมของเวลาของทุกๆ job ใน pipeline ซึ่ง job ต่างๆใน pipeline สามารถ run พร้อมกันได้ ดังนั้น CI/CD minutes จะไม่ใช่เวลาที่ใช้งานจริง
ในการติดตั้่งแบบ on-premise CI/CD minutes จะถูก disable ไว้ นั่นคือจะใช้เวลาในแต่ละ job ก็ได้ ส่วนการใช้งาน gitlab แบบ on-cloud จะมีกำหนด quota ไว้ตาม plan ที่เราซื้อ ตามรูปด้านล่าง และเรายังสามารถซื้อ CI/CD minutes เพิ่มได้โดยไม่ต้องเปลี่ยน plan
ข้อแนะนำสำหรับ on-premise ผู้ดูแลระบบควรจะกำหนดใน configutation ว่า CI/CD minutes สูงสุดที่ใช่ในแต่ละ group เป็นเท่าไหร่
การกำหนด executor ใน gitlab-runner
Gitlab executer คือ การกำหนด environment ให้กับการทำงานของ runner เช่น
- ถ้าคุณต้องการ run คำสั่งใน Powershell คุณต้อง install gitlab runner ในเครื่องที่เป็น windows และตอน register ต้องเลือกเป็น shell executer
Windows 10 จะมีปัญหากับ powershell ลองดูวิธีการแก้ปัญหาด้านล่าง
- ถ้าคุณต้องการ run คำสั่งใน Docker container คุณต้องติดตั้ง runner ลงใน linux ที่ได้ติดต้ัง docker ไว้แล้ว และตอน register ต้องเลือกเป็น docker executer
คุณต้องกำหนด executer เมื่อคุณ register runner และ executer ที่เลือกขึ้นอยู่กับ environment ของ gitlab runner ด้วย
ความสัมพันธ์ของ gitlab, gitlab runner และ executer เป็นดังรูปนี้
gitlab runner และ executer ไม่จำเป็นต้องอยู่ในเครื่องเดียวกัน เราสามารถแยกเครื่องได้
แก้ปัญหา shell executer error ใน windows 10
ใน windows 10 เราจะเจอปัญหาว่าเมื่อเราติดตั้ง gitlab runner แล้ว run ไม่ได้ อาจเป็นที่ version ของ powershell ก็ได้่ โดยปัญหาเกิดจากไฟล์ config.toml ที่ได้ generate ขึ้นมาโดยอัตโนมัติ ซึ่งจะอยู่ใน folder ที่เรา run gitlab-runner register และโดย default ค่าที่กำหนดให้กับ shell คือ pwsh ซึ่งเป็น powershell version ใหม่ ตามตัวอย่างด้านล่าง
ตัวอย่างไฟล์ config.toml
[[runners]]
name = "Windows desktop"
executor = "shell"
shell="pwsh"
...
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
โดยแนวทางการแก้ปัญหามี 2 วิธีดังนี้
-
Install powershell version ใหม่ ด้วยคำสั่งนี้ วิธีนี้ไม่ต้องแก้ config.toml แต่เราต้องมีสิทธิเป็น admin
winget install Powershell
-
ทำการแก้ไขไฟล์ config.toml เปลี่ยนกลับไปใช้ powershell version เก่า โดยแก้ shell เป็น powershell
[[runners]] name = "Windows desktop" executor = "shell" shell="powershell" ... [runners.custom_build_dir] [runners.cache] [runners.cache.s3] [runners.cache.gcs] [runners.cache.azure]
Register parameters
เราสามารถ register โดยไม่ต้องตอบคำถามด้วย parameters ต่างๆ ดังนี้
gitlab-runner register \
--config /tmp/test-config.toml \
--non-interactive \
--url https://gitlab.com \
--registration-token __REDACTED__ \
--name test-runner \
--tag-list kubernetes,test \
--executor kubernetes \
--kubernetes-host http://localhost:9876/
โดยที่ parameters แต่ละตัวมีความหมายดังนี้
- –config ระบุไฟล์ configuration(ถ้าใช้ configuration เราจะได้ไม่ต้องกำหนด parameter ตัวอื่นๆ)
- –non-interactive โดยปกติจะ run แบบ interactive mode(ตอบคำถามแต่ละข้อ ถึงจะใส่ parameter ก็ยังต้องตอบอยู่ดี) ถ้าไม่อยากให้ถามต้องใส่ parameter ตัวนี้
- –url ระบุ url ของ gitlab server
- registration-token ระบุ token ที่ใช้ในการ register
- –name ตั้งชื่อของ runner
- –tag-list ระบุ tag ที่ใช้สำหรับ runner ตัวนี้(ลองอ่านหัวข้อถัดไป)
- –executor เลือก executor ที่ต้องการ
- –kubernetes-host url ของ kubernetes api server
Tags ในไฟล์ .gitlab-ci.yml
หลังจากที่เรา register ตัว runner แล้วเรียบร้อย การที่จะมี job ลงมา run ใน executer ตัวนี้ได้มี 2 กรณีคือ
- เรา config ที่ runner ว่าให้ run job จากไหนก็ได้ โดยเราต้องเข้าไปที่ runner ตัวนั้นแล้วกดที่ Run untagged jobs ดังรูปด้านล่าง แสดงว่า runner ตัวนี้รับทุก jobs
- tag ที่เรา set ไว้ที่ runner กับ tag ใน .gitlab-ci.yml ตรงกัน
job:
tags:
- windows
.gitlab-ci.yml ไฟล์นี้มีไว้ทำอะไร?
.gitlab-ci.yml เป็นไฟล์ที่จะระบุสิ่งที่ต้องทำหลังจากที่เรานำ code มารวมกันทั้งตอนที่ developer push code ขึ้นมาหรือตอนทำ merge request ใน .gitlab-ci.yml จะทำการนิยาม pipeline ขึ้นมา ซึ่งใน pipeline นั้นจะประกอบไปด้วย stage ต่างๆ เช่นการ build, test และ deploy และใน stage จะประกอบไปด้วย job ที่ระบุ script ที่ใช้ในการ build, test และ deploy ไว้ อ่านเรื่องวิธีการเขียน .gitlab-ci.yml ได้ที่นี่