มันมี 2 Features ที่เป็นประโยชน์มากๆ ในการช่วยเขียนโค็ดในไฟล์ gitlab-ci.yml
ให้ง่ายขึ้น และผมก็ใช้มันอยู่เป็นประจำ ก็คือการ Hidden keys และ Anchors
ไอ้ Hidden keys และ Anchors เป็นเมื่อนำมาใช้รวมกัน มันสามารถที่จะ reuse โค็ดของเราให้นำมาใช้งานซ้ำภายใน gitlab-ci.yml
ได้ มันเหมือนกับการที่เรา copy&past โค็ดจากจุดหนึ่งไปอีกจุด
มาดูอันแรกก่อน hidden keys คือเราสามารถ comment โค็ดของเราได้ โดยมีสองแบบคือ
#hidden_job:
# script:
# - run test
.hidden_job:
stage: build
script:
- echo "hello world"
#
ในการ comment บรรทัดนั้นๆ.
วางไว้หน้า job
จะทำให้ gitlab-ci ไม่อ่านการทำงานของ job นี้เพิ่มเติม: https://docs.gitlab.com/ee/ci/yaml/#hidden-keys-jobs
ส่วนตัว Anchors มันเอาไว้สำหรับ copy โค็ดของเรา และต้องใช้งานรวมกับ hidden keys แบบจุด .
มาดูตัวอย่างการใช้งานดีกว่า จะได้เข้าใจง่ายขึ้น
stages:
- deploy
- production
.template: &template
stage: deploy
cache:
key: site-package
policy: push
paths:
- ./build/project
artifacts:
name: "$CI_JOB_NAME-$CI_COMMIT_REF_NAME"
expire_in: 2hr20m
paths:
- ./build/project/
script:
- npm install
- npm run build
- npm run start
deploy to develop:
<<: *template
deploy to production:
<<: *template
stage: production
cache:
key: site-package
policy: pull
script:
- npm run start
จากโค็ดด้านบน .template: &template
เป็นการบอกว่าเราจะไม่ให้ gitlab-ci อ่านค่าส่วนนี้ และตั้งชื่อให้มันโดยใช้ &
นำหน้าชื่อ และเมื่อจะเอาไปใช้ก็เรียกแบบนี้ <<: *template
มองง่ายๆ &template
มันคือการ “Copy” และ *template
มันคือการ “Paste” นั้นเอง โดยผลจะออกมาแบบนี้
deploy to develop:
<<: *template
# <<: *template ที่ผมทำไว้โค็ดด้านบน ส่วนด้านล่างนี้คือการแสดงผลออกมาจริงๆ
deploy to develop:
stage: deploy
cache:
key: site-package
policy: push
paths:
- ./build/project
artifacts:
name: "$CI_JOB_NAME-$CI_COMMIT_REF_NAME"
expire_in: 2hr20m
paths:
- ./build/project/
script:
- npm install
- npm run build
- npm run start
แต่ถ้ามาดูในส่วนของ deploy to production
มันจะพวกค่า stage, cache และ script ที่จะซ้ำใน *template
มันจะทำการใช้เขียนทับให้เลย โดยเอาจากตัว deploy to production
มาใช้ เช่น
deploy to production:
<<: *template
stage: production
cache:
key: site-package
policy: pull
script:
- npm run start
#
# ผลลัพธ์ด้านล่าง
#
deploy to production:
stage: production
cache:
key: site-package
policy: pull
paths:
- ./build/project
artifacts:
name: "$CI_JOB_NAME-$CI_COMMIT_REF_NAME"
expire_in: 2hr20m
paths:
- ./build/project/
script:
- npm run start
ในการใช้ Hidden keys กับ Anchors จะทำให้โค็ดเราทำการแก้ไขสะดวกขึ้น ผมใช้งานมันตลอดเพราะมันจะมีบ้าง job ที่ทำงานในแต่ละ stage จะเหมือนกัน แต่จะต่างกันบ้างค่าเท่านั้น
ขอให้สนุกกับการเขียน gitlab-ci นะครับ 🙂