콘텐츠로 이동

CI/CD

애플리케이션 파이프라인을 만들고 돌리는 영역입니다. API 는 /api/v1/cicd/** 이고 세 역할 모두 호출할 수 있습니다.

파이프라인이 실제로 돌리는 단계

Nullus 가 저장소에 써 주는 CI 정의는 아래 순서로 작업을 배치합니다. 조건이 맞지 않는 단계는 빠집니다.

graph LR
  S[SecretScan] --> D[DependencyScan] --> B[Build] --> A[SAST] --> I[ImageScan] --> P[Deploy]
단계 쓰는 도구 켜지는 조건
SecretScan gitleaks 항상. 실행 시 NULLUS_SECRET_DETECTION=off 로만 끕니다
DependencyScan Trivy (파일시스템) 스택이 SCA 엔드포인트를 제공할 때
Build docker build / docker push 항상
SAST sonar-scanner (-Dsonar.qualitygate.wait=true) 스택이 SonarQube 를 제공할 때. 기본 브랜치에서만
ImageScan Trivy (이미지) 스택이 Trivy 를 제공할 때
Deploy 매니페스트 태그를 바꿔 [skip ci] 로 커밋·푸시 항상

SAST 는 Quality Gate 실패(스택 정책: 차단·경고)와 분석 실패(분석기 장애 정책)를 가릅니다. sonar-scanner 는 둘 다 종료 코드 3 으로 끝나므로, 분석을 SonarQube 에 올린 실행만 게이트 실패로 봅니다 — 분석하지 못한 실행은 경고 정책이어도 통과시키지 않습니다.

앱 종류(web/backend/batch)로 갈리는 작업은 없습니다. web 은 React 소스와 Dockerfile 이 더 들어가는 차이뿐입니다.

실제 배포는 Argo CD 가 합니다

생성된 CI 안에 argocd CLI 나 sync 작업은 없습니다. Deploy 단계는 배포 매니페스트의 이미지 태그를 바꿔 커밋하는 것까지이고, 그 커밋을 Argo CD 가 따라가 반영합니다.

정의 파일은 CI 플랫폼이 결정합니다

소스 저장소가 아니라 CI 플랫폼 기준입니다.

CI 플랫폼 써 주는 파일
GitLab CI .gitlab-ci.yml
GitHub Actions .github/workflows/nullus-ci.yml
Jenkins Jenkinsfile

저장소 기본값은 GitLab → GitLab CI, GitHub → GitHub Actions, Gitea → Jenkins 입니다.

함께 커밋되는 파일: CI 정의, Dockerfile, README.md, deploy/deployment.yaml, deploy/service.yaml, .pre-commit-config.yaml, .gitleaks.toml. 게이트웨이 정보가 있으면 deploy/httproute.yaml 도 들어갑니다. 라우트는 스택 네임스페이스에 실제로 있는 게이트웨이에 붙습니다 — 스택을 화면으로 설치했는지 런북으로 설치했는지에 따라 게이트웨이 이름이 달라서, 파이프라인을 만들 때 조회해 고릅니다.

deploy/ingress.yaml 은 만들지 않습니다

앱 배포 화면의 "Deploy YAML 다시 읽기" 버튼이 deployment.yaml·service.yaml·ingress.yaml 셋을 가져오려 하는데, 세 번째 파일은 생성되지 않으므로 항상 404 가 납니다.

기본으로 들어 있는 템플릿 6개

pipeline_templates 테이블에 마이그레이션으로 들어갑니다.

ID 이름 앱 종류 기록된 stages
web-backend-v1 User Custom Pipeline backend Build, Deploy
batch-job-v1 Batch Job Pipeline batch Build, Deploy
nullus-sample-backend-v1 Nullus Sample App — Backend backend GitClone, DockerBuild, ImageLoad, Deploy
nullus-sample-frontend-v1 Nullus Sample App — Frontend web 〃
egovframe-boot-sample-v1 eGovFrame Boot Sample (Spring Boot) backend Build, Deploy
egovframe-web-sample-v1 eGovFrame Web Sample (JSP) backend 〃

전자정부 표준프레임워크 두 개는 파이프라인을 만들 때 원본 저장소를 가져옵니다 — CI/CD 템플릿에 적어 두었습니다.

템플릿의 stages 는 실제 단계보다 적게 적혀 있습니다

시드가 만들어질 때 SecretScan 을 끈 상태로 계산돼서, 기록된 stages 가 실제로 도는 단계보다 최소 하나 적습니다. 파이프라인별 실제 단계는 생성 시점에 pipelines.stages 에 따로 기록됩니다.

템플릿은 도구를 묶지 않습니다 — 도구 선택은 스택에서 옵니다.