มาใช้งาน Variable ใน GitLab CI

DevOps Feb 17, 2019

คราวที่แล้วผมได้สอนการเขียน 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 เช่น

variable ที่ gitlab ci กำหนดมาให้เลย

เราสามารถเรียกใช้งานได้ดังนี้

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 ตัวไหนคือค่าอะไร

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
echo เฉพาะตัวที่อย่างดู

แค่นี้ค่า 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 ขวามือ

Settings > CI/CD

ทุกครั้งที่ 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 นะครับ

Arnon Kijlerdphon

IT manager & DevOps @Twin Synergy Co.,Ltd

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.