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