การ reuse โค็ดใน Gitlab ci

DevOps Mar 07, 2019

มันมี 2 Features ที่เป็นประโยชน์มากๆ ในการช่วยเขียนโค็ดในไฟล์ gitlab-ci.yml ให้ง่ายขึ้น และผมก็ใช้มันอยู่เป็นประจำ ก็คือการ Hidden keys และ Anchors

ไอ้ Hidden keys และ Anchors เป็นเมื่อนำมาใช้รวมกัน มันสามารถที่จะ reuse โค็ดของเราให้นำมาใช้งานซ้ำภายใน gitlab-ci.yml ได้ มันเหมือนกับการที่เรา copy&past โค็ดจากจุดหนึ่งไปอีกจุด

Hidden keys

มาดูอันแรกก่อน 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

ส่วนตัว 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 นะครับ :)

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.