We are not waiting for future, We create the future

Tags


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

17th February 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 นะครับ

IT manager & DevOps @Twin Synergy Co.,Ltd

View Comments