CollabOps

Utilities

npm 패키지 배포, Slack 알림

collabops/npm-publish@v1

On-Premise: ❌ — npm registry 연결 필요

npm 패키지를 빌드하고 레지스트리에 배포합니다. Provenance를 지원합니다.

InputRequiredDefaultDescription
npm-tokenYES-npm Automation Token. $\{\{ secrets.NPM_TOKEN \}\} 권장
accessNO"public"패키지 접근 수준 (public, restricted)
tagNO"latest"배포 태그 (latest, beta, next)
provenanceNO"false"Provenance 생성 여부
working-directoryNO"/workspace/source"package.json이 있는 디렉토리

예시

기본 — public 패키지 latest 배포

jobs:
  publish:
    steps:
      - name: checkout
        uses: "collabops/checkout@v2"
        with:
          repo-url: "https://<collabops-host>/<workspace>/<repository>.git"
      - name: install-and-build
        run: |
          npm ci
          npm run build
        image: node:22-alpine
      - name: npm-publish
        uses: "collabops/npm-publish@v1"
        with:
          # automation token 권장 (publish 권한만).
          npm-token: ${{ secrets.NPM_TOKEN }}

Pre-release — beta 태그 + restricted scope

# 베타 태그가 push 될 때만 실행.
triggers:
  push:
    tags: ["v*-beta.*"]

jobs:
  publish-beta:
    steps:
      - name: checkout
        uses: "collabops/checkout@v2"
        with:
          repo-url: "https://<collabops-host>/<workspace>/<repository>.git"
      - name: install-and-build
        run: |
          npm ci
          npm run build
        image: node:22-alpine
      - name: npm-publish-beta
        uses: "collabops/npm-publish@v1"
        with:
          npm-token: ${{ secrets.NPM_TOKEN }}
          # 사내용 scoped 패키지 — 외부에 노출하지 않음.
          access: restricted
          # latest 가 아닌 beta 태그로 publish — npm i pkg@beta 로만 받음.
          tag: beta

공급망 보안 — provenance 활성화

jobs:
  publish:
    steps:
      - name: checkout
        uses: "collabops/checkout@v2"
        with:
          repo-url: "https://<collabops-host>/<workspace>/<repository>.git"
      - name: install-and-build
        run: |
          npm ci
          npm run build
        image: node:22-alpine
      - name: npm-publish-with-provenance
        uses: "collabops/npm-publish@v1"
        with:
          npm-token: ${{ secrets.NPM_TOKEN }}
          # npm 페이지에 'Verified provenance' 배지 노출 (Sigstore 서명).
          provenance: "true"

포인트npm-token 은 automation token 권장 (publish 권한만). Scoped 패키지에서 access 가 잘못 잡히면 publish 가 실패하니 명시. provenance: "true" 는 공급망 검증을 npm 페이지에 노출 — 가능하면 항상 ON.

collabops/slack-notify@v1

On-Premise: ❌ — Slack SaaS 연결 필요

Slack Incoming Webhook을 통해 알림을 전송합니다.

InputRequiredDefaultDescription
webhook-urlYES-Slack Incoming Webhook URL. $\{\{ secrets.SLACK_WEBHOOK \}\} 권장
payloadNO""커스텀 JSON payload (설정 시 다른 필드 무시)
messageNO""알림 메시지 텍스트 (payload 미사용 시 필수)
titleNO""메시지 제목
colorNO"good"메시지 색상 (good, warning, danger 또는 hex)
icon-emojiNO""봇 아이콘 이모지 (예: :rocket:)
usernameNO""봇 이름 override
channelNO""대상 채널 (webhook 기본 채널 override)

예시

단순 성공 알림

# 성공 알림은 별도 Job 으로 분리 + Job 레벨 if: "success()".
jobs:
  deploy:
    steps:
      - name: deploy
        run: ./deploy.sh
        image: alpine:3.20

  notify-success:
    needs: [deploy]
    if: "success()"
    steps:
      - name: notify
        uses: "collabops/slack-notify@v1"
        with:
          webhook-url: ${{ secrets.SLACK_WEBHOOK }}
          title: "Deploy success"
          message: "sha ${{ collabops.sha }} 배포 완료"
          color: good
          channel: "#deploys"

실패 시에만 알림

# 실패 알림은 별도 Job + if: "failure()" 로 처리. Step-level if 는 미지원.
jobs:
  deploy:
    steps:
      - name: do-deploy
        run: ./deploy.sh
        image: alpine:3.20

  notify-failure:
    needs: [deploy]
    if: "failure()"
    steps:
      - name: notify
        uses: "collabops/slack-notify@v1"
        with:
          webhook-url: ${{ secrets.SLACK_WEBHOOK }}
          title: "Deploy failed"
          message: "${{ collabops.actor }} 의 ${{ collabops.sha }} 배포 실패 — 로그 확인 필요"
          color: danger
          channel: "#alerts"

고급 — Block Kit payload

jobs:
  notify:
    steps:
      - name: rich-payload
        uses: "collabops/slack-notify@v1"
        with:
          webhook-url: ${{ secrets.SLACK_WEBHOOK }}
          # payload 가 지정되면 message/title/color 보다 우선.
          # 줄바꿈 그대로 JSON 문자열을 전달.
          payload: |
            {
              "blocks": [
                { "type": "header", "text": { "type": "plain_text", "text": "Release ${{ collabops.ref_name }}" } },
                { "type": "section", "text": { "type": "mrkdwn", "text": "*sha:* `${{ collabops.sha }}`" } }
              ]
            }

포인트webhook-url 은 채널 단위 Incoming Webhook secret. Step-level if 는 미지원이므로 조건부 알림은 별도 Job 으로 분리하고 Job-level if: "success()" / if: "failure()" 를 사용. 복잡한 메시지는 payload 로 Block Kit JSON 전체를 보내면 message/title/color 보다 우선.

목차