Utilities
npm 패키지 배포, Slack 알림
collabops/npm-publish@v1
On-Premise: ❌ — npm registry 연결 필요
npm 패키지를 빌드하고 레지스트리에 배포합니다. Provenance를 지원합니다.
| Input | Required | Default | Description |
|---|---|---|---|
npm-token | YES | - | npm Automation Token. $\{\{ secrets.NPM_TOKEN \}\} 권장 |
access | NO | "public" | 패키지 접근 수준 (public, restricted) |
tag | NO | "latest" | 배포 태그 (latest, beta, next) |
provenance | NO | "false" | Provenance 생성 여부 |
working-directory | NO | "/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을 통해 알림을 전송합니다.
| Input | Required | Default | Description |
|---|---|---|---|
webhook-url | YES | - | Slack Incoming Webhook URL. $\{\{ secrets.SLACK_WEBHOOK \}\} 권장 |
payload | NO | "" | 커스텀 JSON payload (설정 시 다른 필드 무시) |
message | NO | "" | 알림 메시지 텍스트 (payload 미사용 시 필수) |
title | NO | "" | 메시지 제목 |
color | NO | "good" | 메시지 색상 (good, warning, danger 또는 hex) |
icon-emoji | NO | "" | 봇 아이콘 이모지 (예: :rocket:) |
username | NO | "" | 봇 이름 override |
channel | NO | "" | 대상 채널 (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 보다 우선.