Coding Gun

เริ่มต้นหัดใช้ 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 คือ

ถ้าใช้งาน 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 วิธี

  1. ติดตั้งผ่านทาง container
  2. ติดตั้งด้วยการ Download binary file
  3. ติดตั้งผ่านทาง package manager

การติดตั้ง 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 มีขั้นตอนดังนี้

  1. Download binary ตาม cpu architecture เราต้องตรวจสอบว่าเครื่องที่ติดตั้งเป็น 64 bit หรือ 32 bit
  2. ต้องเปิดสิทธิในการเขียน(Writeable) ให้กับ directory ที่มีไฟล์ exe อยู่
  3. Run powershell ด้วยสิทธิ admin(Run as admin)
  4. Register runner ด้วยคำสั่งนี้
    .\gitlab-runner.exe register
    
  5. ติดตั้ง 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 มีดังนี้

  1. เพิ่ม 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
    
  2. ติดตั้ง gitlab runner ผ่าน apt-get

    sudo apt-get install gitlab-runner
    
  3. ทำการ 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 ได้ที่

  1. เข้าไปที่ Admin area แล้วเลือก Overview > Runners
  2. กดปุ่ม Expand ในแถบ Runners
  3. กดปุ่ม Register an instance runner เพื่อ register runner(token อยู่ในหน้านี้)

Group runners

Group runners มีไว้สำหรับทุกๆ project และ sub-group ที่อยู่ใน group นี้

เราสามารถเข้าไปจัดการกับ group runners ได้ที่

  1. ที่แถบด้านบนเลือก Main menu > Groups และเลือก group ที่ต้องการ enable runner
  2. ที่แถบด้านซ้ายมือเลือก Settings > CI/CD
  3. กดปุ่ม Expand ในแถบ Runners
  4. เลือก group’s Runners page

Projects runners(Specific runners)

เป็น runner ที่ใช้เฉพาะ project ใด project หนึ่งเท่านั้น

เราสามารถเข้าไปจัดการกับ specific runners ได้ที่

  1. เข้าไปที่ Project แล้วเลือก Settings > CI/CD
  2. กดปุ่ม Expand ในแถบ Runners
  3. เราสามารถเลือก Show runner installation เพื่อแสดงคำสั่งที่ใช้ในการ ติดตั้งและ register gitlab runner
  4. 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

gitlab on-cloud pricing
รูปภาพแสดง CI/CD minutes สำหรับแต่ละ plan

ข้อแนะนำสำหรับ on-premise ผู้ดูแลระบบควรจะกำหนดใน configutation ว่า CI/CD minutes สูงสุดที่ใช่ในแต่ละ group เป็นเท่าไหร่

การกำหนด executor ใน gitlab-runner

Gitlab executer คือ การกำหนด environment ให้กับการทำงานของ runner เช่น

คุณต้องกำหนด executer เมื่อคุณ register runner และ executer ที่เลือกขึ้นอยู่กับ environment ของ gitlab runner ด้วย

ความสัมพันธ์ของ gitlab, gitlab runner และ executer เป็นดังรูปนี้

ความสัมพันธ์ของ gitlab, gitlab runner และ executer
ที่มา https://docs.gitlab.com/runner/

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 วิธีดังนี้

  1. Install powershell version ใหม่ ด้วยคำสั่งนี้ วิธีนี้ไม่ต้องแก้ config.toml แต่เราต้องมีสิทธิเป็น admin

    winget install Powershell
    
  2. ทำการแก้ไขไฟล์ 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 แต่ละตัวมีความหมายดังนี้

Tags ในไฟล์ .gitlab-ci.yml

หลังจากที่เรา register ตัว runner แล้วเรียบร้อย การที่จะมี job ลงมา run ใน executer ตัวนี้ได้มี 2 กรณีคือ

  1. เรา config ที่ runner ว่าให้ run job จากไหนก็ได้ โดยเราต้องเข้าไปที่ runner ตัวนั้นแล้วกดที่ Run untagged jobs ดังรูปด้านล่าง แสดงว่า runner ตัวนี้รับทุก jobs

Run untagged jobs
กำหนดค่าให้ runner ตัวนี้รับงานโดยไม่ต้องกำหนด tag

  1. tag ที่เรา set ไว้ที่ runner กับ tag ใน .gitlab-ci.yml ตรงกัน
job:
  tags:
    - windows 

เลือก runner ตาม tag ที่กำหนด
Runner จะรับงานตาม tag ที่กำหนดใน ไฟล์ .gitlab-ci.yml

.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 ได้ที่นี่

อ่านต่อเพิ่มเติมได้ที่นี่

Phanupong Permpimol
Follow me

Software Engineer ที่เชื่อในเรื่องของ Process เพราะเมื่อ Process ดี Product ก็จะดีตาม ปัจจุบันเป็นอาจารย์และที่ปรึกษาด้านการออกแบบและพัฒนา Software และ Web Security