Gitlab-CI กล้วยๆ: ทุกเรื่องของตัวแปร (Variables)

มาถึงเรื่องของการจัดการตัวแปร (Variables) ใน GitLab CI กันบ้าง ซึ่งตัวแปรใน GitLab CI จะช่วยให้ส่งผ่านค่าระหว่าง Jobs หรือ Stage ได้ มันจะทำให้เรานำค่าไปใช้ได้ง่ายขึ้น หรือหากต้องการเปลี่ยนแปลงก็สามารถทำได้ง่ายขึ้นเช่นกัน

ผมจะมาบอกเกี่ยวกับการใช้งานตัวแปใน GitLab CI กันว่ามันใช้งานในรูปแบบใดได้บ้าง

Section 1: การกำหนดตัวแปร GitLab CI

หากต้องการกำหนดตัวแปรใน GitLab CI เราสามารถตั้งค่าตัวแปรในไฟล์ .gitlab-ci.yml ได้ดังนี้

variables:
  MY_VARIABLE: "my-value"

ด้านบนจะเป็นการกำหนดตัวแปรทั่วไป โดยมี MY_VARIABLE ที่เก็บค่า "my-value" ไว้ และเรายังสามารถกำหนดตัวแปรในระดับ Job ได้ด้วย เช่น

variables:
  MY_PROJECT_VARIABLE: "my-project-value"

stages:
  - build

build:
  stage: build
  variables:
    MY_JOB_VARIABLE: "my-job-value"
  script:
    - echo "Building my app with project variable $MY_PROJECT_VARIABLE and job variable $MY_JOB_VARIABLE"

ตัว MY_PROJECT_VARIABLE จะเป็นตัวแปรที่เราสามารถเรียกใช้งานในตำแหน่งไหนก็ได้ แต่ MY_JOB_VARIABLE มันจะเรียกใช้ได้แค่ใน Job นั้นๆ

Section 2: การนำไปใช้งานตัวแปร GitLab CI

เมื่อเรากำหนดตัวแปรแล้ว เราสามารถใช้ตัวแปรนั้นในบริบทต่างๆ ได้ เช่น ใน script, ชุดคำสั่งที่เราทำขึ้นมา หรือใน environment เช่น

stages:
  - build

build:
  stage: build
  variables:
    MY_VARIABLE: 20
  script:
    - echo "Building my app with version $MY_VARIABLE"

Job นี้ได้ใช้ MY_VARIABLE เป็นค่ากำหนดเวอร์ชั่นของแอพนี้ในตอน build

หรือเราจะเรียกใช้งานส่วนของ environment ก็ได้

stages:
  - build

build:
  stage: build
  variables:
    MY_VARIABLE: dev
  environment:
    name: my-environment
    url: http://$MY_VARIABLE.example.com
  script:
    - echo "Deploying to environment $CI_ENVIRONMENT_NAME with URL $CI_ENVIRONMENT_URL"

Section 3: การจัดการตัวแปร GitLab CI

นอกจากที่เรากำหนดตัวแปรใน .gitlab-ci.yml แล้วนั้น เรายังสามารถกำหนดตัวแปรในระดับของ Project หรือ Group ได้ โดยความสามารถนี้จะทำได้เฉพาะคนที่เป็น Maintainer ในเว็บ Gitlab ซึ่งผมแนะนำว่าถ้าต้องการความปอดภัยของตัวแปรไม่อยากให้ใครมาอ่านเจอไม่ควรกำหนดในไฟล์ .gitlab-ci.yml แต่ให้ไปกำหนดในเว็บ Gitlab แทน

สำหรับการตั้งค่าตัวแปรใน Project ให้ไปที่ Project > Settings > CICD ด้านขวามือเลือก Variables

ในส่วนของ Group ก็ทำเช่นเดียวกัน Group > Settings > CICD ด้านขวามือเลือก Variables

หน้าตาการสร้าง Variable ผ่านเว็บ

Section 4: เพิ่มตัวแปรผ่านหน้าเว็บ

การเพิ่มตัวแปรในเว็บ Gitlab นั้น จะมีสิ่งที่เราสามารถกำหนดเพิ่มเติมได้อีก ลองมาดูกันว่ามีอะไรบ้าง

Type: เป็นการเก็บค่าชนิดแบบ Variable หรือจะเป็นแบบ File ส่วนใหญ่ผมใช้แต่แบบ Variable

Environment scope: เป็นการกำหนดว่าสามารถนำตัวแปรไปใช้ใน environment ไหนได้บ้าง

Protect variable: นำตัวแปรไปใช้ได้เฉพาะ Branchs หรือ Tags ที่เราทำการกำหนด Protect ไว้เท่านั้น

Mask variable: โดยปกติเราสามารถสั่ง echo $VARIABLE_NAME เพื่อมาดูค่าในขั้นตอน pipeline ได้ แต่ถ้าเราไม่ได้อยากให้ใคร echo ออกมาดูได้ก็ติ้กช่องนี้ซะ มันจะแสดงเป็น [MASKED] แทน

ข้อกำหนด value ของ mask

  • ต้องเป็นบรรทัดเดียว
  • มีตัวอักษร 8 ตัวขึ้นไป ประกอบด้วย:
    - ตัวอักษร Base64 (RFC4648)
    - อักษร @ และ :
    - อักษร .
    - อักษร ~

Expand variable reference: กำหนดให้ $ เป็นตัวเริ่มต้นตัวแปร

Section 5: ตัวแปร Predefined คืออะไร

ใน Gitlab-ci จะมีตัวแปรที่ถูกสร้างมาให้นำไปใช้ได้อยู่แล้วในทุกๆ pipeline เราเรียกกันว่า Predefined variables ซึ่งเราสามารถนำไปใช้งานได้เลย เช่น

job:
  stage: pre
  script:
    - echo "$CI_COMMIT_REF_NAME"

จากตัวอย่างข้างต้น CI_COMMIT_REF_NAME ก็คือ ชื่อของ Branch นั้นเอง

โดยเราสามารถดูค่า Predefined เพิ่มเติมได้ที่

Predefined variables reference | GitLab
Documentation for GitLab Community Edition, GitLab Enterprise Edition, Omnibus GitLab, and GitLab Runner.

Section 6: การ Debug ตัวแปร

หากเราพบปัญหาเกี่ยวกับตัวแปร GitLab CI ที่แสดงออกมาต่างๆ ว่ามันคืออะไรบ้าง เราสามารถใช้ CI_DEBUG_TRACE ช่วยให้มันแสดงค่าออกมาทั้งหมดได้ เพื่อตรวจสอบตัวแปรและแก้ไขปัญหาต่างๆ

job_name:
  variables:
    CI_DEBUG_TRACE: "true"

ดูเพิ่มเติม

GitLab CI/CD variables | GitLab
Documentation for GitLab Community Edition, GitLab Enterprise Edition, Omnibus GitLab, and GitLab Runner.

หรือสามารถใช้คำสั่ง echo ออกมาตรงๆ เลยก็ได้นะ ผมใช้บ่อย

job_name:
  script:
    - echo $CI_REGISTRY

Section 7: บทสรุป

ตัวแปร GitLab CI เป็นเครื่องมือที่ดีมากสำหรับการส่งค่าต่างๆ ระหว่าง Job หรือ Stage และการนำไปใช้งานก็ง่าย และยังสามารถกำหนดการเข้าถึง หรือการแสดงผลออกมาได้เพื่อความปลอดภัยของตัวระบบด้วย

และส่วนใครต้องการเก็บไฟล์สำคัญ เพื่อให้ pipeline นำไปใช้งานได้ ให้ไปดูในส่วนของ Secure file ตามนี้

ระบบเก็บ Secure Files ไว้ใน Project และการนำไปใช้ใน gitlab-ci
พอดีมีโอกาสทำ pipeline บน Gitlab ci ในการที่จะทำ build android ให้ออกมาได้ไฟล์ apk ซึ่งการ build ละแต่ครั้งนั้นเราจำเป็นต้องมีไฟล์ .keystore ไว้เสมอ ซึ่งมันเป็นไฟล์ที่สำคัญมากห้ามหลุดออกไปไหนเด็ดขาด และไม่ควรเก็บไว้ใน git ด้วย โดย Gitlab นั้นมีสิ

ติดตามเนื้อหาอื่นๆ ของ Gitlab ได้ที่

gitlab - Snappytux Blog