เพิ่ม GitLab Runner โดยใช้ Authentication Token

พอดีเข้าช่วยขยับ GitLab 18 เลยมาดูตัว Runner สักหน่อย ลอง Add ด้วยวิธีเดิมมันจะเตือนเราเบาๆ แล้วว่า

WARNING: Support for registration tokens and runner parameters in the 'register' command has been deprecated in GitLab Runner 15.6 and will be replaced with support for authentication tokens. For more information, see https://docs.gitlab.com/ee/ci/runners/new_creation_workflow
Registering runner... succeeded                     runner=dotnet-common
Enter an executor: docker, docker-windows, parallels, shell, docker-autoscaler, docker+machine, instance, custom, ssh, virtualbox, kubernetes:
docker
Enter the default Docker image (for example, ruby:2.7):
alpine:latest
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

Configuration (with the authentication token) was saved in "/etc/gitlab-runner/config.toml"

จากคำสั่งเดิมที่ใช้กัน จุดที่สังเกตุเป็น -r registration token

--registration token
 docker exec gitlab-runner-net-lib01 gitlab-runner register --non-interactive \
  --url "YOUR_GITLAB_URL" \
  --r "YOUR_REGISTRATION_TOKEN" \
  --executor "docker" \
  --docker-image alpine:latest \
  --description "[email protected]#1"

มันจะมีการเปลี่ยนแปลงไป จากเดิมใช้ Registration Tokens จะมาเป็น Authentication Tokens แทนครับ ซึ่งมีความแตกต่าง ดังนี้

  • Registration Tokens - ใช้สำหรับ Register Runner และใช้ยาวตลอดไป
  • Authentication Tokens - เป็นระบบที่จะมาแทน Registration Tokens แบบเดิม เวลาตอน Register มาตัว Runner จะได้ Token อีกตัวที่ Unique ของใครของมันเลน นอกจากนั้นแล้ว ตอนเวลามันทำงาน มันจะไปขอ JOB_TOKEN เป็นครั้งๆไปด้วย มันปลอดภัยขึ้นนั้นแหละ รวมถึงการ Rotate Token เป็นต้น

โดยแผนของ GitLab ใน Ver 15 เปิดตัว Authentication Tokens / Ver 17 ไม่ให้สร้าง Registration Tokens และจะเอาออกถาวรใน Ver 20

Registration Tokens 
- Could be used to register multiple runners with the same token, but each runner had the same configuration. 

Authentication Tokens 
- Used for both registering and authenticating runners with GitLab. 
- Each runner receives a unique authentication token when registered. 
- Enables more secure and granular control over runners. 
- Allows for reusing the same authentication token across multiple runners on different machines, maintaining a single configuration for those runners. 

สำหรับขั้นตอนการ Register Runner โดยใช้ Authentication Tokens มีวิธีการ ดังนี้

เปิดสิทธิ user ที่เราต้องการ ให้มีสิทธิ create_runner ทำได้หมดผ่าน Web UI หรือ API

  • WEB UI เข้าไปที่ User > Preference > Access Token
  • command line
docker exec -it gitlab gitlab-rails runner "token = User.find_by_username('root').personal_access_tokens.create(scopes: ['create_runner'], name: 'create_runner_pat', expires_at: 1.days.from_now); token.set_token('25502e3103cdc4e1cf92616def0c9d'); token.save\!"

เราจะได้ PAT Token มาแล้ว เก็บไว้ให้ดีครับ จะเอามาใช้งานใน Step ถัดไป

จากนั้นมาขอ Token โดยเอา PAT Token ที่เราขอ create_runner มาใช้นี่แหละครับ แล้วยิงผ่าน API /api/v4/user/runners

  • ขอระดับ Instance
curl --request POST --header "PRIVATE-TOKEN: [glpat-TOKEN_WITH_CREATE_RUNNER_PERMISSION]" --data "runner_type=instance_type" \
     "http://[YOUR_GITLAB_SERVER:PORT]/api/v4/user/runners"
  • group
curl --request POST --header "PRIVATE-TOKEN: [glpat-TOKEN_WITH_CREATE_RUNNER_PERMISSION]" \
            --header "Content-Type: application/json" \
            --data '{ "runner_type":"group_type", "group_id":[YOUR_GROUP_ID]}' \
             "http://[YOUR_GITLAB_SERVER:PORT]/api/v4/user/runners" 
  • project
curl --request POST --header "PRIVATE-TOKEN: [glpat-TOKEN_WITH_CREATE_RUNNER_PERMISSION]" \
            --header "Content-Type: application/json" \
            --data '{ "runner_type":"project_type", "project_id":[YOUR_PROJ_ID] }' \
             "http://[YOUR_GITLAB_SERVER:PORT]/api/v4/user/runners" 

ผลลัพธ์มันจะได้ Token ออกมาประมาณนี้ครับ

{"id":10,"token":"glrt-xxxx-xxx","token_expires_at":null}

จากนั้นเอา Token ที่ได้ ขึ้นต้นด้วย glrt-xxx-xxx ไป ให้ Runner ใช้งาน

ในกรณีที่มี Runner หลายตัวให้ ขอ Token หลายๆรอบตามจำนวน Runner ที่มี ถ้าเอา Token Register ซ้ำ ตัว GitLab จะไม่เห็น Runner

  • สร้าง Runner
docker pull gitlab/gitlab-runner:latest

docker run -d --name [CONTAINER_NAME] --restart always --cpus=2.0 --memory=2048m \
  -v /srv/[CONTAINER_NAME]/config:/etc/gitlab-runner \
  -v /var/run/docker.sock:/var/run/docker.sock \
  gitlab/gitlab-runner:latest
  • Register Runner
docker exec [CONTAINER_NAME] gitlab-runner register --non-interactive \
  --url "http://[YOUR_GITLAB_SERVER:PORT]" \
  --token "glrt-xxx-xxx" \
  --executor "docker" \
  --docker-image alpine:latest \
  --description "[YOUR RUNNER DESCRIPTION]" 

สำหรับการ Register และการขอ Token ลองดูรูปด้านล่างได้เลยครับ ที่ต้องขอ Token ( /api/v4/user/runners ) 1 รอบ ต่อ 1 Runner เพราะตัว GitLab จะให้ correlation_id + runner code กลับมาให้ โดย 2 ค่านี้ตัว GitLab เอาไว้ Track Token

  • ถ้าเข้ามาใน Project จะเห็น Runner ในส่วน CI/CD ของเราแล้ว ตัวอย่างจะเป็นส่วนของ Project Runner
ถ้าเป็นการ Register ระดับ Instance อย่างลืมไป Enable ที่ Project ให้ไปใช้ Instance Runner ด้วย

ในกรณีที่มีการกำหนด firewall ไว้ อย่าลืม allow https://registry.gitlab.com/v2/ ด้วยไม่งั้นจะเอา Error ประมาณนี้

Reference


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.