Code Quality
코드 린팅, 정적 보안 분석, 시크릿 탐지, SBOM 생성
collabops/lint@v1
On-Premise: ❌ — 대체 권장: sast-scan@v1, secret-detect@v1
MegaLinter 기반 멀티언어 코드 린팅입니다. 60개 이상의 언어를 지원합니다.
| Input | Required | Default | Description |
|---|---|---|---|
enable | NO | "" | 활성화할 린터 (쉼표 구분) |
disable | NO | "" | 비활성화할 린터 (쉼표 구분) |
apply-fixes | NO | "false" | 자동 수정 적용 여부 |
working-directory | NO | "/workspace/source" | 스캔 대상 디렉토리 |
예시
전체 언어 자동 감지 + 보고
jobs:
lint:
steps:
- name: checkout
uses: "collabops/checkout@v2"
with:
repo-url: "https://<collabops-host>/<workspace>/<repository>.git"
# 변경된 파일을 감지해서 자동으로 적절한 린터 선택.
- name: lint
uses: "collabops/lint@v1"특정 언어만 검사 (enable / disable)
jobs:
lint:
steps:
- name: checkout
uses: "collabops/checkout@v2"
with:
repo-url: "https://<collabops-host>/<workspace>/<repository>.git"
- name: lint-typed
uses: "collabops/lint@v1"
with:
# enable: 화이트리스트 (지정한 것만). 쉼표 구분, 대문자.
enable: "TYPESCRIPT,YAML,DOCKERFILE"
# disable: 블랙리스트 (지정한 것 제외). enable 과 동시 사용 가능.
disable: "SPELL,COPYPASTE"자동 수정 (apply-fixes)
jobs:
lint-fix:
steps:
- name: checkout
uses: "collabops/checkout@v2"
with:
repo-url: "https://<collabops-host>/<workspace>/<repository>.git"
- name: lint-with-autofix
uses: "collabops/lint@v1"
with:
enable: "TYPESCRIPT,JAVASCRIPT"
# 포매터·자동 수정 가능한 린터에 한해 디스크에 수정 결과 반영.
apply-fixes: "true"
# 수정된 결과를 동일 워크플로우의 다른 Job 으로 전달.
- name: upload-fixes
uses: "collabops/upload-artifact@v2"
with:
name: lint-fixes
path: .포인트 — 가장 단순한 형태(with 없음)는 변경 파일 기준으로 적절한 린터를 자동 선택. enable 과 disable 은 함께 쓸 수 있고, 60+ 언어 키워드는 대문자(TYPESCRIPT, DOCKERFILE 등). apply-fixes: "true" 는 워크스페이스 파일을 수정하므로 commit/PR 자동화와 함께 쓸 때 유의.
collabops/sast-scan@v1
On-Premise: ✅ airgapped 호환
Semgrep 기반 정적 보안 분석(SAST)입니다. OWASP Top 10 등 보안 취약점을 탐지합니다.
| Input | Required | Default | Description |
|---|---|---|---|
config | NO | "auto" | Semgrep 규칙 설정 (auto, p/python, p/javascript 또는 파일 경로) |
severity | NO | "ERROR" | 최소 심각도 필터 (INFO, WARNING, ERROR) |
output-format | NO | "text" | 출력 형식 (text, json, sarif) |
working-directory | NO | "/workspace/source" | 스캔 대상 디렉토리 |
예시
기본 — auto 룰셋
jobs:
sast:
steps:
- name: checkout
uses: "collabops/checkout@v2"
with:
repo-url: "https://<collabops-host>/<workspace>/<repository>.git"
# config: "auto" 가 기본 — 언어 감지 후 표준 룰셋 자동 선택.
- name: sast-scan
uses: "collabops/sast-scan@v1"OWASP Top 10 + WARNING 이상 차단
jobs:
sast:
steps:
- name: checkout
uses: "collabops/checkout@v2"
with:
repo-url: "https://<collabops-host>/<workspace>/<repository>.git"
- name: sast-owasp
uses: "collabops/sast-scan@v1"
with:
# 표준 룰셋. Registry slug, 로컬 파일 경로, URL 모두 지원.
config: p/owasp-top-ten
# 이 수준 이상의 finding 이 있으면 Job 실패.
severity: WARNINGSARIF 결과 + artifact 업로드
# 보고서를 실패에도 보존하려면 별도 Job 으로 분리 + Job 레벨 if: "always()".
jobs:
sast:
steps:
- name: checkout
uses: "collabops/checkout@v2"
with:
repo-url: "https://<collabops-host>/<workspace>/<repository>.git"
- name: sast-with-sarif
uses: "collabops/sast-scan@v1"
with:
config: p/security-audit
# 보안 대시보드/리뷰 도구에 업로드 가능한 표준 포맷.
output-format: sarif
archive-sast-report:
needs: [sast]
# 이전 Job 의 성공/실패와 관계없이 항상 실행 — 보고서를 무조건 수집.
if: "always()"
steps:
- name: archive-sarif
uses: "collabops/upload-artifact@v2"
with:
name: sast-report
path: semgrep-results.sarif포인트 — config 는 Registry slug(p/owasp-top-ten), 로컬 경로, URL 모두 가능. severity 는 INFO|WARNING|ERROR — 차단 임계점을 명확히. SARIF 결과는 if: always() 와 upload-artifact 조합으로 실패 시에도 반드시 수집 권장.
collabops/secret-detect@v1
On-Premise: ✅ airgapped 호환
Gitleaks 기반 소스코드 시크릿 탐지입니다. API 키, 비밀번호 등 민감 정보를 검출합니다.
| Input | Required | Default | Description |
|---|---|---|---|
config | NO | "" | Gitleaks 설정 파일 경로 (.gitleaks.toml) |
report-format | NO | "json" | 리포트 형식 (json, csv, sarif, junit) |
report-path | NO | "/workspace/source/gitleaks-report.json" | 리포트 출력 경로 |
working-directory | NO | "/workspace/source" | 스캔 대상 디렉토리 |
예시
기본 스캔 + JSON 보고서
jobs:
secret-scan:
steps:
- name: checkout
uses: "collabops/checkout@v2"
with:
repo-url: "https://<collabops-host>/<workspace>/<repository>.git"
# 시크릿 스캔은 전 히스토리에 대해 실행 권장.
fetch-depth: "0"
- name: secret-detect
uses: "collabops/secret-detect@v1"커스텀 룰 + SARIF 결과 업로드
# 보고서 보존을 위해 별도 archive Job 분리.
jobs:
secret-scan:
steps:
- name: checkout
uses: "collabops/checkout@v2"
with:
repo-url: "https://<collabops-host>/<workspace>/<repository>.git"
fetch-depth: "0"
- name: secret-detect-with-rules
uses: "collabops/secret-detect@v1"
with:
# 사내 룰셋이 리포에 같이 들어있는 경우.
config: .gitleaks.toml
report-format: sarif
report-path: /workspace/source/gitleaks-report.sarif
archive-secret-report:
needs: [secret-scan]
if: "always()"
steps:
- name: archive-report
uses: "collabops/upload-artifact@v2"
with:
name: gitleaks-report
path: gitleaks-report.sarif포인트 — 시크릿 스캔은 fetch-depth: "0" 으로 전 히스토리 를 확인하는 것이 의미 있음 (shallow 체크아웃이면 누락). config 는 .gitleaks.toml 같은 사내 룰을 가리킬 수 있음 — 미지정 시 기본 룰. Finding 발생 시 Job 실패가 기본 동작 — if: always() 로 보고서를 무조건 수집.
collabops/sonar-scan@v1
On-Premise: ✅ airgapped 호환 (단, 파이프라인에서 도달 가능한 외부 SonarQube 서버 필요)
외부 SonarQube 서버에 코드 품질·보안 분석 결과를 업로드하는 정적 분석입니다. sonar-scanner CLI 가 이미지 번들 JRE 로 동작해 런타임 외부 다운로드가 없습니다.
| Input | Required | Default | Description |
|---|---|---|---|
sonar-host-url | YES | — | SonarQube 서버 URL (SONAR_HOST_URL) |
sonar-token | YES | — | 인증 토큰 (secrets 주입 권장) |
project-key | YES | — | 프로젝트 키 (sonar.projectKey) |
project-name | NO | "" | 프로젝트 표시 이름 (sonar.projectName) |
project-version | NO | "" | 프로젝트 버전 (sonar.projectVersion) |
sources | NO | "." | 분석 대상 소스 경로 (sonar.sources) |
tests | NO | "" | 테스트 소스 경로 (sonar.tests, 쉼표 구분) |
inclusions | NO | "" | 분석 포함 패턴 (sonar.inclusions, glob) |
exclusions | NO | "" | 분석 제외 패턴 (sonar.exclusions, glob) |
test-inclusions | NO | "" | 테스트 포함 패턴 (sonar.test.inclusions) |
test-exclusions | NO | "" | 테스트 제외 패턴 (sonar.test.exclusions) |
coverage-exclusions | NO | "" | 커버리지 산정 제외 패턴 (sonar.coverage.exclusions) |
language | NO | "" | 주 언어. coverage-report-paths 의 property 키 매핑에 사용 (python/javascript/go/java 등) |
coverage-report-paths | NO | "" | 커버리지 리포트 경로. language 에 맞는 SonarQube property 로 자동 매핑 |
quality-gate-wait | NO | "false" | Quality Gate 결과를 기다렸다가 실패 시 step 실패 (sonar.qualitygate.wait). CR 머지 차단용 |
quality-gate-timeout | NO | "" | Quality Gate 대기 타임아웃(초) (sonar.qualitygate.timeout) |
verbose | NO | "false" | 상세 로그 출력 (sonar.verbose) |
working-directory | NO | "/workspace/source" | 스캔 실행 디렉토리 (sonar.projectBaseDir) |
skip-jre-provisioning | NO | "true" | 이미지 번들 JRE 사용 (에어갭 안전, 런타임 다운로드 차단) |
extra-args | NO | "" | 추가 sonar-scanner -D 옵션 passthrough |
예시
기본 스캔
jobs:
quality:
steps:
- name: checkout
uses: "collabops/checkout@v2"
with:
repo-url: "https://<collabops-host>/<workspace>/<repository>.git"
# 외부 SonarQube 서버로 분석 결과를 업로드. 서버 URL/토큰은 워크스페이스 설정에서 주입.
- name: sonar-scan
uses: "collabops/sonar-scan@v1"
with:
# SonarQube 서버 URL — 워크스페이스 variables 에 SONAR_HOST_URL 등록 후 참조.
sonar-host-url: ${{ vars.SONAR_HOST_URL }}
# 분석 토큰 — secrets 에 저장 (평문 입력 금지).
sonar-token: ${{ secrets.SONAR_TOKEN }}
# SonarQube 서버에 생성한 프로젝트 키.
project-key: "<workspace>-<repository>"Quality Gate 로 Change Request 차단
# CR 머지 게이트로 쓰려면 change_request 트리거 + qualitygate.wait 조합.
jobs:
quality:
steps:
- name: checkout
uses: "collabops/checkout@v2"
with:
repo-url: "https://<collabops-host>/<workspace>/<repository>.git"
- name: sonar-scan
uses: "collabops/sonar-scan@v1"
with:
sonar-host-url: ${{ vars.SONAR_HOST_URL }}
sonar-token: ${{ secrets.SONAR_TOKEN }}
project-key: "<workspace>-<repository>"
# 서버 Quality Gate 결과를 기다렸다가 실패 시 step 을 실패시켜 머지를 차단.
# (서버 측 프로젝트에 Quality Gate 가 설정돼 있어야 의미가 있다.)
quality-gate-wait: trueextra-args 로 서버별 튜닝
jobs:
quality:
steps:
- name: checkout
uses: "collabops/checkout@v2"
with:
repo-url: "https://<collabops-host>/<workspace>/<repository>.git"
- name: sonar-scan
uses: "collabops/sonar-scan@v1"
with:
sonar-host-url: ${{ vars.SONAR_HOST_URL }}
sonar-token: ${{ secrets.SONAR_TOKEN }}
project-key: "<workspace>-<repository>"
# 분석 대상 소스 경로 (working-directory 기준 상대경로).
sources: "src"
# 추가 -D 옵션 passthrough — 공백으로 여러 개 전달.
extra-args: "-Dsonar.exclusions=**/*.test.ts -Dsonar.sourceEncoding=UTF-8"포인트 — sonar-host-url·sonar-token·project-key 3개가 필수. 토큰은 반드시 secrets, 서버 URL 은 vars 로 주입(평문 금지). 에어갭 온프렘에서도 skip-jre-provisioning 기본값 true 로 런타임 다운로드 없이 동작하지만, 파이프라인 pod 에서 도달 가능한 SonarQube 서버는 필요합니다. CR 머지 차단은 quality-gate-wait: true + 서버 측 Quality Gate 설정 조합으로 구성합니다.
collabops/sbom@v1
On-Premise: ✅ airgapped 호환
Syft 로 SBOM(Software Bill of Materials, 소프트웨어 구성 명세)을 생성합니다. distroless syft 이미지를 exec 형식으로 직접 실행하므로 런타임 다운로드가 없습니다.
Syft 는 다양한 생태계의 패키지를 수집합니다 — npm, Python(pip / poetry / pipenv), Go 모듈, Java(jar / pom), Ruby(gem), Rust(Cargo), PHP(Composer), .NET, 그리고 컨테이너 이미지 스캔 시 OS 패키지(dpkg / rpm / apk).
디렉터리 스캔은 lockfile 이 필요합니다. dir: 스캔에서 syft 는 lockfile 과 설치된 패키지를 읽습니다 — package-lock.json·poetry.lock·go.sum 등을 커밋하세요. lockfile 없이 매니페스트(예: package.json)만 있으면 컴포넌트가 거의/전혀 안 잡힐 수 있습니다.
| 입력 | 필수 | 기본값 | 설명 |
|---|---|---|---|
format | NO | "cyclonedx-json" | 출력 포맷 (cyclonedx-json, spdx-json, cyclonedx-xml, spdx-tag-value, syft-json) |
scan-target | NO | "dir:/workspace/source" | 스캔 대상 (소스 트리는 dir:<경로>, 이미지는 registry:<image>) |
출력 포맷
format 값 | 표준 | 용도 |
|---|---|---|
cyclonedx-json (기본) | CycloneDX (OWASP), JSON | 취약점 / 공급망 도구 |
spdx-json | SPDX (Linux Foundation), JSON | 라이선스 / 컴플라이언스 |
cyclonedx-xml | CycloneDX, XML | XML 기반 파이프라인 |
spdx-tag-value | SPDX, tag-value 텍스트 | 사람이 읽는 SPDX |
syft-json | Syft 자체, JSON | Syft 생태계(가장 풍부한 메타데이터) |
스텝에서 format: 으로 포맷을 고릅니다. 어떤 포맷이든 SBOM 은 항상 /workspace/source/sbom.json 에 기록됩니다.
- name: sbom
uses: "collabops/sbom@v1"
with:
# 위 표의 값 중 하나 선택 (기본: cyclonedx-json)
format: spdx-json예제
기본 — 워크스페이스의 CycloneDX SBOM
jobs:
sbom:
steps:
- name: checkout
uses: "collabops/checkout@v2"
with:
repo-url: "https://<collabops-host>/<workspace>/<repository>.git"
# 기본: 소스 트리의 CycloneDX JSON -> /workspace/source/sbom.json
- name: sbom
uses: "collabops/sbom@v1"SPDX 포맷 + SBOM 보관
# SBOM 액션은 파일 생성만 — 보관하려면 upload-artifact 로 체인한다.
jobs:
sbom:
steps:
- name: checkout
uses: "collabops/checkout@v2"
with:
repo-url: "https://<collabops-host>/<workspace>/<repository>.git"
- name: sbom
uses: "collabops/sbom@v1"
with:
# cyclonedx-json | spdx-json | cyclonedx-xml | spdx-tag-value | syft-json
format: spdx-json
# 소스 트리는 dir:<경로>, 빌드된 이미지는 registry:<image>
scan-target: dir:/workspace/source
# SBOM 은 /workspace/source/sbom.json 을 생성 — 아티팩트로 보관한다.
- name: upload-sbom
uses: "collabops/upload-artifact@v2"
with:
name: sbom
path: sbom.json컨테이너 이미지 스캔
# 소스 트리 대신 컨테이너 이미지의 설치된 패키지를 스캔.
# checkout 불필요 — syft 가 이미지를 직접 pull 해 분석한다.
jobs:
sbom:
steps:
- name: sbom
uses: "collabops/sbom@v1"
with:
scan-target: "registry:my-registry.example.com/app:1.2.3"
- name: upload-sbom
uses: "collabops/upload-artifact@v2"
with:
name: sbom
path: sbom.jsonSBOM 은 표준 문서라 취약점 스캐너(예: Grype), 라이선스/컴플라이언스 도구, 의존성 대시보드에 그대로 넘길 수 있습니다. 이 액션은 생성만 하므로 upload-artifact@v2 로 보관(또는 자체 저장소로 push)하세요.
온프렘(폐쇄망): anchore/syft:v1.46.0 이미지를 사내 registry(Harbor / Nexus)에 미리 미러하세요 — 스텝은 런타임에 이미지를 다운로드하지 않습니다. scan-target: registry:<image> 를 쓸 땐 대상 이미지와 그 registry 도 파이프라인에서 접근 가능해야 합니다.
포인트 — SBOM 액션은 /workspace/source/sbom.json 을 생성만 합니다. 보관하려면 upload-artifact@v2 로 체인하세요. format 은 표준(CycloneDX / SPDX / syft)을 선택하고, scan-target 은 소스 트리면 dir:<경로>, 빌드된 이미지면 registry:<image> 를 받습니다. pin 된 anchore/syft 이미지는 distroless 라 exec 로 실행되며(셸 없음·런타임 다운로드 없음) 에어갭 호환입니다.