Docker / CI/CD pipeline-д Docker ашиглах

CI/CD pipeline-д Docker ашиглах

Код push хийх бүрт автоматаар image build хийж, registry-д байршуулах нь орчин үеийн хөгжүүлэлтийн стандарт болсон. Энэ хичээлд GitHub Actions ашиглан тэр процессийг тохируулна.

Үндсэн ойлголт

код
git push → GitHub Actions trigger → docker build → docker push → Registry

Үүний дараа сервер шинэ image татаж, deploy хийнэ.

GitHub Actions-ийн бүтэц

.github/workflows/docker.yml файл үүсгэнэ:

yaml
name: Docker Build ба Push

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  build-and-push:
    runs-on: ubuntu-latest

    steps:
      - name: Код татах
        uses: actions/checkout@v4

      - name: Docker Hub-д нэвтрэх
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Image build ба push
        uses: docker/build-push-action@v5
        with:
          context: .
          push: ${{ github.ref == 'refs/heads/main' }}
          tags: |
            ${{ secrets.DOCKERHUB_USERNAME }}/myapp:latest
            ${{ secrets.DOCKERHUB_USERNAME }}/myapp:${{ github.sha }}

push: ${{ github.ref == 'refs/heads/main' }} — зөвхөн main branch-д push хийгдэхэд registry-д upload хийнэ. PR-д зөвхөн build шалгана.

GitHub Secrets тохируулах

Repository → Settings → Secrets and variables → Actions:

код
DOCKERHUB_USERNAME   →  docker hub хэрэглэгчийн нэр
DOCKERHUB_TOKEN      →  Docker Hub access token (нууц үг биш!)

Docker Hub access token авах:

  1. hub.docker.com → Account Settings → Security
  2. New Access Token → нэр өгч үүсгэнэ
  3. Гарсан token-ийг GitHub Secrets-т хадгална

GitHub Container Registry ашиглах

Docker Hub-ийн оронд ghcr.io ашиглавал нэмэлт нууц хадгалах шаардлагагүй:

yaml
name: Docker Build ба Push

on:
  push:
    branches: [main]

jobs:
  build-and-push:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write

    steps:
      - uses: actions/checkout@v4

      - name: ghcr.io-д нэвтрэх
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Image build ба push
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: |
            ghcr.io/${{ github.repository }}:latest
            ghcr.io/${{ github.repository }}:${{ github.sha }}

GITHUB_TOKEN нь GitHub-ийн автоматаар олгодог token — нэмэлт тохируулга шаардлагагүй.

Layer cache — CI дахь хурдасгалт

CI ажиллах бүрт layer-уудыг дахин build хийвэл удаан болно. Cache ашиглаж хурдасгана:

yaml
- name: Docker Buildx тохируулах
  uses: docker/setup-buildx-action@v3

- name: Image build ба push (cache-тай)
  uses: docker/build-push-action@v5
  with:
    context: .
    push: true
    tags: ghcr.io/${{ github.repository }}:latest
    cache-from: type=gha
    cache-to: type=gha,mode=max

type=gha — GitHub Actions cache ашиглана. npm install эсвэл pip install layer өөрчлөгдөөгүй бол дахин ажиллахгүй.

Multi-platform build

ARM сервер (AWS Graviton, Apple M series) болон x86 хоёуланд ажиллах image:

yaml
- name: Docker Buildx тохируулах
  uses: docker/setup-buildx-action@v3

- name: Image build ба push
  uses: docker/build-push-action@v5
  with:
    context: .
    platforms: linux/amd64,linux/arm64
    push: true
    tags: ghcr.io/${{ github.repository }}:latest

Бүтэн workflow жишээ — tag-д тулгуурласан version

yaml
name: Docker Release

on:
  push:
    tags:
      - "v*" # v1.0.0, v2.1.3 зэрэг tag-д ажиллана

jobs:
  release:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write

    steps:
      - uses: actions/checkout@v4

      - name: Docker meta
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: ghcr.io/${{ github.repository }}
          tags: |
            type=semver,pattern={{version}}
            type=semver,pattern={{major}}.{{minor}}
            type=semver,pattern={{major}}

      - uses: docker/setup-buildx-action@v3

      - uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          cache-from: type=gha
          cache-to: type=gha,mode=max

v1.2.3 tag push хийвэл автоматаар 1.2.3, 1.2, 1 гэсэн tag-ууд үүснэ.

Build явцыг шалгах

код
GitHub → Repository → Actions tab

Ажиллаж байгаа болон өнгөрсөн workflow-уудыг харж болно. Алдаа гарвал хаана яагаад гарсныг логоос харна.

Дараагийн хичээлд:

Docker Dockerfile болон workflow-ийн шилдэг туршлагуудыг нэгтгэн checklist хэлбэрт оруулна.