็†ฑ้–€ๅˆ†้กž
 ่ผ‰ๅ…ฅไธญ…
็›ฎ้Œ„

๐Ÿ™ GitLab CI/CD ้€ฒ้šŽ้ƒจ็ฝฒ:Dynamic Environments、Preview App、Blue-Green ่ˆ‡ Canary ๅฎŒๆ•ดๆŒ‡ๅ—

    ๐Ÿ™ ็‚บไป€้บผ่ฆไฝฟ็”จ Dynamic Environments、Blue-Green ่ˆ‡ Canary?

    ๅคง้ƒจๅˆ†ๅœ˜้šŠๅœจๅฐŽๅ…ฅ GitLab CI/CD ๅˆๆœŸ,ๅชๆ˜ฏๅ–ฎ็ด”ๆŠŠ็จ‹ๅผ build、test、deploy ๅˆฐไธ€ๅ€‹ๅ›บๅฎš็’ฐๅขƒ(ๅฆ‚ staging、production), ้•ทๆœŸไธ‹ไพ†ๆœƒ้‡ๅˆฐๅนพๅ€‹็—›้ปž:

    • ๆฏๅ€‹ Merge Request ้ƒฝ่ฆๆ‰‹ๅ‹•ไฝˆ็ฝฒๅˆฐ「ๅ…ฑๅŒๆธฌ่ฉฆๆฉŸ」,ๅฎนๆ˜“ๆ‰“ๆžถ。
    • ไธŠ็ทš้ƒฝๆ˜ฏ「ไธ€ๆฌกๆ€งๅˆ‡ๆ›」:ไธ€ๆ—ฆๅ‡บ้Œฏ,ๅช่ƒฝ็ทŠๆ€ฅ Rollback。
    • ็ผบๅฐ‘ๆผธ้€ฒๅผ(Canary)่ˆ‡ Blue-Green ๆฉŸๅˆถ,้ขจ้šช้›ฃไปฅๆŽงๅˆถ。

    ๆœฌ็ฏ‡ๆœƒไปฅๅฏฆๅ‹™่ง’ๅบฆ่ชชๆ˜Žๅฆ‚ไฝ•ๅœจ GitLab CI ่ฃๅฐŽๅ…ฅ: Dynamic Environments、Preview Apps、Blue-Green ้ƒจ็ฝฒ、Canary Release, ไธฆๆไพ›ๅฏ็›ดๆŽฅๆ”น็”จ็š„ .gitlab-ci.yml ็ฏ„ไพ‹。

    ๐Ÿ“Œ ๆ ธๅฟƒๆฆ‚ๅฟต็ธฝๆ•ด็†

    • Static Environment: ๅ›บๅฎšๅ็จฑ,ไพ‹ๅฆ‚ stagingproduction
    • Dynamic Environments: ไพ $CI_COMMIT_REF_SLUG ๆˆ– $CI_MERGE_REQUEST_IID ็ญ‰ๅ‹•ๆ…‹ๅปบ็ซ‹็š„็’ฐๅขƒ。
    • Review App: ๆฏๅ€‹ๅˆ†ๆ”ฏ / MR ้ƒฝๆœ‰่‡ชๅทฑ็š„ๆธฌ่ฉฆ็ถฒๅ€,ๆ–นไพฟ PM、QA、่จญ่จˆ review。
    • Blue-Green: ็ถญๆŒๅ…ฉๅ€‹ production ็’ฐๅขƒ(blue / green),ไบคๆ›ฟๆŽฅๆ‰‹ๆต้‡,้™ไฝŽ้ƒจ็ฝฒ้ขจ้šช。
    • Canary Release: ้€ๆญฅๅขžๅŠ ๆต้‡,ไพ‹ๅฆ‚ 10% → 50% → 100%,้Ž็จ‹ไธญๅฏ้šจๆ™‚ๅœๆญข。

    ๐Ÿ“Œ ๅŸบ็คŽ:ๅœจ GitLab CI ไธญๅฎš็พฉ็’ฐๅขƒ(environment)

    ๅ…ˆๅพžๆœ€ๅŸบๆœฌ็š„ static environment ้–‹ๅง‹:

    deploy_staging:
      stage: deploy
      script:
        - ./deploy.sh staging
      environment:
        name: staging
        url: https://staging.example.com
    
    deploy_production:
      stage: deploy
      script:
        - ./deploy.sh production
      environment:
        name: production
        url: https://www.example.com
        on_stop: stop_production
    

    GitLab UI ๆœƒ่‡ชๅ‹•ๅปบ็ซ‹「็’ฐๅขƒ」้ ็ฑค,ๅฏ็œ‹ๅˆฐๆฏๆฌก้ƒจ็ฝฒ็‹€ๆ…‹、URL ่ˆ‡ Rollback ็ด€้Œ„。

    ๐Ÿ“Œ Dynamic Environments ่ˆ‡ Review Apps

    1. ไพๅˆ†ๆ”ฏๅปบ็ซ‹ Dynamic Environment

    review_app:
      stage: deploy
      script:
        - ./deploy_review.sh "$CI_COMMIT_REF_SLUG"
      environment:
        name: review/$CI_COMMIT_REF_SLUG
        url: https://$CI_COMMIT_REF_SLUG.review.example.com
        on_stop: stop_review_app
      rules:
        - if: '$CI_COMMIT_BRANCH && $CI_COMMIT_BRANCH != "main"'
    

    2. ๅœ็”จ Review App(on_stop Job)

    stop_review_app:
      stage: deploy
      script:
        - ./cleanup_review.sh "$CI_COMMIT_REF_SLUG"
      environment:
        name: review/$CI_COMMIT_REF_SLUG
        action: stop
      rules:
        - if: '$CI_COMMIT_BRANCH && $CI_COMMIT_BRANCH != "main"'
          when: manual
    

    ้€™ๆจฃๅœจ Merge Request ้ ้ขๆœƒๅ‡บ็พไธ€้ก†「Open live environment」ๆŒ‰้ˆ•, Reviewer ๅฏไปฅ็›ดๆŽฅ้ปž้€ฒๅŽปๆธฌ่ฉฆ่ฉฒๅˆ†ๆ”ฏ็š„ๅฏฆ้š›็•ซ้ข。

    3. ไพ Merge Request ๅปบ็ซ‹ Review App(ๆŽจ่–ฆ)

    review_app:
      stage: deploy
      script:
        - ./deploy_review.sh "mr-$CI_MERGE_REQUEST_IID"
      environment:
        name: review/mr-$CI_MERGE_REQUEST_IID
        url: https://mr-$CI_MERGE_REQUEST_IID.review.example.com
        on_stop: stop_review_app
      rules:
        - if: '$CI_MERGE_REQUEST_IID'
    

    ๐Ÿ“Œ Blue-Green Deployment:ๅ…ฉๅฅ— production ไบคๆ›ฟๅˆ‡ๆ›

    ๅธธ่ฆ‹ๅšๆณ•ๆ˜ฏ็ถญๆŒ production-blue ่ˆ‡ production-green ๅ…ฉ็ต„็’ฐๅขƒ, ๅฏฆ้š›ๆต้‡็”ฑ Load Balancer / Gateway ๆŽง็ฎก(ไพ‹ๅฆ‚ Nginx、HAProxy、Cloud Load Balancer)。

    1. ๅปบ็ซ‹ Blue / Green ๅ…ฉๅ€‹็’ฐๅขƒ

    .deploy_production_template:
      stage: deploy
      script:
        - ./deploy_prod.sh "$TARGET_SLOT"
      environment:
        name: $ENV_NAME
        url: $ENV_URL
      when: manual
      allow_failure: false
    
    deploy_blue:
      extends: .deploy_production_template
      variables:
        TARGET_SLOT: blue
        ENV_NAME: production-blue
        ENV_URL: https://blue.example.com
    
    deploy_green:
      extends: .deploy_production_template
      variables:
        TARGET_SLOT: green
        ENV_NAME: production-green
        ENV_URL: https://green.example.com
    

    2. ๅˆ‡ๆ›ๆต้‡(็”ฑ LB / DNS ๆŽงๅˆถ)

    ๆŽฅ่‘—ๅฏไปฅๅœจ CI ่ฃกๅŠ ไธ€ๅ€‹ Job ๅŽปๅ‘ผๅซ LB API ๆˆ– Ansible:

    switch_to_blue:
      stage: deploy
      script:
        - ./switch_traffic.sh blue   # ไพ‹ๅฆ‚ไฟฎๆ”น Nginx upstream ๆˆ– DNS
      when: manual
      needs: ["deploy_blue"]
    
    switch_to_green:
      stage: deploy
      script:
        - ./switch_traffic.sh green
      when: manual
      needs: ["deploy_green"]
    

    ๅฏฆๅ‹™ไธŠๆœƒๅ…ˆ้ƒจ็ฝฒๅˆฐๅฆๅค–ไธ€้‚Š(ๅฆ‚ blue), ็ขบ่ชๆฒ’ๅ•้กŒๅพŒๅ†ๅŸท่กŒ switch_to_blue ๆŠŠๆต้‡ๅˆ‡ๆ›้ŽๅŽป; ้‡ๅˆฐๅ•้กŒๆ™‚,ๅช่ฆๅŸท่กŒ switch_to_green ๅณๅฏๅฟซ้€Ÿๅ›žๅพฉ。

    ๐Ÿ“Œ Canary Release:10% → 50% → 100% ๆผธ้€ฒๅผไธŠ็ทš

    Canary ๅ‘ๅธƒ้‡้ปžๅœจ「ๅˆ†ๆ‰น」:

    • ๅ…ˆ่ฎ“ไธ€ๅฐ้ƒจไปฝไฝฟ็”จ่€…ไฝฟ็”จๆ–ฐ็‰ˆๆœฌ(10%)。
    • ่ง€ๅฏŸ้Œฏ่ชค็އ、ๅปถ้ฒ、ไฝฟ็”จ่€…ๅ›ž้ฅ‹。
    • ็ขบ่ช็ฉฉๅฎšๅพŒๅ†้€ๆญฅๆ”พๅคงๆต้‡ๅˆฐ 50%、100%。

    ๅœจ GitLab ไธญๅฏไปฅ็”จๅคšๅ€‹ Canary Job ่กจ้”ไธๅŒ้šŽๆฎต, ๅฏฆ้š›ๆต้‡ๆฏ”ไพ‹ไบค็ตฆ Kubernetes / Ingress / Service Mesh(ๅฆ‚ Istio、NGINX Ingress)。

    ็ฏ„ไพ‹:ไธ‰้šŽๆฎต Canary Pipeline

    deploy_canary_10:
      stage: deploy
      script:
        - ./deploy_canary.sh 10   # 10% ๆต้‡
      environment:
        name: production-canary
        url: https://www.example.com
      when: manual
    
    deploy_canary_50:
      stage: deploy
      script:
        - ./deploy_canary.sh 50   # 50% ๆต้‡
      environment:
        name: production-canary
      when: manual
      needs: ["deploy_canary_10"]
    
    deploy_canary_100:
      stage: deploy
      script:
        - ./deploy_canary.sh 100  # 100%:่ˆ‡ๆญฃๅผ็‰ˆไธ€่‡ด
      environment:
        name: production
        url: https://www.example.com
      when: manual
      needs: ["deploy_canary_50"]
    

    ๅฏไปฅไพๅœ˜้šŠๆˆ็†Ÿๅบฆ่ชฟๆ•ด้šŽๆฎตๆ•ธ้‡่ˆ‡ๆขไปถ, ไพ‹ๅฆ‚ๅœจ 10% ้šŽๆฎตๆ™‚ๅฟ…้ ˆ็”ฑ SRE / PM ๅ…ฑๅŒ็ขบ่ชๅพŒๆ‰ๅ…่จฑๅพ€ 50%。

    ๐Ÿ“Œ ่‡ชๅ‹•ๆธ…็† Dynamic Environments:้ฟๅ…็ˆ†็‚ธๆˆไธ€ๅ †็’ฐๅขƒ

    ๅคง้‡ไฝฟ็”จ Review Apps ไน‹ๅพŒ,ๅพˆๅฟซๆœƒๆœ‰ๅนพๅ็”š่‡ณไธŠ็™พๅ€‹็’ฐๅขƒ, ๅ› ๆญคไธ€ๅฎš่ฆๆญ้…:

    • on_stop Job: MR ้—œ้–‰ๆ™‚่‡ชๅ‹•ๆธ…็†。
    • auto_stop_in ้ŽๆœŸ่‡ชๅ‹•ๅœๆญข็’ฐๅขƒ。

    ็ฏ„ไพ‹:7 ๅคฉๅพŒ่‡ชๅ‹•ๅœๆญข Review App

    review_app:
      stage: deploy
      script:
        - ./deploy_review.sh "mr-$CI_MERGE_REQUEST_IID"
      environment:
        name: review/mr-$CI_MERGE_REQUEST_IID
        url: https://mr-$CI_MERGE_REQUEST_IID.review.example.com
        on_stop: stop_review_app
        auto_stop_in: 7 days
      rules:
        - if: '$CI_MERGE_REQUEST_IID'
    

    ๐Ÿ“Œ ่ˆ‡ Kubernetes / GitOps ๆ•ดๅˆ็š„ๅ…ธๅž‹ๆจกๅผ

    ่‹ฅๅฐˆๆกˆๅทฒ็ถ“ไฝฟ็”จ Kubernetes,ๅฏๅฐ‡ GitLab CI ็š„ Deploy Job ๆ”น็‚บ:

    • ็›ดๆŽฅ kubectl apply ๆˆ– Helm
    • ๆˆ–ไฝฟ็”จ Argo CD / Flux ๅš GitOps,ๅŒๆญฅๅˆฐ K8s
    deploy_review_k8s:
      stage: deploy
      image: bitnami/kubectl:latest
      script:
        - kubectl config use-context "$KUBE_CONTEXT"
        - kubectl apply -f k8s/overlays/review/"$CI_COMMIT_REF_SLUG"
      environment:
        name: review/$CI_COMMIT_REF_SLUG
        url: https://$CI_COMMIT_REF_SLUG.review.example.com
    

    Canary / Blue-Green ็š„ๆต้‡ๅˆ†้…, ๅ‰‡ๅฏไปฅไบค็ตฆ K8s Ingress、Service Mesh,ๆˆ– External LB ็ฎก็†。

    ๐Ÿ“Œ ๅฏฆๅ‹™ๆœ€ไฝณๅšๆณ•ๆธ…ๅ–ฎ

    • ไธ€้–‹ๅง‹ๅ…ˆๅ•Ÿ็”จ Review Apps,ๆๅ‡ๅ”ไฝœ้ซ”้ฉ—。
    • ๅทฒ็ถ“ๆœ‰็ฉฉๅฎš staging / production ๅ†ๅฐŽๅ…ฅ Blue-Green
    • ้ซ˜้ขจ้šชๅŠŸ่ƒฝๆˆ–ๆ ธๅฟƒ็ณป็ตฑๆ‰ไฝฟ็”จ Canary Release
    • ๆŠŠ้ƒจ็ฝฒ่…ณๆœฌๆŠฝๆˆๅ…ฑไบซ template(.deploy_template),้ฟๅ…้‡่ค‡。
    • ๆ•ๆ„Ÿ่ณ‡่จŠ(Token、้‡‘้‘ฐ)ๅ…จ้ƒจๆ”พๅœจ GitLab CI/CD Variables
    • ็ฟ’ๆ…ฃๅœจ deploy Job ่จญ when: manual + only / rules ๆŽง็ฎก่งธ็™ผๆขไปถ。

    ๐Ÿ“š ๅปถไผธ้–ฑ่ฎ€

    ๐Ÿ’ฌ ๆญก่ฟŽๅœจไธ‹ๆ–น็•™่จ€่จŽ่ซ–!

    ไฝ ็›ฎๅ‰็š„ GitLab Pipeline ๆœ‰ไฝฟ็”จ Dynamic Environments、Blue-Green ๆˆ– Canary ๅ—Ž?
    ๆญก่ฟŽๅˆ†ไบซไฝ ็š„ๅฏฆไฝœๆ–นๅผ、่ธฉ้›ท็ถ“้ฉ—ๆˆ–ๆƒณๅ„ชๅŒ–็š„ๅœฐๆ–น,ไธ€่ตทไบคๆต DevOps ๅฏฆๅ‹™!๐Ÿš€

    ๐Ÿ”— ๅˆ†ไบซ้€™็ฏ‡ LINE Facebook X

    ๆฒ’ๆœ‰็•™่จ€:

    ๅผต่ฒผ็•™่จ€

    ๅญ—็ดš