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

๐Ÿค– GitLab CI/CD ๆœ€ไฝณๅฏฆ่ธ:ๅฎ‰ๅ…จๆŽƒๆ、่ฎŠๆ•ธ็ฎก็†、Deploy Token ่ˆ‡ๆจก็ต„ๅŒ– Pipelines

    ๐Ÿค– GitLab CI/CD ๆœ€ไฝณๅฏฆ่ธ:ๅฎ‰ๅ…จๆŽƒๆ、่ฎŠๆ•ธ็ฎก็†、Deploy Token ่ˆ‡ๆจก็ต„ๅŒ– Pipelines

    GitLab CI/CD ๅนพไนŽๆ˜ฏ็พไปฃ DevOps ๅœ˜้šŠ็š„ๆจ™้…:ๅพž Commit ้–‹ๅง‹่‡ชๅ‹•้€ฒ่กŒๅปบ็ฝฎ、ๆธฌ่ฉฆ、้ƒจ็ฝฒ่ˆ‡ๅฎ‰ๅ…จๆŽƒๆ,่ฎ“็‰ˆๆœฌๅ“่ณช่ˆ‡็™ผไฝˆ็ฏ€ๅฅ้ƒฝๆ›ด็ฉฉๅฎš。 ๆœฌ็ฏ‡ๆ•ด็†ๅฏฆๅ‹™ไธŠๆœ€ๅธธ็”จ、ไนŸๆœ€ๅฎนๆ˜“่ธฉ้›ท็š„้ƒจๅˆ†:็’ฐๅขƒ่ฎŠๆ•ธ่ˆ‡ๅฏ†้‘ฐ็ฎก็†、Deploy Token ไฝฟ็”จๆ–นๅผ、 ๅ…งๅปบๅฎ‰ๅ…จๆŽƒๆๅ•Ÿ็”จ、ไปฅๅŠๅฆ‚ไฝ•ๆŠŠ Pipeline ๆ‹†ๆˆๆจก็ต„ๅŒ–็ตๆง‹,่ฎ“ๅฐˆๆกˆ่ถŠ้•ท่ถŠๅคงไนŸไธๆœƒ่ฎŠๆˆ YAML ๅœฐ็„。

    ๐Ÿ“Œ ไธ€、GitLab CI/CD ๆ ธๅฟƒๆžถๆง‹ๆฆ‚ๅฟต

    ๅ…ˆๅฟซ้€Ÿ็”จๅนพๅ€‹้—œ้ตๅญ—้‡ๆธ… GitLab CI/CD ็š„ๆ ธๅฟƒ็ต„ไปถ:

    • Runner:็œŸๆญฃๅŸท่กŒ Job ็š„ๅฏฆ้ซ”/VM/Container,ๅฏไปฅๆ˜ฏ Shared Runner ๆˆ–ๅฐˆๆกˆ่‡ชๅปบ。
    • Pipeline:็”ฑๅคšๅ€‹ Stage ่ˆ‡ Job ็ต„ๆˆ็š„ไธ€ๆฌกๅฎŒๆ•ดๆต็จ‹,ไพ‹ๅฆ‚ build → test → deploy。
    • .gitlab-ci.yml:ๆ”พๅœจ Repo ๆ น็›ฎ้Œ„็š„ YAML ่จญๅฎšๆช”,ๆ่ฟฐ Pipeline ่ฆๅ‰‡。
    • Environment:้ƒจ็ฝฒ็›ฎ็š„ๅœฐ,ไพ‹ๅฆ‚ dev、test、stage、prod ็ญ‰。

    ไธ€ๅ€‹ๆœ€็ฐกๅ–ฎ็š„ Pipeline ๅฏ่ƒฝ้•ท้€™ๆจฃ:

    stages:
      - build
      - test
      - deploy
    
    build_job:
      stage: build
      script:
        - echo "Building..."
    
    test_job:
      stage: test
      script:
        - echo "Running tests..."
    
    deploy_job:
      stage: deploy
      script:
        - echo "Deploying to production..."
    

    ๅช่ฆๆŠŠ้€™ๅ€‹ๆช”ๆกˆๅ‘ฝๅ็‚บ .gitlab-ci.yml ไธฆๆŽจไธŠ GitLab,ไธ‹ไธ€ๆฌก push ๅฐฑๆœƒ่‡ชๅ‹•่งธ็™ผ Pipeline。

    ๐Ÿ“Œ ไบŒ、GitLab ๅ…งๅปบๅฎ‰ๅ…จๆŽƒๆ:SAST / DAST / Secret Detection

    ๅœจไผๆฅญ่ˆ‡ๆ”ฟๅบœๅฐˆๆกˆไธญ,CI/CD ไธๅชๆ˜ฏ「่‡ชๅ‹• build & deploy」,ๅŒๆ™‚ไนŸๆ‰ฎๆผ”「ๅฎ‰ๅ…จๅฎˆ้–€ๅ“ก」: ๆฏๆฌก Commit ้ƒฝ้ †ไพฟ่ท‘ไธ€่ผชๅฎ‰ๅ…จๆชขๆŸฅ,ๅฏไปฅๅœจๆญฃๅผไธŠ็ทšๅ‰ๅฐฑๆŠ“ๅ‡บๆฝ›ๅœจๅ•้กŒ。

    ๆŽƒๆ้กžๅž‹ ไธป่ฆ็”จ้€”
    SAST(Static Application Security Testing) ็›ดๆŽฅๅˆ†ๆžๅŽŸๅง‹็ขผ,ๆ‰พๅ‡บ SQL Injection、XSS ็ญ‰ๅธธ่ฆ‹ๆผๆดžๆจกๅผ。
    DAST(Dynamic Application Security Testing) ๅœจๆ‡‰็”จ็จ‹ๅผๅฏฆ้š›่ท‘่ตทไพ†ๆ™‚,ไปฅ้ป‘็ฎฑๆ–นๅผๆจกๆ“ฌๆ”ปๆ“Š。
    Secret Detection ๆชขๆŸฅๆ˜ฏๅฆไธๅฐๅฟƒๆŠŠ API Key、Token、ๅฏ†็ขผ commit ๅˆฐ Repo。

    ๅœจ GitLab ไธญๅ•Ÿ็”จๅ…ถๅฏฆ้žๅธธ็ฐกๅ–ฎ,ๅช่ฆๅœจ .gitlab-ci.yml ไธญๅŠ ๅ…ฅๅฎ˜ๆ–น Template:

    include:
      - template: Security/SAST.gitlab-ci.yml
      - template: Security/DAST.gitlab-ci.yml
      - template: Security/Secret-Detection.gitlab-ci.yml
    

    ๅŠ ๅ…ฅๅพŒ็š„ๆ•ˆๆžœ:

    • ๆฏๆฌก Pipeline ๆœƒ่‡ชๅ‹•่ท‘ๅฐๆ‡‰ๆŽƒๆ。
    • ็ตๆžœๆœƒ้กฏ็คบๅœจ Merge Request ็š„「Security」ๆˆ–「Pipelines」้ ็ฑค。
    • ๅฏไปฅ็”ขๅ‡บๅ ฑ่กจ,ๆ–นไพฟ่ณ‡ๅฎ‰่ˆ‡็จฝๆ ธๆชข่ฆ–。

    ๐Ÿ“Œ ไธ‰、CI/CD ่ฎŠๆ•ธ็ฎก็†:ๅฏ†้‘ฐ、ๅฎ‰ๅ…จ่ˆ‡ๅˆ†ๅฑค้…็ฝฎ

    ไปปไฝ•ไธ€ๆขๅƒๆจฃ็š„ Pipeline ไธ€ๅฎšๆœƒๆŽฅ่งธๅˆฐๅ„ๅผๅ„ๆจฃ็š„ๆฉŸๅฏ†่ณ‡่จŠ:

    • Docker Registry ็š„ๅธณ่™Ÿๅฏ†็ขผๆˆ– Token
    • ๅ„็’ฐๅขƒ็š„ API Key、DB ๅฏ†็ขผ
    • ็ฌฌไธ‰ๆ–นๆœๅ‹™(Cloud、็›ฃๆŽง็ณป็ตฑ、Webhook)็š„ๆ†‘่ญ‰

    ้€™ไบ›็ต•ๅฐไธ่ƒฝ็กฌๅฏซๅœจ .gitlab-ci.yml ่ฃก้ข,่€Œๆ˜ฏ่ฆๆ”พๅœจ GitLab ็š„ CI/CD Variables ไธญ。

    1️⃣ Variables ๅฑค็ดš่ˆ‡ๅฑฌๆ€ง

    ๅฑค็ดš/ๅฑฌๆ€ง ่ชชๆ˜Ž
    Group-level Variable ๆ•ดๅ€‹็พค็ต„ๅบ•ไธ‹ๆ‰€ๆœ‰ Repo ้ƒฝๅ…ฑ็”จ,ไพ‹ๅฆ‚ๅ…ฌๅธ็ตฑไธ€็š„ Registry URL。
    Project-level Variable ๅชๅœจๅ–ฎไธ€ๅฐˆๆกˆๅ…งไฝฟ็”จ,ไพ‹ๅฆ‚่ฉฒ็ณป็ตฑๅฐˆ็”จ็š„ API Key。
    Protected ๅƒ…่ƒฝๅœจ Protected Branch / Tag(ๅฆ‚ main、release)ไฝฟ็”จ,้ฟๅ…ๅœจๆธฌ่ฉฆๅˆ†ๆ”ฏ่ขซๆฟซ็”จ。
    Masked ๅณไฝฟๅœจ Job Log ไธญ echo ๅ‡บไพ†ไนŸไธๆœƒ้กฏ็คบ็œŸๆญฃ็š„ๅ€ผ,ๅฏ้™ไฝŽๆดฉๆผ้ขจ้šช。

    ่จญๅฎšไฝ็ฝฎ:Project → Settings → CI/CD → Variables

    ไพ‹ๅฆ‚ๅฎš็พฉไธ€ๅ€‹ไพ› Pipeline ไฝฟ็”จ็š„ Token:

    MY_PRIVATE_TOKEN = xxxxxxx(ๅŒๆ™‚ๅ‹พ้ธ Protected + Masked)
    

    ๅœจ .gitlab-ci.yml ไฝฟ็”จๆ–นๅผๅฆ‚ไธ‹:

    deploy_job:
      stage: deploy
      script:
        - echo "Deploy with token (ไธๆœƒ้กฏ็คบ็œŸๆญฃๅ…งๅฎน)"
        - curl -H "Authorization: Bearer $MY_PRIVATE_TOKEN" https://api.example.com/deploy
    

    ๐Ÿ“Œ ๅ››、Deploy Token ่ˆ‡ Deploy Key:ๅทฎ็•ฐ่ˆ‡ๅฏฆๅ‹™ๅปบ่ญฐ

    ๅพˆๅคšๅœ˜้šŠๆœƒ็–‘ๆƒ‘:「ๆˆ‘่ฆ่ฎ“ๅค–้ƒจ็ณป็ตฑๆ‹‰ Repo ๆˆ–ๆ‹‰ Container,่ฆ็”จ Deploy Key?้‚„ๆ˜ฏ Deploy Token?」, ๅ…ฉ่€…้ƒฝๅฏไปฅ「็ตฆ็ณป็ตฑๅญ˜ๅ– Repo」,ไฝ†่จญ่จˆ็›ฎๆจ™่ˆ‡ๅฎ‰ๅ…จๆจกๅž‹ๅฎŒๅ…จไธๅŒ。

    ้ …็›ฎ Deploy Token Deploy Key
    ๅž‹ๆ…‹ ๅธณ่™Ÿ+ๅฏ†็ขผๅฝขๅผ,ๅฏๅญ˜ๅ– Repo / Registry SSH ๅ…ฌ้‘ฐ/็ง้‘ฐ้…ๅฐ,้€šๅธธ็”จๆ–ผ Read-only Clone
    ๅธธ่ฆ‹็”จ้€” Kubernetes、ๅค–้ƒจๆœๅ‹™ๆ‹‰ Docker Image CI Job ๆˆ–ๅค–้ƒจไธปๆฉŸ clone Repo
    ๅฎ‰ๅ…จๆŽงๅˆถ ๅฏ่จญๅฎš้ŽๆœŸๆ—ฅ่ˆ‡ๆฌŠ้™็ฏ„ๅœ ๅธธ่ขซๅคšๅฐˆๆกˆๅ…ฑ็”จ,็ฎก็†ไธ็•ถ่ผƒๅฎนๆ˜“็•™ไธ‹ๅพŒ้–€
    ๅปบ่ญฐ ๆญฃๅผ็’ฐๅขƒ้ƒจ็ฝฒๅผท็ƒˆๅปบ่ญฐไฝฟ็”จ ้ฉๅˆๅ–ฎ็ด” Read-only ไฝฟ็”จๆƒ…ๅขƒ

    ๆญฃๅผ็’ฐๅขƒ(prod)ๆœ€ไฝณๅฏฆๅ‹™:

    • ไฝฟ็”จ Deploy Token ๆญ้…้™ๅฎšๆฌŠ้™(ๅƒ… Pull Image / Read Repo)。
    • ่จญๅฎšๆ˜Ž็ขบ้ŽๆœŸๆ—ฅ,ไพ‹ๅฆ‚ 30~90 ๅคฉ,ๅฎšๆœŸๆฑฐๆ›。
    • Deploy Token ๅช็ตฆ CI / K8s / ้ƒจ็ฝฒ็ณป็ตฑไฝฟ็”จ,ไธ็ตฆไบบ้กž้–‹็™ผ่€…ๆ—ฅๅธธไฝฟ็”จ。

    ๐Ÿ“Œ ไบ”、Pipeline ๆจก็ต„ๅŒ–่จญ่จˆ:้ฟๅ… YAML ๅœฐ็„

    ๅฐˆๆกˆไธ€้–‹ๅง‹ๅชๆœ‰ๅ…ฉไธ‰ๅ€‹ Job,้‚„ๅฏไปฅ้ ไธ€ๅ€‹ .gitlab-ci.yml ๆ’ไฝ; ไฝ†็•ถไฝ ้–‹ๅง‹ๆ‹†ๆˆๅคšๅ€‹ๅพฎๆœๅ‹™、ๆ”ฏๆดๅคšๅ€‹้ƒจ็ฝฒ็’ฐๅขƒ、ๅˆๅŠ ไธŠไธ€ๅ †ๆŽƒๆ่ˆ‡ๆธฌ่ฉฆ, YAML ๆช”ๅฏ่ƒฝๅพˆๅฟซๅฐฑ็ ดๅƒ่กŒ,็ถญ่ญทๆˆๆœฌ็ˆ†็‚ธ。

    ๅปบ่ญฐๅšๆณ•ๆ˜ฏๆŠŠ Pipeline ๆ‹†ๆˆ「ๆจก็ต„ๅŒ–ๆช”ๆกˆ」,็›ฎ้Œ„็ตๆง‹ๅฏไปฅๅƒ้€™ๆจฃ:

    .gitlab-ci.yml
    ci-build.yml
    ci-test.yml
    ci-deploy.yml
    ci-security.yml
    

    ไธปๆช” .gitlab-ci.yml ่ฒ ่ฒฌๆŠŠๆ‰€ๆœ‰ๆจก็ต„ include ้€ฒไพ†:

    include:
      - local: "ci-build.yml"
      - local: "ci-test.yml"
      - local: "ci-deploy.yml"
      - local: "ci-security.yml"
    

    ไพ‹ๅฆ‚ ci-build.yml ๅฏไปฅๅฐˆๅฟƒๆ่ฟฐ build ็›ธ้—œ Job:

    stages:
      - build
    
    build_app:
      stage: build
      script:
        - npm ci
        - npm run build
      artifacts:
        paths:
          - dist/
    

    ๅฅฝ่™•:

    • ไธๅŒๅฐ็ต„ๅฏไปฅๅ„่‡ช็ถญ่ญท่‡ชๅทฑ็š„ CI ๆจก็ต„ๆช”。
    • ๅŒไธ€ๅ€‹ build/test/deploy ๆจก็ต„ๅฏไปฅ่ขซๅคšๅ€‹ๅฐˆๆกˆๅ…ฑ็”จ。
    • ไธปๆช” .gitlab-ci.yml ่ฎŠๆˆ「็ธฝ็›ฎ้Œ„」,ๅฏ่ฎ€ๆ€งๆ›ด้ซ˜。

    ๐Ÿ“Œ ๅ…ญ、ๅคš็’ฐๅขƒ้ƒจ็ฝฒ็ฏ„ไพ‹:dev / test / stage / prod

    ๅœจๅฏฆๅ‹™ไธญ,ๆœ€ๅธธ่ฆ‹็š„็’ฐๅขƒๅˆ†ๅฑคๅคง่‡ดๅฆ‚ไธ‹:

    ็’ฐๅขƒ ็”จ้€”
    dev ้–‹็™ผไบบๅ“กๆ—ฅๅธธๆธฌ่ฉฆ,ๅ…่จฑ่ผƒ้ซ˜้ ป็އ้ƒจ็ฝฒ。
    test / qa ๆธฌ่ฉฆๅœ˜้šŠ้€ฒ่กŒๅŠŸ่ƒฝ่ˆ‡ๅ›žๆญธๆธฌ่ฉฆ。
    stage / pre-prod ๅนพไนŽ็ญ‰ๅŒๆญฃๅผ็’ฐๅขƒ,็”จไพ†ๅšๆœ€ๅพŒ้ฉ—่ญ‰。
    prod ๆญฃๅผๅฐๅค–ๆœๅ‹™,ๆ‰€ๆœ‰ๆ“ไฝœๅฟ…้ ˆๅฏ่ฟฝ่นค、ๅฏ็จฝๆ ธ。

    ไปฅไธ‹ๆ˜ฏไธ€ๅ€‹็ฐกๅŒ–็‰ˆ็š„ๅคš็’ฐๅขƒ้ƒจ็ฝฒ YAML ็ฏ„ไพ‹:

    stages:
      - build
      - test
      - deploy
    
    build_app:
      stage: build
      script:
        - npm ci
        - npm run build
      artifacts:
        paths:
          - dist/
    
    test_app:
      stage: test
      script:
        - npm test
    
    deploy_dev:
      stage: deploy
      environment:
        name: dev
        url: https://dev.example.com
      script:
        - ./deploy.sh dev
      only:
        - branches
      except:
        - main
    
    deploy_prod:
      stage: deploy
      environment:
        name: production
        url: https://www.example.com
      script:
        - ./deploy.sh prod
      when: manual
      only:
        - main
    

    ้€™่ฃกๆœ‰ๅนพๅ€‹้‡้ปž:

    • dev ็’ฐๅขƒ:ๅฐๆ‰€ๆœ‰ๅˆ†ๆ”ฏ้–‹ๆ”พ,่‡ชๅ‹•้ƒจ็ฝฒ,ๆ–นไพฟ้–‹็™ผไบบๅ“กๅฟซ้€Ÿ้ฉ—่ญ‰。
    • prod ็’ฐๅขƒ:ๅชๆœ‰ main ๅˆ†ๆ”ฏๅฏไปฅ้ƒจ็ฝฒ,ไธ”ๅฟ…้ ˆ็”ฑไบบๆ‰‹ๅ‹•ๆŒ‰ไธ‹「Play」。
    • Environment ๅ€ๅกŠ:ๅฏๆญ้… GitLab ็š„ Environment Dashboard ้กฏ็คบๆฏๅ€‹็’ฐๅขƒ็›ฎๅ‰่ท‘็š„ๆ˜ฏๅ“ชไธ€ๅ€‹ Commit。

    ๐Ÿ“Œ ไธƒ、ๆ•ˆ่ƒฝๆœ€ไฝณๅŒ–:Cache、Artifacts ่ˆ‡ Runner ็ญ–็•ฅ

    ็•ถๅฐˆๆกˆ่ฎŠๅคง、Pipeline ๆฌกๆ•ธ่ฎŠๅคš,CI/CD ้€Ÿๅบฆๅฐฑๆœƒๆˆ็‚บ้–‹็™ผๆ•ˆ็އ็š„้—œ้ต。ไปฅไธ‹ๆ˜ฏๅนพๅ€‹ๅธธ่ฆ‹็š„ๆœ€ไฝณๅŒ–ๆŠ€ๅทง:

    1️⃣ ๅ–„็”จ Cache ๆธ›ๅฐ‘้‡่ค‡ไธ‹่ผ‰ไพ่ณด

    cache:
      key: "node-modules"
      paths:
        - node_modules/
    

    ๆญ้… npm ci ๆˆ– yarn install,ๅฏไปฅๅคงๅน…ๆธ›ๅฐ‘ๆฏๆฌก Pipeline ็š„ไพ่ณดไธ‹่ผ‰ๆ™‚้–“。

    2️⃣ ไฝฟ็”จ Artifacts ๅ‚ณ้žๅปบ็ฝฎ็ตๆžœ

    ไธ่ฆๅœจๆฏๅ€‹ Stage ้‡ๆ–ฐ build,่€Œๆ˜ฏๆŠŠ build ๅ‡บไพ†็š„็ตๆžœๅ‚ณ้ž็ตฆๅพŒ็บŒ Job ไฝฟ็”จ:

    build_app:
      stage: build
      script:
        - npm ci
        - npm run build
      artifacts:
        paths:
          - dist/
    
    deploy_prod:
      stage: deploy
      dependencies:
        - build_app
      script:
        - ./deploy_dist.sh
    

    3️⃣ Runner ่ฆๅŠƒๅปบ่ญฐ

    • ้‡ๅฐไธๅŒไปปๅ‹™้กžๅž‹ไฝฟ็”จไธๅŒ Tag(ไพ‹ๅฆ‚ dockershell)。
    • ๆ€•ๅฝฑ้Ÿฟๆญฃๅผ็’ฐๅขƒ็š„้ƒจ็ฝฒ Job,่ซ‹ไฝฟ็”จๅฐˆๅฑฌ Runner,ไธ่ˆ‡ไธ€่ˆฌ build/test ๅ…ฑ็”จ。
    • ๆœ‰ๅคง้‡ parallel job ๆ™‚,ๅฏ็”จ autoscaling Runner(ไพ‹ๅฆ‚ๆญ้… K8s ๆˆ– Cloud)ๅ‹•ๆ…‹ๆ“ด็ธฎ。

    ๐Ÿ“Œ ๅ…ซ、ๅฏฆๅ‹™ๅฎ‰ๅ…จๅปบ่ญฐ็ธฝๆ•ด็†

    ๆœ€ๅพŒๆ•ด็†ไธ€ไปฝ「CI/CD ๅฎ‰ๅ…จ Checklist」,ๆ–นไพฟๅœจๅฐŽๅ…ฅๆˆ–็จฝๆ ธๆ™‚ๅฟซ้€ŸๆชขๆŸฅ:

    • ๆ‰€ๆœ‰ Token、ๅฏ†็ขผ้ƒฝๆ”พๅœจ CI/CD Variables,ไธๅฏซๆญปๅœจ YAML ๆˆ–็จ‹ๅผ็ขผ。
    • ้‡่ฆ่ฎŠๆ•ธไธ€ๅพ‹่จญ็‚บ Protected + Masked
    • Production ้ƒจ็ฝฒ Job ไธ€ๅพ‹่จญๅฎš when: manual,ไธฆๅชๅ…่จฑ main / release ๅˆ†ๆ”ฏ่งธ็™ผ。
    • Deploy Token ่จญๅฎš้ŽๆœŸๆ—ฅ่ˆ‡ๅฟ…่ฆๆœ€ๅฐๆฌŠ้™(Principle of Least Privilege)。
    • ๅ•Ÿ็”จ SAST / DAST / Secret Detection ็ญ‰ๅฎ‰ๅ…จๆŽƒๆ。
    • ้™ๅˆถ Runner Tag,้ฟๅ…ไธๅฏไฟก็š„ Job ๅœจๆ•ๆ„Ÿ Runner ไธŠๅŸท่กŒ。
    • ่จญๅฎš Branch Protection ่ฆๅ‰‡:่ฆๆฑ‚ Merge Request、่‡ณๅฐ‘ไธ€ไฝ reviewer ้€š้Žๆ‰่ƒฝๅˆไฝต。

    ๐Ÿ”— ๅปถไผธ้–ฑ่ฎ€

    — WWFandy・DevOps ่‡ชๅ‹•ๅŒ–ๅทฅ็จ‹็ญ†่จ˜

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

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

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

    ๅญ—็ดš