Gitlab-CI กล้วยๆ: จัดการความหลากหลายของ Branch และ Environment

ผมได้มีโอกาสพัฒนาโปรเจ็กต์บ้างตัวที่จะต้องเจอกับความหลากหลายของ Branch และสภาพแวดล้อม (Environment) ที่แตกต่างกัน ซึ่งมักจะต้องการไปป์ไลน์ (Pipeline) ที่แตกต่างกันด้วย ทำให้มันจะมีขั้นตอน ตัวแปร และตัวเลือกการกำหนดค่าที่แตกต่างกันไปอีก... หัวจะปวด

ต่อไปนี้ผมขอทับศัพท์นะครับ
สภาพแวดล้อม = Environment
ไปป์ไลน์ = Pipeline

กราบงามๆ สามทีสำหรับ Gitlab-CI ทำให้ง่ายต่อการจัดการหลายๆ Pipeline สำหรับ Branch และ Environment ที่แตกต่างกัน หากใครต้องมาพบเจอแบบผม ในบทความนี้ ผมจะพาไปดูวิธีการทำที่ผมใช้ประจำ เพื่อให้เราจัดการ Pipeline ได้ง่าย และมีประสิทธิภาพ

Step 1: Define Your Pipelines

ขั้นตอนแรกของการกำหนด Pipeline ของเราสำหรับแต่ละ Branch และ Environment  สามารถทำได้ในไฟล์ .gitlab-ci.yml ในโปรเจ็กต์ของเรา

สมมติว่าเรามีโปรเจ็กต์ที่มีสอง Branch หลักคือ master และ develop และเรายังมี Environment หลักสองอย่างอีก ได้แก่ production and staging ต่อไปนี้คือตัวอย่างวิธีกำหนด Pipeline


# .gitlab-ci.yml

stages:
  - build
  - test
  - deploy

build_master:
  stage: build
  script:
    - echo "Building master branch..."
  only:
    - master

build_develop:
  stage: build
  script:
    - echo "Building develop branch..."
  only:
    - develop

test_production:
  stage: test
  script:
    - echo "Testing production environment..."
  only:
    - master
  environment:
    name: production

test_staging:
  stage: test
  script:
    - echo "Testing staging environment..."
  only:
    - develop
  environment:
    name: staging

deploy_production:
  stage: deploy
  script:
    - echo "Deploying to production environment..."
  only:
    - master
  environment:
    name: production

deploy_staging:
  stage: deploy
  script:
    - echo "Deploying to staging environment..."
  only:
    - develop
  environment:
    name: staging

จากตัวอย่างข้างต้น เราได้กำหนด 6 Jobs แต่ละ Job มีการกำหนดค่า Pipeline ที่แตกต่างกัน เราจะใช้ only: ในการระบุว่า Job แต่ละอันควรรันใน Branch ใด และใช้ environment: เพื่อระบุว่า Job ควรรันใน Environment ใด

Step 2: Set Your Variables

ต่อไป เราจะต้องตั้งค่าตัวแปร (Variables) สำหรับแต่ละ Job โดยตัวแปรสามารถใส่ค่าต่างๆ ได้เช่น authentication tokens, api url เป็นต้น

ตัวอย่างการกำหนดตัวแปรต่างๆ ใน .gitlab-ci.yml

# .gitlab-ci.yml

variables:
  PRODUCTION_API_TOKEN: "your-production-api-token"
  STAGING_API_TOKEN: "your-staging-api-token"
  PRODUCTION_API_URL: "foobaa.com"
  STAGING_API_URL: "stg.foobaa.com"

จากตัวอย่างด้านบน เราได้กำหนดไว้ 4 ตัวแปรคือ PRODUCTION_API_TOKEN และ  STAGING_API_TOKEN และ PRODUCTION_API_URL และ STAGING_API_URL โดยเราสามารถเข้าถึงตัวแปรเหล่านี้ได้ในแต่ละ Job คือ $VARIABLE_NAME ซึ่งจะทำให้เราแก้ไขค่าพวกนี้ง่ายขึ้น

Step 3: Run Your Pipelines

ในที่สุด เราก็พร้อมสำหรับการใช้งาน Pipeline ตัวนี้แล้ว เพียงแค่เรา Push code ไปยัง master หรือ develop branch ตัว Gitlab-ci ก็จะทำงานทันที

และเราก็ยังสามารถเรียกใช้ Pipeline ด้วยตนเองจากหน้าเว็บ Gitlab เพียงเลือก Branch ที่เราต้องการเรียกใช้ จากนั้น Gitlab-CI จะจัดการส่วนที่เหลือเอง

ลองนำไปประยุกต์ใช้กันได้ตามสะดวกนะครับ ขอให้สนุกกับการทำ Pipeline :)

ตัวอย่างไฟล์สุดท้าย

อันนี้จะเป็นตัวอย่างโค็ดสุดท้ายของ .gitlab-ci.yml จากด้านบนนะ

# .gitlab-ci.yml

variables:
  PRODUCTION_API_TOKEN: "your-production-api-token"
  STAGING_API_TOKEN: "your-staging-api-token"
  PRODUCTION_API_URL: "foobaa.com"
  STAGING_API_URL: "stg.foobaa.com"

stages:
  - build
  - test
  - deploy

build_master:
  stage: build
  script:
    - echo "Building master branch..." $PRODUCTION_API_TOKEN
  only:
    - master

build_develop:
  stage: build
  script:
    - echo "Building develop branch..."
  only:
    - develop

test_production:
  stage: test
  script:
    - echo "Testing production environment..."
  only:
    - master
  environment:
    name: production

test_staging:
  stage: test
  script:
    - echo "Testing staging environment..."
  only:
    - develop
  environment:
    name: staging

deploy_production:
  stage: deploy
  script:
    - echo "Deploying to production environment..."
  only:
    - master
  environment:
    name: production

deploy_staging:
  stage: deploy
  script:
    - echo "Deploying to staging environment..."
  only:
    - develop
  environment:
    name: staging


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

gitlab - Snappytux Blog