คราวที่แล้วผมได้สอนการเขียน CI/CD ใน Gitlab เบื้องต้นไปแล้ว ซึ่งถ้าสังเกตุก็จะเห็น code บางอันที่เป็น $CI_REGISTRY_USER
หรือ $CI_REGISTRY_IMAGE
พวกนี้คือค่า variable ที่เราสามารถกำหนดลงไปเอง หรือเป็น variable ที่ทาง gitlab มีมาให้ใช้งานเลย
โดยประโยชน์ของ variable พวกนี้ก็คือไว้ทำเป็นค่าที่ต้องมีการใช้งานซ้ำๆ หรือมีการเปลี่ยนแปลงทุกครั้งตอน pipeline ทำงาน หรือไว้ซ้อนข้อมูลที่ไม่ต้องการให้ใครอ่านได้ เพื่อไว้ใช้งานบน pipeline เท่านั้น เช่น
ที่นี้มาดูกันว่า Gitlab ci เราสามารถกำหนดค่า 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 เองเพื่อใช้งานใน 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
ในกรณีถ้าเราต้องการกำหนด 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 นะครับ