GitHub Actions
TRUSCA 컴포지트 액션은 TRUSCA 스캔을 트리거하고 종료를 기다린 다음 빌드 게이트를 평가하고 (pull request에서는) SCA 보고서를 PR로 다시 게시합 니다. 게이트가 실패하면 non-zero로 종료해 PR 체크가 빨갛게 변하고 브랜치 보호 룰이 머지를 차단합니다.
GitHub Actions를 사용하는 GitHub 저장소를 운영하는 엔지니어. 포털용 API Key가 필요합니다 — API keys 참고.
모노레포의 actions/scan/action.yml 컴포지트 액션을 uses: trustedoss/trusca/actions/scan@v0.10.0로 직접 참조하세요. 독립된 Marketplace 게시는 로드맵에 있습니다.
빠른 시작
# .github/workflows/sca.yml
name: TRUSCA SCA
on:
pull_request:
push:
branches: [main]
jobs:
sca:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write # PR 코멘트에 필요
steps:
- uses: actions/checkout@v4
- name: TRUSCA SCA scan
uses: trustedoss/trusca/actions/scan@v0.10.0
with:
api-url: https://trustedoss.example.com
api-key: ${{ secrets.TRUSTEDOSS_API_KEY }}
project-id: ${{ vars.TRUSTEDOSS_PROJECT_ID }}
이게 최소 구성입니다. action은 다음을 수행합니다.
kind=source로POST /v1/projects/{project-id}/scans를 호출해 cdxgen + scancode + Trivy를 큐에 넣습니다.- 30초마다
GET /v1/scans/{scan-id}를 폴링해 최종 상태(succeeded/failed/cancelled)에 도달할 때까지 대기, 30분 타임아웃. GET /v1/projects/{project-id}/gate-result를 호출해 verdict를 워크플로의 job summary에 기록.pull_request이벤트에서는POST /v1/scans/{scan-id}/post-pr-comment를 호출해 SCA Markdown 보고서를 PR 코멘트로 게시.- 게이트 verdict가
fail이면 1로 종료.
셋업
1. API Key 생성
포털에서 /integrations → API keys → New API key. 스코프는 project 를 선택하고 CI 가 스캔할 프로젝트에 바인딩(또는 한 팀의 모든 프로젝트를 커버해야 한다면 team). v0.10.0 에서 API Key 는 발급 사용자의 역할을 상속하며 키별 허용 동작 목록은 존재하지 않습니다. 스코프 모델은 API keys 참고.
2. GitHub에 Key 저장
저장소에서 Settings → Secrets and variables → Actions → New repository secret.
- Name —
TRUSTEDOSS_API_KEY - Value — 전체 Key(
tos_<prefix>_<secret>)
3. 프로젝트 ID를 변수로 저장
같은 화면에서 Variables로 전환 후 추가.
- Name —
TRUSTEDOSS_PROJECT_ID - Value — Project Settings → CI/CD의 UUID.
(시크릿이 아니라) 변수에 두면 워크플로 로그에서 프로젝트 ID가 그대로 보입니다 — 민감 정보가 아니므로 무방합니다.
4. 워크플로 추가
위 .github/workflows/sca.yml을 저장소에 두세요. 다음 PR부터 SCA 체크가 PR 상태로 나타납니다.
입력
| 이름 | 필수 | 기본값 | 설명 |
|---|---|---|---|
api-url | yes | — | 포털 base URL, 예: https://trustedoss.example.com. 끝의 슬래시는 무방. |
api-key | yes | — | API Key. 항상 ${{ secrets.* }}로 공급. |
project-id | yes | — | 프로젝트 UUID. |
scan-kind | no | source | source(cdxgen + scancode + Trivy) 또는 container(Trivy 이미지 스캔). |
fail-on-gate | no | true | true이면 게이트 verdict가 fail일 때 잡이 1로 종료. |
post-pr-comment | no | true | true이고 pull_request 이벤트로 트리거되면 SCA 보고 서를 PR 코멘트로 게시. |
poll-timeout-seconds | no | 1800 | 스캔이 최종 상태에 도달할 때까지 기다리는 최대 초. |
poll-interval-seconds | no | 30 | 스캔 상태 폴링 간격(초). |
출력
| 이름 | 설명 |
|---|---|
scan-id | 큐에 넣고 평가한 스캔의 UUID. |
gate | pass 또는 fail. |
reason | gate == 'fail'일 때 사람이 읽는 사유, 그 외에는 빈 문자열. |
critical-cve-count | 평가된 스캔의 미해결 critical 발견 수. |
forbidden-license-count | 금지 분류 라이선스를 가진 고유 컴포넌트 수. |
epss-gate-count | EPSS score가 구성된 EPSS 임계 이상인 미해결 결과 수. EPSS 게이트가 비활성(기본)이면 0. EPSS로 빌드 게이팅 참고. |
후속 스텝에서 사용:
- name: TRUSCA SCA scan
id: sca
uses: trustedoss/trusca/actions/scan@v0.10.0
with:
api-url: https://trustedoss.example.com
api-key: ${{ secrets.TRUSTEDOSS_API_KEY }}
project-id: ${{ vars.TRUSTEDOSS_PROJECT_ID }}
fail-on-gate: 'false' # 수집만, 실패 안 함
- name: Branch on the gate verdict
if: steps.sca.outputs.gate == 'fail'
run: |
echo "Critical CVEs: ${{ steps.sca.outputs.critical-cve-count }}"
echo "Forbidden licenses: ${{ steps.sca.outputs.forbidden-license-count }}"
exit 1
레시피
Advisory 모드(실패시키지 않고 보고만)
정책을 시드하는 동안 PR을 차단하지 않으려는 경우에 유용합니다.
- uses: trustedoss/trusca/actions/scan@v0.10.0
with:
api-url: https://trustedoss.example.com
api-key: ${{ secrets.TRUSTEDOSS_API_KEY }}
project-id: ${{ vars.TRUSTEDOSS_PROJECT_ID }}
fail-on-gate: 'false'
PR 코멘트는 그대로 게시되며 체크는 green으로 유지됩니다.
컨테이너 스캔
- uses: trustedoss/trusca/actions/scan@v0.10.0
with:
api-url: https://trustedoss.example.com
api-key: ${{ secrets.TRUSTEDOSS_API_KEY }}
project-id: ${{ vars.TRUSTEDOSS_PROJECT_ID }}
scan-kind: container
컨테이너 스캔은 이미지의 OS 패키지에 Trivy를 실행합니다. 현재 이 액션에는 이미지 참조 입력값이 없으므로, 포털이 해당 프로젝트의 기본 이미지 해석을 적용합니다. 특정 이미지 참조(name:tag)를 스캔하려면 UI에서 트리거하거나(스캔 다이얼로그의 Container), metadata.image_ref 로 API를 직접 호출하세요(스캔 → API에서 참고). 액션의 image-ref 입력값은 로드맵 항목입니다.