We are not waiting for future, We create the future

Tags


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

7th March 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 นะครับ :)

IT manager & DevOps @Twin Synergy Co.,Ltd

View Comments