CollabOps

Core

체크아웃, Docker 빌드, 캐시, 아티팩트 — 파이프라인의 기본 빌딩 블록

collabops/checkout@v2

On-Premise: ✅ airgapped 호환

Git repository를 체크아웃합니다. repo-url의 scheme에 따라 SSH/HTTPS로 자동 분기합니다. HTTPS 사용 시 플랫폼이 주입한 Job Token으로 인증되므로 별도의 인증 설정이 필요 없습니다.

권장: HTTPS repo-url + JobToken 자동 인증. ssh-key는 외부 호스트나 SSH 전용 환경에서만 사용하고, 개인 SSH 키 대신 저장소 단위 Deploy Key를 사용하세요. 배경과 마이그레이션 절차는 인증 문서를 참고하세요.

InputRequiredDefaultDescription
repo-urlYES-Git repository URL. SSH(git@host:ns/repo.git, ssh://...) 또는 HTTPS(https://host/ns/repo.git)
refNO$\{\{ collabops.ref_name \}\}체크아웃할 Git ref (branch, tag, SHA)
event-nameNO$\{\{ collabops.event_name \}\}이벤트 타입. change_requesthead-ref를 자동 사용
head-refNO$\{\{ collabops.head_ref \}\}change_request 이벤트의 source(head) 브랜치명
shaNO$\{\{ collabops.sha \}\}체크아웃할 정확한 커밋 SHA
ssh-keyNO""SSH 개인 키 (base64 인코딩). SSH URL 사용 시 필수
fetch-depthNO"1"히스토리 깊이 (0 = 전체, 1 = shallow)
cleanNO"true"기존 소스 디렉토리 정리 후 clone
pathNO"/workspace/source"체크아웃 대상 경로

예시

기본 — HTTPS + JobToken (가장 권장)

jobs:
  build:
    steps:
      # 가장 일반적인 형태. JobToken 이 자동 주입되어 별도 인증 설정 없음.
      - name: checkout
        uses: "collabops/checkout@v2"
        with:
          repo-url: "https://<collabops-host>/<workspace>/<repository>.git"
        image: node:22-alpine

Change Request — head 브랜치 자동

# CR(Change Request) 이벤트 — change_request 트리거 사용.
triggers:
  change_request:
    branches: [main]

jobs:
  test:
    steps:
      # event-name 기본값이 collabops.event_name. change_request 이면
      # head-ref(원본 브랜치) 가 자동으로 사용됨 — 따로 ref 를 줄 필요 없음.
      - name: checkout-pr-head
        uses: "collabops/checkout@v2"
        with:
          repo-url: "https://<collabops-host>/<workspace>/<repository>.git"
        image: node:22-alpine

전체 히스토리 + 커스텀 경로

jobs:
  release-notes:
    steps:
      - name: checkout-full-history
        uses: "collabops/checkout@v2"
        with:
          repo-url: "https://<collabops-host>/<workspace>/<repository>.git"
          fetch-depth: "0"            # git log / diff 가 전 히스토리 필요할 때
          path: "/workspace/src"      # 기본 /workspace/source 대신 별도 경로 지정
        image: alpine/git:2.45.2
      - name: generate-changelog
        run: |
          cd /workspace/src
          git log --oneline --no-merges \
            $(git describe --tags --abbrev=0)..HEAD > /workspace/source/CHANGELOG.txt
        image: alpine/git:2.45.2

외부 호스트 — SSH Deploy Key

jobs:
  mirror:
    steps:
      # 외부 SaaS(예: GitHub.com) 등 SSH 가 필요한 경우.
      # 개인 SSH 키 대신 저장소 단위 Deploy Key 를 base64 로 secret 등록.
      - name: checkout-external
        uses: "collabops/checkout@v2"
        with:
          repo-url: "git@github.com:my-org/private-repo.git"
          ref: main
          ssh-key: ${{ secrets.MIRROR_DEPLOY_KEY_B64 }}
        image: alpine/git:2.45.2

포인트 — HTTPS + JobToken 이 기본값이자 권장. SSH 는 외부 호스트 전용. change_request 이벤트에서는 추가 설정 없이 head 브랜치가 잡힘. 전 히스토리가 필요한 작업(git log, semantic-release 등)만 fetch-depth: 0. 여러 리포를 한 Job 에서 체크아웃할 때는 path 로 충돌을 피함.

collabops/docker-login@v1

On-Premise: ✅ airgapped 호환

범용 Docker 레지스트리 인증입니다. username/password.docker/config.json 을 생성하여 docker-build-push 의 push 인증에 사용합니다. registry 미지정 시 Docker Hub. GCP Artifact Registry는 gcloud-docker-auth, AWS ECR은 aws-ecr-auth 를 사용하세요.

InputRequiredDefaultDescription
registryNO"docker.io"Docker 레지스트리 호스트 (예: ghcr.io). 미지정 시 Docker Hub
usernameYES-레지스트리 사용자명
passwordYES-레지스트리 비밀번호 또는 액세스 토큰. $\{\{ secrets.* \}\} 로 전달
config-pathNO"/workspace/source".docker/config.json 생성 기준 경로. docker-build-pushdocker-config 와 같은 위치를 가리켜야 함

예시

GHCR (GitHub Container Registry)

jobs:
  publish:
    services:
      - docker
    steps:
      - name: docker-login
        uses: "collabops/docker-login@v1"
        with:
          registry: ghcr.io
          username: ${{ secrets.GHCR_USER }}
          # PAT 또는 GHCR 토큰. read:packages / write:packages 권한 필요.
          password: ${{ secrets.GHCR_TOKEN }}
      - name: build-push
        uses: "collabops/docker-build-push@v1"
        with:
          tags: "ghcr.io/my-org/api:${{ collabops.sha }}"

Docker Hub (registry 생략)

jobs:
  publish:
    services:
      - docker
    steps:
      - name: docker-login
        # registry 미지정 → docker.io (Docker Hub) 가 기본.
        uses: "collabops/docker-login@v1"
        with:
          username: ${{ secrets.DOCKERHUB_USER }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      - name: build-push
        uses: "collabops/docker-build-push@v1"
        with:
          tags: "my-org/api:latest"

사설 레지스트리 + 커스텀 config-path

jobs:
  publish:
    services:
      - docker
    steps:
      - name: login-internal-registry
        uses: "collabops/docker-login@v1"
        with:
          registry: registry.internal.example.com
          username: ${{ secrets.INTERNAL_REG_USER }}
          password: ${{ secrets.INTERNAL_REG_TOKEN }}
          # docker-build-push 의 docker-config 와 동일 디렉토리를 가리켜야 인증이 전달됨.
          config-path: /workspace/source/.ci
      - name: build-push
        uses: "collabops/docker-build-push@v1"
        with:
          tags: "registry.internal.example.com/team/api:${{ collabops.sha }}"
          docker-config: /workspace/source/.ci/.docker/config.json

포인트username/password 는 항상 secret 으로 주입. ECR/Artifact Registry 는 전용 템플릿(aws-ecr-auth, gcloud-docker-auth) 사용 — docker-login 으로 직접 처리하지 않음. config-path 를 변경했다면 docker-build-pushdocker-config 도 같은 경로로 맞춰야 함.

collabops/docker-build-push@v1

On-Premise: ✅ airgapped 호환

Docker 이미지 빌드 및 멀티 태그 푸시입니다. 이미지를 push 하려면 docker-login · gcloud-docker-auth · aws-ecr-auth 등 인증 템플릿을 먼저 실행해야 합니다.

InputRequiredDefaultDescription
tagsYES-이미지 태그 목록 (줄바꿈 구분)
contextNO"/workspace/source"빌드 컨텍스트 경로
fileNO"Dockerfile"Dockerfile 경로 (context 기준 상대 경로)
pushNO"true"빌드 후 푸시 여부
build-argsNO""빌드 인자 (KEY=VALUE, 줄바꿈 구분)
targetNO""멀티스테이지 빌드 시 타겟 스테이지
platformNO""타겟 플랫폼 (예: linux/amd64). 단일 플랫폼만 지원 — 멀티아치는 buildx 필요
cache-fromNO""캐시 소스
cache-toNO""캐시 대상 (type=inline). type=registry,mode=max 는 buildx 필요
extra-argsNO""추가 docker build 인자
docker-configNO"/workspace/source/.docker/config.json"인증 config.json 경로. docker-login 등 인증 템플릿이 생성한 파일

예시

단일 태그 빌드+push

jobs:
  build:
    services:
      - docker
    steps:
      - name: login
        uses: "collabops/docker-login@v1"
        with:
          registry: ghcr.io
          username: ${{ secrets.GHCR_USER }}
          password: ${{ secrets.GHCR_TOKEN }}
      - name: build-push
        uses: "collabops/docker-build-push@v1"
        with:
          # 커밋 SHA 1개만 태깅 — 가장 단순한 형태.
          tags: "ghcr.io/my-org/api:${{ collabops.sha }}"

멀티태그 (SHA + latest + 브랜치)

jobs:
  build:
    services:
      - docker
    steps:
      - name: login
        uses: "collabops/docker-login@v1"
        with:
          registry: ghcr.io
          username: ${{ secrets.GHCR_USER }}
          password: ${{ secrets.GHCR_TOKEN }}
      - name: build-push-multi
        uses: "collabops/docker-build-push@v1"
        with:
          # 줄바꿈 구분으로 여러 태그를 한 번에 push. ref_name 은 브랜치명.
          tags: |
            ghcr.io/my-org/api:${{ collabops.sha }}
            ghcr.io/my-org/api:${{ collabops.ref_name }}
            ghcr.io/my-org/api:latest

멀티스테이지 target + build-args + platform

jobs:
  build:
    services:
      - docker
    steps:
      - name: login
        uses: "collabops/docker-login@v1"
        with:
          registry: ghcr.io
          username: ${{ secrets.GHCR_USER }}
          password: ${{ secrets.GHCR_TOKEN }}
      - name: build-runner-stage
        uses: "collabops/docker-build-push@v1"
        with:
          tags: "ghcr.io/my-org/web:${{ collabops.sha }}"
          file: Dockerfile
          target: runner               # 멀티스테이지 Dockerfile 의 최종 stage 이름
          platform: linux/amd64        # 단일 플랫폼만 지원(멀티아치는 buildx 필요)
          build-args: |
            NODE_ENV=production
            BUILD_REVISION=${{ collabops.sha }}

Inline 캐시로 재빌드 가속

jobs:
  build:
    services:
      - docker
    steps:
      - name: login
        uses: "collabops/docker-login@v1"
        with:
          registry: ghcr.io
          username: ${{ secrets.GHCR_USER }}
          password: ${{ secrets.GHCR_TOKEN }}
      - name: build-with-inline-cache
        uses: "collabops/docker-build-push@v1"
        with:
          tags: |
            ghcr.io/my-org/api:${{ collabops.sha }}
            ghcr.io/my-org/api:cache
          # type=inline 은 buildx 없이도 동작. 이전 빌드의 :cache 태그를 캐시 소스로 사용.
          cache-from: type=registry,ref=ghcr.io/my-org/api:cache
          cache-to: type=inline

포인트 — 인증 Step 을 항상 먼저 실행하고 같은 Job 안에 둘 것. tags 는 줄바꿈으로 여러 태그를 한 번에 push 가능. type=registry,mode=max 같은 buildx 전용 캐시는 buildx 환경에서만 동작 — 일반 docker:27.1 이미지에서는 type=inline 을 사용. 멀티아치가 필요하면 buildx 가 활성화된 이미지로 변경.

collabops/cache@v2

On-Premise: ✅ airgapped 호환

플랫폼 스토리지 기반 의존성 캐시를 저장하고 복원합니다. restoresave를 별도 Step으로 분리하여 사용합니다. airgapped On-Premise 호환 — minio/mc 이미지에서 바이너리를 워크스페이스로 복사해 런타임 외부 다운로드가 없습니다.

InputRequiredDefaultDescription
actionYES-캐시 동작 (restore 또는 save)
pathYES-캐시할 디렉토리 경로 (상대경로는 /workspace/source 기준)
keyYES-캐시 키 (고유 식별자)
restore-keysNO""폴백 캐시 키 prefix (줄바꿈으로 구분, restore 시에만 사용)

예시

pnpm node_modules — restore→build→save 흐름

# 캐시 키는 lockfile 파일명 + 브랜치명으로 구성. hashFiles() 는 미지원.
# 동일 브랜치에서 lockfile 변경이 없으면 같은 키 → 캐시 적중.
jobs:
  install:
    steps:
      - name: checkout
        uses: "collabops/checkout@v2"
        with:
          repo-url: "https://<collabops-host>/<workspace>/<repository>.git"
      - name: cache-restore
        uses: "collabops/cache@v2"
        with:
          action: restore
          path: node_modules
          key: "pnpm-${{ collabops.ref_name }}"
      - name: install-deps
        run: |
          corepack enable
          pnpm install --frozen-lockfile
        image: node:22-alpine
      - name: build
        run: pnpm build
        image: node:22-alpine
      - name: cache-save
        uses: "collabops/cache@v2"
        with:
          action: save
          path: node_modules
          key: "pnpm-${{ collabops.ref_name }}"

restore-keys 폴백 — lockfile 변경 직후에도 부분 캐시 활용

jobs:
  install:
    steps:
      - name: checkout
        uses: "collabops/checkout@v2"
        with:
          repo-url: "https://<collabops-host>/<workspace>/<repository>.git"
      - name: cache-restore-with-fallbacks
        uses: "collabops/cache@v2"
        with:
          action: restore
          path: node_modules
          key: "pnpm-${{ collabops.ref_name }}-${{ collabops.sha }}"
          # 정확한 키가 없으면 prefix 매칭으로 가장 최근 캐시 사용.
          # 위에서 아래로 시도 — 매칭되는 첫 prefix 의 최신 캐시를 가져옴.
          restore-keys: |
            pnpm-${{ collabops.ref_name }}-
            pnpm-main-
            pnpm-

포인트restoresave 는 반드시 별도 Step. hashFiles() 는 현재 미지원이므로 키는 collabops.ref_name(브랜치) 같은 결정적 변수로 구성. Lockfile 갱신 후 cold start 가 부담이면 restore-keys 로 더 일반적인 prefix 를 폴백 지정. Step-level if 는 미지원이므로 빌드 실패 시 캐시 오염을 막으려면 캐시 save 를 별도 Job 으로 분리하고 그 Job 에 if: "success()" 를 거는 방식을 사용.

collabops/upload-artifact@v2

On-Premise: ✅ airgapped 호환

빌드 산출물을 플랫폼 스토리지에 업로드합니다. Job 간 파일 전달에 사용합니다. airgapped On-Premise 호환.

InputRequiredDefaultDescription
nameYES-아티팩트 이름 (예: build-output, dist)
pathYES-업로드할 파일 또는 디렉토리 경로 (상대경로는 /workspace/source 기준)

예시

단일 디렉토리 업로드

jobs:
  build:
    steps:
      - name: checkout
        uses: "collabops/checkout@v2"
        with:
          repo-url: "https://<collabops-host>/<workspace>/<repository>.git"
      - name: build
        run: |
          npm ci
          npm run build       # → /workspace/source/dist 생성
        image: node:22-alpine
      # 빌드 산출물을 다른 Job 에 넘기기 위해 업로드.
      - name: upload-dist
        uses: "collabops/upload-artifact@v2"
        with:
          name: web-dist
          path: dist           # 상대경로는 /workspace/source 기준

포인트 — 한 Job 안에서 생성된 파일을 다른 Job 에 전달할 때 사용. name 은 같은 워크플로우에서 유일해야 함 — download-artifact 가 이 이름으로 식별. 단일 파일도 가능하나 디렉토리 단위로 묶어두면 파라미터화가 쉬움.

collabops/download-artifact@v2

On-Premise: ✅ airgapped 호환

플랫폼 스토리지에서 빌드 산출물을 다운로드합니다. 같은 워크플로우에서 upload-artifact로 업로드된 파일을 받을 때 사용합니다. airgapped On-Premise 호환.

InputRequiredDefaultDescription
nameYES-다운로드할 아티팩트 이름
pathNO""복원 경로 (상대경로는 /workspace/source 기준, 미지정 시 아티팩트 이름 사용)

예시

두 Job 흐름 — build 가 upload, deploy 가 download

jobs:
  build:
    steps:
      - name: checkout
        uses: "collabops/checkout@v2"
        with:
          repo-url: "https://<collabops-host>/<workspace>/<repository>.git"
      - name: build-app
        run: |
          npm ci
          npm run build
        image: node:22-alpine
      - name: upload-dist
        uses: "collabops/upload-artifact@v2"
        with:
          name: web-dist
          path: dist

  deploy:
    needs: [build]                # 같은 워크플로우의 build Job 완료 후 실행
    steps:
      # 동일 이름으로 산출물을 받는다. path 미지정 시 name 과 같은 디렉토리에 풀림.
      - name: pull-build-output
        uses: "collabops/download-artifact@v2"
        with:
          name: web-dist
          path: dist
      - name: list-dist
        run: ls -la /workspace/source/dist   # 이후 단계에서 그대로 사용
        image: alpine:3.20

포인트upload-artifactname 과 정확히 일치해야 받음. needs 로 명시적인 Job 의존성을 잡지 않으면 download 가 upload 보다 먼저 실행될 수 있음. path 미지정 시 name 과 같은 디렉토리에 펼침 — 의도와 어긋나면 명시 권장.

목차