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
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 เพิ่มเติมได้ที่
Section 6: การ Debug ตัวแปร
หากเราพบปัญหาเกี่ยวกับตัวแปร GitLab CI ที่แสดงออกมาต่างๆ ว่ามันคืออะไรบ้าง เราสามารถใช้ CI_DEBUG_TRACE
ช่วยให้มันแสดงค่าออกมาทั้งหมดได้ เพื่อตรวจสอบตัวแปรและแก้ไขปัญหาต่างๆ
job_name:
variables:
CI_DEBUG_TRACE: "true"
ดูเพิ่มเติม
หรือสามารถใช้คำสั่ง echo
ออกมาตรงๆ เลยก็ได้นะ ผมใช้บ่อย
job_name:
script:
- echo $CI_REGISTRY
Section 7: บทสรุป
ตัวแปร GitLab CI เป็นเครื่องมือที่ดีมากสำหรับการส่งค่าต่างๆ ระหว่าง Job หรือ Stage และการนำไปใช้งานก็ง่าย และยังสามารถกำหนดการเข้าถึง หรือการแสดงผลออกมาได้เพื่อความปลอดภัยของตัวระบบด้วย
และส่วนใครต้องการเก็บไฟล์สำคัญ เพื่อให้ pipeline นำไปใช้งานได้ ให้ไปดูในส่วนของ Secure file ตามนี้