
คราวที่แล้วผมได้สอนการเขียน CI/CD ใน Gitlab เบื้องต้นไปแล้ว ซึ่งถ้าสังเกตุก็จะเห็น code บางอันที่เป็น $CI_REGISTRY_USER
หรือ $CI_REGISTRY_IMAGE
พวกนี้คือค่า variable ที่เราสามารถกำหนดลงไปเอง หรือเป็น variable ที่ทาง gitlab มีมาให้ใช้งานเลย
โดยประโยชน์ของ variable พวกนี้ก็คือไว้ทำเป็นค่าที่ต้องมีการใช้งานซ้ำๆ หรือมีการเปลี่ยนแปลงทุกครั้งตอน pipeline ทำงาน หรือไว้ซ้อนข้อมูลที่ไม่ต้องการให้ใครอ่านได้ เพื่อไว้ใช้งานบน pipeline เท่านั้น เช่น
- API_TOKEN=xxx12321
- NODE_VERSION=9
- SSH_KEY=xxx1212
ที่นี้มาดูกันว่า Gitlab ci เราสามารถกำหนดค่า Variable ได้จากทางไหนบ้าง
Variable ที่สามารถเรียกใช้งานได้เลย
Gitlab ci นั้นมีการกำหนด variable เบื้องต้นมาให้เราสามารถเรียกใช้งานได้เลย โดยเราสามารถดูได้จาก https://docs.gitlab.com/ee/ci/variables/#predefined-environment-variables เช่น

เราสามารถเรียกใช้งานได้ดังนี้
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build --pull -t $CI_REGISTRY_IMAGE:nginx -f Dockerfile-nginx .
- docker push $CI_REGISTRY_IMAGE:nginx
จากโค็ดด้านบนเป็นการให้ docker login เข้า gitlab registry ของโปรเจ็ค จากนั้นก็ทำการ build แล้ว push ขึ้นไปยัง gitlab registry ของโปรเจ็ค โดยค่าพวกนี้จะเปลี่ยนไปตามแต่ละโปรเจ็ค หากเราไม่ทราบว่าค่า variable ที่เราเขียนไปในโปรเจ็คนั้นมันคืออะไร เราสามารถที่จะตรวจสอบได้โดยการ
job_name:
variables:
CI_DEBUG_TRACE: "true"
เมื่อ pipeline ทำงาน มันก็จะแสดงค่าออกมาให้ดูว่า variable ตัวไหนคือค่าอะไร

หรือสามารถใช้คำสั่ง echo
ออกมาตรงๆ เลยก็ได้นะ ผมใช้บ่อย
job_name:
stage: release
image: docker:latest
services:
- docker:dind
script:
- echo $CI_REGISTRY
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY

แค่นี้ค่า Variable ของโปรเจ็คก็จะแสดงออกมาทั้งหมดผ่านหน้า pipeline ให้เราเห็นแล้ว
กำหนด Variable ใน .gitlab-ci.yml เอง
สมมติถ้าผมอยากกำหนด variable เองเพื่อใช้งานใน pipeline เช่น DATABASE_URL
หรือ LS_CMD
เป็นต้น สามารถกำหนดได้ดังนี้
variables:
DATABASE_URL: "domain.com:27017"
MONGO_USER: "user"
MONGO_PASSS: "password"
stages:
- test
- build
mysql: # job name
stage: test
image: postgres
script:
- mongodump -h $DATABASE_URL -u $MONGO_USER -p $MONGO_PASSS -d mongo_dbname
หรือกำหนดลงใน job นั้นๆ
stages:
- test
- build
mysql: # job name
stage: test
image: postgres
variables:
DATABASE_URL: "domain.com:27017"
MONGO_USER: "user"
MONGO_PASSS: "password"
script:
- mongodump -h $DATABASE_URL -u $MONGO_USER -p $MONGO_PASSS -d mongo_dbname
Protected variables
ในกรณีถ้าเราต้องการกำหนด variable ที่ไม่อยากให้ใครอ่านได้ เช่น รหัสผ่านต่างๆ หรือ api key ต่างๆ เราสามารถไปกำหนดได้ที่เมนู Settings > CI/CD จากนั้นไปดูในส่วนของ Environment variables ขวามือ

ทุกครั้งที่ pipeline ทำงานมันจะมาอ่าน variable ที่เรากำหนดไว้ในนี้ ดังนั้นข้อมูลที่เป็นความลับควรกำหนดไว้ในนี้ทุกครั้ง
stages:
- test
- build
mysql: # job name
stage: test
image: postgres
variables:
DATABASE_URL: "domain.com:27017"
MONGO_USER: "user"
script:
- mongodump -h $DATABASE_URL -u $MONGO_USER -p $MONGO_PASSS -d mongo_dbname
จากโค็ดด้านบนผมไม่ได้กำหนด MONGO_PASS
ไว้ใน .gitlab-ci.yml
แต่สามารถเรียกใช้ได้เพราะผมกำหนดใน Settings > CI/CD แทน
ขอให้สนุกกับการเขียน gitlab-ci นะครับ