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

๐Ÿณ ๅพž้›ถๆ‰“้€  GitLab + Docker ่‡ชๅ‹•้ƒจ็ฝฒ็’ฐๅขƒ:CI Runner、Registry、Compose ไธ€ๆข้พๅฏฆๆˆฐ

    ๐Ÿณ ๅพž้›ถๆ‰“้€  GitLab + Docker ่‡ชๅ‹•้ƒจ็ฝฒ็’ฐๅขƒ:CI Runner、Registry、Compose ไธ€ๆข้พๅฏฆๆˆฐ

    ๆœฌ็ฏ‡ๅฐ‡ๅพž้›ถ้–‹ๅง‹,ๅธถไฝ ๆ‰“้€ ไธ€ๅฅ—「ไผๆฅญๅฏฆ้š›ๆœƒไฝฟ็”จ」็š„ GitLab CI/CD ่‡ชๅ‹•้ƒจ็ฝฒๆžถๆง‹,ๆ•ดๅˆ:

    • ✔ GitLab Runner(Docker Executor)
    • ✔ GitLab Registry(ๅฎ‰ๅ…จ็งๆœ‰ Image ๅ„ฒๅญ˜ๅบซ)
    • ✔ Docker Compose(ๆœๅ‹™่‡ชๅ‹•้ƒจ็ฝฒ)
    • ✔ CI/CD ่‡ชๅ‹•ๅปบ็ฝฎ + ๆŽจ้€ + ้ƒจ็ฝฒ

    ้€™ๆ˜ฏไผๆฅญ็’ฐๅขƒๆœ€ๅธธ่ฆ‹、ๆœ€็ฉฉๅฎš、ๆœ€ๅฎŒๆ•ด็š„ไธ€ๆข้พ้ƒจ็ฝฒๆต็จ‹。


    ๐Ÿ“Œ ็ฌฌไธ€็ซ :ๆžถๆง‹็ธฝ่ฆฝ(Architecture Overview)

    ๆ•ดๅ€‹ๆต็จ‹ๅฆ‚ไธ‹:

    1. ้–‹็™ผ่€… Push Code → GitLab
    2. CI Pipeline ่‡ชๅ‹•ๅปบ็ฝฎ Docker Image
    3. Push ๅˆฐ GitLab Registry(็‰ˆๆœฌๆจ™็ฑค、็Ÿญ SHA ID)
    4. ้ƒจ็ฝฒ้šŽๆฎต SSH ๅˆฐ้ƒจ็ฝฒไผบๆœๅ™จ
    5. Docker Compose ่‡ชๅ‹•ๆ›ดๆ–ฐๆœๅ‹™

    ๆžถๆง‹ๅœ–(็ฐกๅŒ–):

    Developer → GitLab Repo → CI Pipeline → Docker Build
                                          ↓ Push
                                 GitLab Registry
                                          ↓ Deploy
                                    Production Server
                                 Docker Compose Up -d
    

    ๐Ÿ“Œ ็ฌฌไบŒ็ซ :ๆบ–ๅ‚™็’ฐๅขƒ

    2.1 ๅฎ‰่ฃ Docker(้ƒจ็ฝฒๆฉŸ)

    curl -fsSL https://get.docker.com | sh
    systemctl enable --now docker
    

    2.2 ๅฎ‰่ฃ Docker Compose

    apt install docker-compose-plugin -y
    

    2.3 ๅœจ้ƒจ็ฝฒๆฉŸๅปบ็ซ‹ๅฐˆๆกˆ็›ฎ้Œ„

    mkdir -p /srv/myapp
    cd /srv/myapp
    
    ๅปบ็ซ‹ๅŸบๆœฌ docker-compose.yml
    version: "3"
    
    services:
      app:
        image: registry.example.com/mygroup/myapp:latest
        restart: always
        ports:
          - "3000:3000"
    

    ๐Ÿ“Œ ็ฌฌไธ‰็ซ :่จญๅฎš GitLab Registry(็งๆœ‰ Image ๅ„ฒๅญ˜ๅบซ)

    3.1 ็™ปๅ…ฅ Registry

    GitLab ๆฏๅ€‹ๅฐˆๆกˆ้ƒฝ่‡ชๅธถ Registry。

    docker login registry.example.com
    

    GitLab CI ไธญๆœƒไฝฟ็”จ:

    • $CI_REGISTRY
    • $CI_REGISTRY_USER
    • $CI_REGISTRY_PASSWORD
    ้€™ไบ›่ฎŠๆ•ธ GitLab ๆœƒ่‡ชๅ‹•ๆไพ›。

    ๐Ÿ“Œ ็ฌฌๅ››็ซ :ๅฎ‰่ฃ GitLab Runner(Docker Executor)

    4.1 ๅฎ‰่ฃ Runner

    curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | bash
    apt install gitlab-runner -y
    

    4.2 ่จปๅ†Š Docker Runner

    gitlab-runner register \
      --executor docker \
      --docker-image docker:24 \
      --description "docker-runner"
    
    Runner ๆœƒไฝฟ็”จ docker:dind ไพ†ๅปบ็ฝฎ docker image。

    ๐Ÿ“Œ ็ฌฌไบ”็ซ :ๆ’ฐๅฏซ .gitlab-ci.yml(CI/CD ๆ ธๅฟƒ)

    ไปฅไธ‹ๆ˜ฏๅฎŒๆ•ดๅฏ็›ดๆŽฅไฝฟ็”จ็š„็คบ็ฏ„ๆช”ๆกˆ。

    5.1 .gitlab-ci.yml

    stages:
      - build
      - push
      - deploy
    
    variables:
      IMAGE_NAME: $CI_REGISTRY_IMAGE/app
    
    build_image:
      stage: build
      image: docker:24
      services:
        - docker:24-dind
      script:
        - docker build -t $IMAGE_NAME:$CI_COMMIT_SHORT_SHA .
      artifacts:
        expire_in: 1 hour
    
    push_image:
      stage: push
      image: docker:24
      services:
        - docker:24-dind
      script:
        - echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin $CI_REGISTRY
        - docker tag $IMAGE_NAME:$CI_COMMIT_SHORT_SHA $IMAGE_NAME:latest
        - docker push $IMAGE_NAME:$CI_COMMIT_SHORT_SHA
        - docker push $IMAGE_NAME:latest
    
    deploy_prod:
      stage: deploy
      before_script:
        - 'which ssh-agent || ( apt update -y && apt install openssh-client -y )'
        - eval $(ssh-agent -s)
        - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
        - mkdir -p ~/.ssh
        - chmod 700 ~/.ssh
        - echo "$DEPLOY_SERVER_KNOWN_HOSTS" > ~/.ssh/known_hosts
      script:
        - ssh root@$DEPLOY_SERVER "docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY"
        - ssh root@$DEPLOY_SERVER "cd /srv/myapp && docker compose pull && docker compose up -d"
      only:
        - main
    

    ้€™ๅ€‹ Pipeline ่ƒฝๅšๅˆฐ:

    • ✔ Docker Build
    • ✔ ๆŽจ้€่‡ณๅฐˆๆกˆ Registry
    • ✔ SSH ้ƒจ็ฝฒ่‡ณ Production Server
    • ✔ ไฝฟ็”จ docker-compose ่‡ชๅ‹•้‡ๅ•Ÿๆœๅ‹™

    ๐Ÿ“Œ ็ฌฌๅ…ญ็ซ :้ƒจ็ฝฒๆฉŸ่จญๅฎš SSH ้ƒจ็ฝฒ้‡‘้‘ฐ

    ๅœจ GitLab Repository → Settings → CI/CD → Variables ไธญๆ–ฐๅขž:

    • SSH_PRIVATE_KEY
    • DEPLOY_SERVER_KNOWN_HOSTS
    ้ƒจ็ฝฒๆฉŸ้œ€ๅŠ ๅ…ฅ GitLab ่ช่ญ‰้‡‘้‘ฐ:
    mkdir ~/.ssh
    chmod 700 ~/.ssh
    nano ~/.ssh/authorized_keys
    
    ่ฒผไธŠ GitLab CI ไฝฟ็”จ็š„ public key。

    ๐Ÿ“Œ ็ฌฌไธƒ็ซ :้ƒจ็ฝฒๆ›ดๆ–ฐๆต็จ‹็คบๆ„

    ็•ถไฝ  Push Code ๆˆ– Merge Request ้€ฒ main ๆ™‚:

    1. GitLab Runner ๅปบ็ฝฎ Docker Image
    2. ๆŠŠ Image ๆŽจ้€ๅˆฐ GitLab Registry
    3. CI ็”จ SSH ้€ฃๅˆฐ้ƒจ็ฝฒไธปๆฉŸ
    4. ้ƒจ็ฝฒไธปๆฉŸๅŸท่กŒ docker compose pull && up -d
    5. ๆœๅ‹™็ซ‹ๅณๆ›ดๆ–ฐ(้›ถไธญๆ–ท)

    ๐Ÿ“Œ ็ฌฌๅ…ซ็ซ :ๆœ€ไฝณๅฏฆๅ‹™(ไผๆฅญ้ƒจ็ฝฒๅปบ่ญฐ)

    • ๐Ÿณ ไฝฟ็”จ docker:stable ๆˆ– docker:24 ็‰ˆๆœฌๅปบ็ฝฎ็’ฐๅขƒ
    • ๐Ÿ” ไฝฟ็”จ GitLab CI Masked Variables ไฟ่ญทๅฏ†็ขผ
    • ๐Ÿš€ ้ƒจ็ฝฒๅชๅ…่จฑ main / master branch
    • ๐Ÿ“ฆ ๅฐ‡ docker-compose.yml ็‰ˆๆœฌ็ฎก็†
    • ๐Ÿ“ ้–‹็™ผ่ˆ‡ๆญฃๅผ็’ฐๅขƒไฝฟ็”จไธๅŒ็š„็’ฐๅขƒ่ฎŠๆ•ธ(.env.prod)

    ๐Ÿ“Œ ็ต่ชž

    ๆœฌ็ฏ‡็คบ็ฏ„็š„ GitLab + Docker ่‡ชๅ‹•้ƒจ็ฝฒๆต็จ‹,ๆ˜ฏไผๆฅญๆœ€ๅธธ็”จ็š„ DevOps ๅŸบ็คŽๆžถๆง‹。 ้€้Ž CI Runner、Registry、SSH ไปฅๅŠ Docker Compose,ไฝ ๅฏไปฅๆ‰“้€ ๅฎŒๆ•ด、ๅฏ้‡็พ、ๅฏๆ“ดๅ……็š„่‡ชๅ‹•ๅŒ–้ƒจ็ฝฒๆต็จ‹。

    ไธ‹ไธ€็ฏ‡ๅฐ‡ๆŽจๅ‡บ: 《GitLab CI/CD ้€ฒ้šŽ็ฏ‡:Artifacts、Stages、Canary Deployment、Blue-Green Release ๅฏฆๆˆฐ》


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

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

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

    ๅญ—็ดš