CollabOps

Docker 빌드

docker-login + docker-build-push 템플릿으로 컨테이너 이미지 빌드 및 푸시

범용 Docker 레지스트리(Docker Hub, GHCR, Harbor 등)에 이미지를 빌드/푸시하는 예제입니다. collabops/docker-login + collabops/docker-build-push 템플릿 조합을 권장합니다.

collabops/docker-loginusername/password.docker/config.json 을 생성하는 범용 Docker 레지스트리 인증 템플릿입니다. GCP Artifact Registry는 gcloud-docker-auth, AWS ECR은 aws-ecr-auth 를 대신 사용하세요. 인증 없이 push 하면 레지스트리가 denied 를 반환합니다. 자세한 내용은 시스템 템플릿 — Core 를 참고하세요.

기본: 템플릿으로 빌드 & 푸시

docker-login 으로 레지스트리에 인증한 뒤 docker-build-push 로 빌드/푸시합니다. 두 템플릿의 config 경로 기본값이 서로 맞물려 있어 추가 설정이 필요 없습니다.

name: docker-build-push

triggers:
  push:
    branches: [main]

jobs:
  build-and-push:
    # Docker 서비스 활성화
    services:
      - docker
    steps:
      # 1. 소스 체크아웃
      - name: checkout
        uses: "collabops/checkout@v2"
        with:
          repo-url: "https://<collabops-host>/<workspace>/<repository>.git"

      # 2. 레지스트리 인증 — .docker/config.json 생성
      - name: registry-login
        uses: "collabops/docker-login@v1"
        with:
          registry: ghcr.io                       # 미지정 시 Docker Hub (docker.io)
          username: ${{ secrets.REGISTRY_USERNAME }}
          password: ${{ secrets.REGISTRY_PASSWORD }}

      # 3. 빌드 & 푸시 — 위 인증 정보를 자동으로 사용
      - name: build-push
        uses: "collabops/docker-build-push@v1"
        with:
          tags: |
            ghcr.io/my-org/myapp:latest

멀티 태그 + 멀티 스테이지 빌드

docker-build-push 의 tags 로 여러 태그를 한 번에 푸시하고, target 으로 멀티스테이지 빌드 타겟을, build-args 로 빌드 인자를 전달합니다.

name: multi-tag-build

triggers:
  push:
    branches: [main]
    tags: ["v*"]

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: my-org/my-app

jobs:
  build:
    services:
      - docker
    steps:
      - name: checkout
        uses: "collabops/checkout@v2"
        with:
          repo-url: "https://<collabops-host>/<workspace>/<repository>.git"

      # 레지스트리 인증
      - name: registry-login
        uses: "collabops/docker-login@v1"
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ secrets.REGISTRY_USERNAME }}
          password: ${{ secrets.REGISTRY_PASSWORD }}

      # 멀티스테이지 타겟 + 멀티 태그 빌드 & 푸시
      - name: build-push
        uses: "collabops/docker-build-push@v1"
        with:
          # SHA 태그 + latest 태그
          tags: |
            ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ collabops.sha }}
            ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
          target: production               # 멀티스테이지 빌드 타겟
          build-args: |
            NODE_ENV=production

docker CLI 직접 사용 — 선택적 서비스 활성화

템플릿 대신 docker CLI를 직접 쓸 수도 있습니다. 이때는 docker login --password-stdin 으로 직접 인증해야 합니다. Docker가 필요한 Job에만 services를 선언합니다.

name: selective-docker

triggers:
  push:
    branches: [main]

jobs:
  # 테스트 — Docker 불필요
  test:
    steps:
      - name: unit-test
        image: node:18
        run: npm test

  # 빌드 — Docker 필요
  docker-build:
    needs: [test]
    services:
      - docker                            # 이 Job에만 Docker 서비스 활성화
    steps:
      - name: build-push
        image: docker:27.5-cli
        env:
          REGISTRY_USERNAME: ${{ secrets.REGISTRY_USERNAME }}
          REGISTRY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }}
        run: |
          # CLI 직접 사용 시 docker login 으로 인증 — stdin 으로 비밀번호 전달
          echo "${REGISTRY_PASSWORD}" | docker login ghcr.io \
            -u "${REGISTRY_USERNAME}" --password-stdin

          docker build -t ghcr.io/my-org/myapp:${{ collabops.sha }} .
          docker push ghcr.io/my-org/myapp:${{ collabops.sha }}

  # 배포 — Docker 불필요
  deploy:
    needs: [docker-build]
    steps:
      - name: deploy
        run: kubectl set image deployment/app app=ghcr.io/my-org/myapp:${{ collabops.sha }}

포인트

collabops/docker-login@v1 로 범용 레지스트리에 인증하고 collabops/docker-build-push@v1 로 빌드/푸시하는 조합이 권장 방식입니다.

docker-loginconfig-pathdocker-build-pushdocker-config 는 같은 위치를 가리켜야 하며, 기본값끼리는 자동으로 맞물립니다.

GCP Artifact Registry는 gcloud-docker-auth, AWS ECR은 aws-ecr-auth 인증 템플릿을 사용합니다.

services: [docker] 선언만으로 Docker 서비스가 활성화되며, 불필요한 Job에는 선언하지 않습니다.

docker CLI를 직접 쓸 때는 docker login --password-stdin 으로 인증을 직접 처리해야 합니다.

목차