<aside> ✅
실습 완료: GitHub Actions에 코드 품질·보안 검사 6종을 연결하고, summary를 Required Status Check로 설정해 실패한 PR은 Merge 차단 → 문제 수정 → 전체 통과 후 Merge까지 확인했다
</aside>
이번 실습의 핵심은 GitHub Actions를 단순 실행하는 것이 아니라, CI 검출 결과를 실제 Merge 정책과 연결하는 SecOps 흐름을 경험하는 것이었다.
Fork + Clone
↓
GitHub Actions Workflow 구성
↓
PR 생성 → 취약점/오류 검출
↓
Ruleset + Required Check 설정
↓
실패한 PR Merge 차단
↓
Repair Loop
↓
CI 전체 통과 → Merge
Fork는 다른 사용자의 GitHub 저장소를 내 계정으로 복사해 독립적으로 수정·커밋·실습할 수 있게 하는 기능이다.
이번 실습에서는 원본 kintoun-secops/secops-actions-lab을 개인 계정으로 Fork한 뒤 개인 저장소에서 작업했다.
**Pull Request(PR)**는 별도 브랜치의 변경사항을 main에 병합하기 전에 변경 내용, 리뷰, 자동 CI 결과를 확인하는 절차다.
<aside> ⚠️
Fork 실습에서는 PR 생성 전 상단 Repository와 base/compare 브랜치를 확인해야 한다. 원본 저장소가 아니라 개인 Fork의 main을 대상으로 PR을 생성하는 것이 핵심이다.
</aside>
이번 실습에서는 6개의 검사 도구를 별도 재사용 Workflow로 구성하고, 07-ci-summary.yml에서 하나로 묶었다.
| 도구 | 역할 | Workflow |
|---|---|---|
| Ruff | 포맷·린트·Python 보안 규칙 | 01-ruff.yml |
| mypy | 정적 타입 검사 | 02-mypy.yml |
| pytest | 단위 테스트·커버리지 | 03-pytest.yml |
| pip-audit | Python 의존성 CVE 검사 | 04-pip-audit.yml |
| Semgrep | SAST·Taint 분석 | 05-semgrep.yml |
| gitleaks | Git History의 Secret 탐지 | 06-gitleaks.yml |
| summary | 6개 검사 결과 집계·Merge Gate | 07-ci-summary.yml |
PR
↓
07 - CI summary
├─ Ruff
├─ mypy
├─ pytest
├─ pip-audit
├─ Semgrep
└─ gitleaks
↓
summary
01~06은 workflow_call 기반 재사용 Workflow로 두고, 07이 이들을 호출한다. 이렇게 구성하면 마지막 summary가 모든 검사 결과를 한 번에 집계할 수 있다.
Workflow를 조립한 뒤 첫 PR을 생성하자 의도적으로 포함된 오류와 취약점 때문에 여러 Job이 실패했다.