CI/CD 목록¶
/cicd/list admin devops developer
만든 파이프라인을 관리하는 화면입니다. 왼쪽 표, 오른쪽 상세 패널입니다.

표¶
컬럼은 Name · Mode · App Type · Access(외부 링크) · Cluster ·
Stack(없거나 삭제됨) · Status · Last Deployed 입니다.
툴바에 상태 선택, 클러스터 선택, 검색(이름·클러스터 이름)이 있습니다. 위쪽 버튼 둘은 앱 배포와 CI/CD 템플릿으로 갑니다.
상태 필터는 아무것도 못 고릅니다
선택 항목이 success · running · pending · failed · cancelled 인데,
파이프라인의 status 값은 active / inactive 둘뿐입니다. 그래서 어떤
상태를 골라도 표가 비어 버립니다. 필터는 브라우저에서 돌고, 서버는
status·search 를 보지 않습니다.
상세 패널 탭¶
Info¶
서비스 URL 링크 버튼들과 카드 여섯 묶음입니다.
| 카드 | 내용 |
|---|---|
| Pipeline Info | 이름 · 앱 종류 · 실행 모드 배지(CI Only/CD Only/CI/CD) · 템플릿 · 상태 · 생성 · 마지막 배포 · 접근 URL |
| Code Checkout | Git 저장소 · 스택 |
| Build | Dockerfile · 빌드 컨텍스트 · 이미지 레지스트리 |
| Deployment Target | 클러스터 · 네임스페이스, 그리고 Ingress→Service→Deployment/StatefulSet→Pod 자원 사슬(Job·CronJob 포함) |
| Environment Variables | 가려져 있고 누르면 보입니다 |
| Manifest Overrides |
Monitoring¶
성공률, 평균 소요 시간, 7일 성공/실패 추이, 앱 자원 사용량 차트와 로그 패널,
새로 고침 버튼이 있는 Live Resources 목록.
History¶
배포 한 건이 한 줄입니다 — 상태 배지 · 버전 · 이미지 스캔 게이트 배지와 심각도 개수 · SAST 게이트 배지 · 의존성 스캔 게이트 배지와 심각도 개수 · 시크릿 탐지 게이트 배지와 탐지 건수 · 실행자 · 소요 시간 · 시작 시각.
행을 펼치면 배포 ID, 스캔 상세(취약점 목록·필터), SAST 실패 조건과 지표, 의존성 스캔 상세, 시크릿 탐지 상세(규칙 · 파일:줄 · 커밋 · Fingerprint — 비밀값은 없다), Pipeline Stages 목록, Detailed Logs 터미널이 나옵니다. 시크릿이 탐지된 실행은 폐기 · 회전 경고가 먼저 보입니다.
보안 대시보드의 실행 기록 열기 는
/cicd/list?pipeline=<ID>&tab=history&run=<배포 ID> 로 이 탭과 그 실행을 바로 엽니다.
단계 결과를 보고하지 않는 CI 도 있습니다
단계별 데이터가 없으면 목록에 템플릿 정의 · 이 CI 는 단계별 결과를 보고하지
않습니다 라고 적히고, 단계는 unknown 으로 남아 초록색이 되지 않습니다.
버튼¶
| 버튼 | 하는 일 |
|---|---|
| Execute | 파이프라인을 실행합니다 (POST /api/v1/cicd/pipelines/{id}/deploy → 202) |
| Logs | /cicd/pipelines/{id}/logs 로 이동 |
| Refresh definition | 저장소의 CI 정의를 다시 써 줍니다. 스택에 연결된 파이프라인에만 보입니다 |
| Delete | 아래 참고 |
Execute 창의 설정은 전송되지 않습니다
실행 창에 Cluster / Build / Deploy 탭과 Dockerfile 프리셋, 배포 YAML 선택이
있지만 아무것도 서버로 가지 않습니다. 실제로 보내는 것은 파이프라인 ID
하나뿐입니다. 창의 선택은 장식입니다.
Refresh definition 이 덮어쓰는 것¶
창에 그대로 적혀 있습니다 — .gitlab-ci.yml · .github/workflows/nullus-ci.yml ·
Jenkinsfile 중 하나와 SONAR_TOKEN 같은 CI 변수입니다.
앱 코드 · Dockerfile · deploy/ 매니페스트 · Argo CD Application 은 건드리지
않습니다.
GitLab 스택에서는 저장소가 새 커밋을 Argo CD 에 바로 알리는 push webhook 이 없으면 다시 겁니다
(앱 배포).
Delete 의 선택 항목¶
체크박스 세 개가 모두 꺼진 상태로 시작합니다 — 클러스터 리소스 · 저장소 ·
이미지. 저장소를 고르면 owner/repo 경로를 정확히 입력해야 확인 버튼이
열립니다. 지우지 못한 것은 배너로 알려 줍니다.
클러스터 리소스를 고르면 Argo CD Application 과 배포된 워크로드에 더해, 파이프라인을
만들 때 플랫폼이 넣은 Secret 두 개도 지웁니다 — 앱 네임스페이스의 이미지 pull
자격증명(nullus-registry-<앱>)과 Argo CD 네임스페이스의 저장소 자격증명
(nullus-repo-<앱>). 플랫폼 표시(app.kubernetes.io/managed-by=nullus-cicd)가 없는
Secret 은 이름이 같아도 남깁니다. 앱 네임스페이스 자체는 지우지 않습니다.
Gitea · Jenkins 스택은 파이프라인 자격증명을 따로 둡니다 — 스택 네임스페이스의 ExternalSecret
nullus-ci-<앱>, ESO 가 그것으로 만든 Secret, OpenBao 의
kv/nullus/<env>/<org>/cicd/pipelines/<앱>/ 아래 값. 이 자격증명은 CI job 만 쓰므로 체크박스와
상관없이 CI job 과 함께 지웁니다. ExternalSecret 을 먼저 지우고(ESO 가 만든 Secret 은 소유자 참조로
함께 사라집니다) 금고 값을 지웁니다. 플랫폼 표시가 없는 ExternalSecret 은 원격 키가 모두 그 파이프라인의
금고 경로 아래일 때만 지웁니다. 지우지 못해도 나머지 삭제는 이어 가고 배너로 알려 줍니다.
자격증명은 파이프라인 이름으로 찾습니다. 같은 스택에 같은 이름의 다른 파이프라인이 있으면 그것도 이
자격증명을 쓰므로 지우지 않고 그 이유를 알려 줍니다. 이름이 금고 경로의 한 세그먼트로 쓸 수 없는 값
(/ 가 든 이름, . · .. 그 자체)이어도 지우지 않습니다 — 다른 파이프라인의 값을 가리키게 됩니다.
이미 설치된 스택은 금고 값이 남습니다
금고 값을 지우려면 금고 정책에 삭제 권한이 있어야 하는데, 그 권한(파이프라인 자격증명 경로에만)은 스택을 설치할 때 정책으로 들어갑니다. 설치 뒤에는 root token 이 폐기돼 정책을 고칠 수 없으므로, 이 기능 전에 설치한 스택에서는 금고 값이 남고 "삭제 권한이 없습니다" 배너가 뜹니다. ExternalSecret 과 Secret 은 지워집니다.
파이프라인 생성 화면¶
/cicd/create
Pipeline Name 과 템플릿을 고르고 Cluster / Build / Deploy / Pipeline YAML 탭을
채우는 화면이 따로 있습니다.
들어가는 길이 없습니다
앱 안에서 /cicd/create 로 보내는 링크가 이 화면 자신의 템플릿 선택
말고는 없습니다. CI/CD 템플릿의 Use Base Template 은 앱 배포로
갑니다.
게다가 Build 탭의 Dockerfile 프리셋 3개와 Deploy 탭의 YAML 프리셋 3개는 읽기
전용 고정값이고, Pipeline YAML 탭의 내용은 화면에서 만들어 보여 주기만 하고
전송되지 않습니다. 생성 시 실제로 가는 값은 이름·앱 종류·클러스터·템플릿
넷뿐입니다.
템플릿 목록이 비면 web-frontend·web-backend·batch-job 이라는 가짜
템플릿으로 떨어지는데, 그 앱 종류 값은 DB 가 받지 않는 값(web·backend·
batch 만 허용)이라 생성이 거부됩니다.
실제로 파이프라인을 만드는 길은 앱 배포입니다.
파이프라인 로그¶
/cicd/pipelines/:id/logs
왼쪽에 최근 배포 목록(버전·상태·시작 시각, 최신 우선), 오른쪽에 단계별 블록이
있는 터미널 창입니다. 화면 제목은 영문 Pipeline Logs 입니다.
Streaming... 표시는 실제 스트리밍이 아닙니다
2초마다 GET /api/v1/cicd/deployments/{id} 를 다시 요청하다가 상태가
success 또는 failed 가 되면 멈춥니다. WebSocket 으로 로그를 받는 코드가
저장소에 있지만 쓰는 곳도, 서버 쪽 라우트도 없습니다.
호출하는 API¶
GET /api/v1/cicd/pipelines · /templates · /deployments ·
/deployments/{id} · /pipelines/{id}/resources · /image-scans ·
/image-scans/{scanId}/vulnerabilities · /sast-results ·
POST /pipelines/{id}/deploy · /pipelines/{id}/refresh-definition ·
DELETE /pipelines/{id}?cluster_resources=&repository=&images=
여기에 GET /api/v1/admin/clusters(admin 전용)와 GET /api/v1/stacks
(admin·devops)도 함께 부릅니다 — developer 에게는 403 이라 클러스터·스택 선택이
비어 보입니다(권한 표).