본문으로 건너뛰기
페이지 목차
이 페이지에서 검색

AI 드리븐

이 페이지에 묻기

AI 드리븐 · 현재 차시와 목차 본문에서만 찾아 답합니다. 답을 지어내지 않고 해당하는 대목을 그대로 보여 주며, 여기에 없으면 없다고 알려 드립니다.

생성형 AI가 아니라 이 페이지 본문을 찾아 그대로 보여 주는 방식입니다. 외부로 나가는 요청이 없습니다.

AI · DEVELOPMENT

AI 드리븐

생성 수정

요구사항과 역할 정의부터 구현·검증·배포·운영까지, AI와 함께 개발하며 사람이 판단할 기준을 정리합니다.

26개 문서 · 3일차 · 20 / 26

19차시 · 자동화 파이프라인 ① CI와 통과 관문

지도 위치 : 3일차 · 신뢰와 운영 · 강제 사다리의 꼭대기 | 이전: 18차시 버전 관리와 강제 장치 | 다음: 20차시 자동화 파이프라인 ② 키워드 : 클라우드 자동 검사(CI)의 개념, 통과 관문 설정

이 차시를 다 읽으면

  1. CI 를 유와 종차로 정의하고, 18차시의 커밋 검사와 무엇이 다른지 표로 가를 수 있다.
  2. CI가 매번 깨끗한 환경 에서 도는 것이 왜 중요한지 ④ 로컬 ↔ 원격 축으로 설명할 수 있다.
  3. 통과 관문에 넣을 검사를 빠른 순서 로 나열하고, 앞쪽은 형식 · 뒤쪽은 뜻을 검사한다는 것을 말할 수 있다.
  4. 워크플로 파일만으로는 관문이 되지 않는 이유와, 브랜치 보호 에서 무엇을 켜야 강제가 되는지 말할 수 있다.
  5. CI 실패를 에이전트에게 맡길 때 꼭 넣을 문장과, 관문이 낮아지는 신호 를 댈 수 있다.

0. 이 차시의 판별 축

#축왼쪽 (0)오른쪽 (1)이 축으로 갈리는 것큰 축 (README 5장)
1부탁인가 강제인가워크플로만 있음 (빨간 X가 떠도 병합 가능)필수 검사로 지정 (빨간 X면 병합 불가)검사 결과가 보고 인가 관문 인가⭐ 부탁 ↔ 강제 (②의 파생)
2내 컴퓨터인가, 깨끗한 원격인가로컬 ("제 컴퓨터에선 되는데요")CI의 새 가상 환경내 컴퓨터에만 있는 것에 기대는 코드가 드러나는가④ 로컬 ↔ 원격
3말인가 기록인가에이전트의 "테스트 통과했습니다"CI 실행 기록 (누구나 열어 볼 수 있음)실제로 돌렸는지, 전부 돌렸는지증거 ↔ 주장 (⑧의 파생)
4형식인가 뜻인가관문 앞쪽 (린트 · 타입)관문 뒤쪽 (통합 테스트)검사의 순서와 실패의 의미⑧ 구문론 ↔ 의미론

이 차시가 답하는 질문은 사람도 AI도 우회할 수 없는 검사는 어떻게 만드는가 입니다. 앞에서 배운 커밋 검사 (18차시)는 --no-verify로 건너뛸 수 있었습니다. 이 차시의 CI 관문은 README 6장 사다리의 가장 높은 칸 입니다.

약함 ◀──────────────────────────────────────────────▶ 강함
 프롬프트로 부탁  →  지침 파일(기억)  →  권한 제한  →  훅 · 커밋 검사  →  ⭐ 자동 검사 관문 (이 차시)

1. CI — 무엇에 속하는가

1.1 정의

CI (지속적 통합, Continuous Integration) — [자동 검사 방식]인데, [ 공유 저장소에 변경이 올라올 때마다 깨끗한 원격 환경에서 같은 검사를 자동으로 돌린다 ]는 점에서 내 컴퓨터에서 커밋 순간 도는 커밋 검사와 구별된다.

용어정의 (유 + 종차)
워크플로 (workflow)[설정 파일]인데, [ 언제(PR이 열릴 때 등) 무엇을(어떤 검사를) 돌릴지 적어 둔다 ]는 점에서 검사 자체와 구별된다. GitHub에서는 .github/workflows/ 아래의 YAML 파일
GitHub Actions[CI 서비스]인데, [ GitHub에 붙어 있어 저장소의 워크플로를 GitHub의 서버에서 실행한다 ]는 점에서 별도로 가입하는 다른 CI 서비스와 구별된다
잡 (job)[워크플로의 단위]인데, [ 한 대의 새 가상 환경에서 순서대로 실행되는 단계 묶음 ]이라는 점에서 단계 하나와 구별된다

1.2 경계 — 커밋 검사 ↔ CI

커밋 검사 (18차시)CI (이 차시)
어디서내 컴퓨터클라우드의 새 가상 환경
언제커밋하는 순간PR이 열리거나 갱신될 때, main에 들어갈 때
속도몇 초 (빨라야 함)몇 분 (느린 검사도 가능)
우회--no-verify로 가능브랜치 보호(4절)를 걸면 불가
기록내 화면에만PR에 남아 누구나 열어 봄

⭐ 둘은 경쟁 관계가 아니라 겹 입니다. 커밋 검사는 빨리 알려 주는 첫 번째 겹이고, CI는 같은 검사를 다시 돌리며 느린 검사까지 더하는 마지막 겹입니다.

1.3 반례 — 이건 관문이 아닙니다

대상왜 아닌가
워크플로 파일만 있고 필수 검사로 지정 안 한 것빨간 X가 떠도 병합 버튼이 눌림. 보고 일 뿐 (4절)
에이전트가 로컬에서 npm test를 돌리고 "통과"라고 보고로컬 환경에 기댐 + 주장. 축 2와 3의 왼쪽
continue-on-error가 붙은 검사 단계실패해도 성공으로 표시됨. 형식만 갖춘 관문 (5.2절)
저장소 주인에게는 적용 안 되는 보호 규칙급할 때 우회됨 (4절)

2. ⭐ CI의 흐름과 깨끗한 환경

개발자 / 에이전트가 브랜치에 푸시 → PR 생성
                  │
                  ▼
     클라우드에 새 가상 환경 생성 (매번 깨끗한 상태)
                  │
     코드 내려받기 → 의존성 설치 → 검사들 실행
                  │
          ┌───────┴───────┐
        전부 통과          하나라도 실패
          │                 │
     초록 체크 · 병합 가능    빨간 X · 병합 차단 + 실패 로그

🔍 읽는 포인트 : 두 번째 줄 "매번 깨끗한 상태" 와 마지막 갈림길만 보면 됩니다.

깨끗한 환경이 중요한 이유는 0절 축 2입니다. 로컬 환경은 사람마다, 에이전트 세션마다 조금씩 다릅니다.

내 컴퓨터에만 있어서 CI에서 드러나는 것예
저장소에 올리지 않은 파일로컬의 .env 파일에만 있는 설정
따로 깔아 둔 프로그램내 컴퓨터에만 설치된 도구
남아 있는 데이터지난번 테스트가 DB에 남긴 예약
버전 차이내 컴퓨터의 Node 버전과 설정한 버전이 다름

"제 컴퓨터에선 되는데요"는 위 네 가지 중 하나입니다. CI는 그걸 매번 걸러 냅니다.


3. 통과 관문에 넣을 검사

3.1 정의와 순서

통과 관문 (Quality Gate) — [강제 장치]인데, [ 정해 둔 검사를 모두 통과해야만 다음 단계(병합 · 배포)로 넘어가게 한다 ]는 점에서 결과만 보여 주는 검사 보고와 구별된다.

단계검사실패 의미⑧ 축
1정적 분석 · 형식기본 규칙 위반형식
2타입 검사모양 불일치형식
3단위 테스트계산 로직 오류뜻
4통합 테스트 (테스트용 DB를 띄움)API · DB 규칙 위반 (동시 예약, 금액 위조 등)뜻
5빌드배포할 수 없는 상태형식
6보안 스캔 (비밀값, 의존성 취약점)보안 사고 위험—

빠른 검사를 앞에 둡니다. 앞에서 실패하면 뒤를 기다릴 필요가 없습니다. 그리고 빠른 검사는 대체로 형식 검사입니다. 앞에서 배운 대로 (13차시) 형식 검사만으로는 뜻을 보장하지 못하므로, 4단계의 통합 테스트가 관문의 실질적인 몸통입니다. 17차시 5절의 클래스온 규칙 다섯 개가 여기서 매번 돕니다.

3.2 GitHub Actions 예시

# .github/workflows/ci.yml
name: CI
on:
  pull_request:
  push:
    branches: [main]

jobs:
  check:
    runs-on: ubuntu-latest
    services:
      postgres:                       # 통합 테스트용 DB
        image: postgres:16
        env:
          POSTGRES_PASSWORD: test
        ports: ["5432:5432"]
        options: >-
          --health-cmd pg_isready --health-interval 5s --health-retries 10
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
          cache: npm
      - run: npm ci
      - run: npm run lint
      - run: npm run typecheck
      - run: npm test
        env:
          DATABASE_URL: postgres://postgres:test@localhost:5432/postgres
      - run: npm run build
      - run: npm audit --audit-level=high

  secrets-scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 0 }
      - uses: gitleaks/gitleaks-action@v2
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

(버전 번호와 세부 옵션은 작성 시점의 공식 문서를 확인하세요.)

🔍 읽는 포인트 : run: 뒤의 다섯 줄 — lint · typecheck · test · build · audit — 이 3.1절 표의 검사 목록입니다. 그리고 jobs: 아래의 이름 두 개(check, secrets-scan)는 4절에서 필수 검사로 지정할 이름 입니다.

POSTGRES_PASSWORD: test처럼 CI에 들어가는 값은 테스트용 값만 씁니다. 실제 운영 키가 필요해 보이는 단계가 있다면 설계가 잘못된 것입니다. 꼭 비밀값이 필요하면 GitHub Secrets(저장소 설정에 숨겨 두고 워크플로에서 이름으로만 부르는 기능)에 테스트 키 를 넣습니다.


4. ⭐ 관문을 "강제"로 만드는 설정 — 브랜치 보호

브랜치 보호 (branch protection) — [저장소 설정]인데, [ 특정 브랜치에 들어가는 조건(PR 필수 · 검사 통과 · 승인)을 GitHub가 직접 강제한다 ]는 점에서 지침 파일의 "main에 직접 넣지 마"라는 부탁과 구별된다.

⚠️ 워크플로 파일만 있으면 실패해도 병합 버튼이 눌립니다. CI는 결과를 보여 줄 뿐이고, 그 결과를 병합 조건으로 묶는 것 은 저장소 설정입니다. 0절 축 1이 정확히 여기서 갈립니다.

GitHub 저장소 → Settings → Branches(또는 Rules) → main 보호 규칙:

  • 병합 전 PR 필수
  • 병합 전 상태 검사 통과 필수 → check, secrets-scan 지정
  • 관리자에게도 적용 (화면 문구는 "관리자 포함", "우회 허용 안 함" 등 버전마다 다름 — 공식 문서 확인)

마지막 항목이 없으면 저장소 주인(나)은 빨간 X가 떠도 병합할 수 있습니다. 그리고 에이전트가 내 계정 권한으로 일하고 있다면, 에이전트도 그렇게 할 수 있습니다. 급할 때 한 번 우회하기 시작하면 관문은 다시 부탁으로 내려갑니다.

설정 상태사다리 위치
워크플로 없음—
워크플로만 있음보고 (부탁보다 약간 나은 정도)
필수 검사 지정, 관리자 예외 있음강제, 단 주인은 우회 가능
⭐ 필수 검사 지정 + 관리자 포함관문

💡 비유는 마지막에 — 워크플로만 있는 CI는 공항의 엑스레이 화면 입니다. 위험물이 보여도 아무도 막지 않으면 통과합니다. 브랜치 보호는 그 화면에 연결된 게이트 입니다.


5. 관문을 낮추지 않게

5.1 CI 실패를 에이전트에게 맡기기

CI가 실패하면 로그를 에이전트에게 주고 고치게 할 수 있습니다. 로그는 읽지 않아도 됩니다. 대신 지시에 이 문장을 반드시 넣습니다.

CI의 npm test가 실패했다. 로그는 아래와 같다.
원인을 먼저 설명하고, 코드를 고쳐서 통과시켜라.
테스트 파일이나 CI 설정을 바꿔서 통과시키지 마라. 그래야 한다고 판단되면 이유를 보고해라.

🔍 읽는 포인트 : 마지막 줄입니다. 17차시의 "테스트를 고쳐서 통과" 문제가 CI에서는 "관문을 고쳐서 통과" 로 똑같이 일어납니다.

5.2 관문이 낮아지는 신호

CI의 가장 큰 위험은 AI가 통과시키려고 검사를 줄이는 것 입니다. YAML을 읽지 못해도, .github/workflows/ 파일이 바뀐 PR에서 아래 단어가 새로 생겼는지 는 찾을 수 있습니다.

단어하는 일결과
continue-on-error실패해도 계속 진행실패가 초록으로 보임
if: false단계를 아예 건너뜀검사가 사라짐
skip, .skip(테스트를 건너뜀그 규칙의 안전망이 사라짐
--passWithNoTests테스트가 하나도 없어도 통과테스트를 지워도 초록
|| true명령이 실패해도 성공으로 처리실패가 초록으로 보임

⚠️ 이 가운데 하나라도 새로 생겼다면 검사를 무력화했을 수 있습니다. README 9.4의 위험 신호("자동 검사 설정을 바꿨다", "skip, disable")와 같은 이야기입니다.

5.3 불안정한 테스트

불안정한 테스트 (flaky test) — [자동 테스트]인데, [ 같은 코드에서 돌릴 때마다 결과가 달라진다 ]는 점에서 코드가 틀릴 때만 실패하는 믿을 수 있는 테스트와 구별된다.

앞에서 배운 "결정적이다" 조건 (17차시)을 어긴 테스트입니다. 이런 테스트가 있으면 빨간 X가 떠도 "재실행하면 돼"가 일상이 되고, 곧 진짜 실패도 재실행으로 넘기게 됩니다. 관문이 사람의 습관 때문에 낮아지는 경우입니다. 재실행이 아니라 원인을 고치게 합니다.

앞으로 다시 만납니다 — .github/workflows/ 자체가 바뀌는 것을 사람의 승인 없이는 병합할 수 없게 하는 장치가 20차시의 CODEOWNERS 입니다. 관문을 지키는 관문입니다.


6. 클래스온에 적용하면

자리설정
워크플로3.2절의 check (린트 · 타입 · 테스트(통합 포함) · 빌드 · 의존성 감사) + secrets-scan
통합 테스트17차시 5절의 규칙 다섯 개(자리 없음 409, 동시 예약 1건, 금액 서버 계산, 남의 예약 불가, 중복 결제 무시)가 매 PR마다
브랜치 보호main: PR 필수, check · secrets-scan 필수, 관리자 포함
CI 비밀값테스트용 DB 비밀번호, PG 테스트 키만
에이전트 지침CI 실패 시 5.1절 문장을 따르고, 워크플로 변경은 이유를 보고

7. 실습 — 맡기고 검수하기

지시

[1단계 — CI 설정]
클래스온 저장소에 GitHub Actions CI를 만들어줘.
- 검사: 린트, 타입 검사, 단위·통합 테스트(테스트용 Postgres를 띄움), 빌드, 의존성 감사, gitleaks.
- 비밀값이 필요한 단계에는 테스트용 값만. 운영 키는 어떤 경우에도 쓰지 마.
보고 형식: | 잡 이름 | 검사 단계 | 걸린 시간 | 결과 |
PR을 하나 열어 CI를 실제로 돌리고, Actions 실행 화면 주소와 각 단계 결과 원문을 붙여.

[2단계 — 관문 시험]
일부러 실패하는 테스트 하나를 넣은 시험용 PR을 따로 만들어줘. 병합은 절대 하지 마.
그 PR에서 CI가 실패한 로그의 마지막 부분 원문과 PR 주소를 보고해.
시험이 끝나면 시험용 PR은 닫고 브랜치는 지워. 닫기 전에 내 확인을 기다려.

브랜치 보호 설정은 내가 직접 할 테니, 필수 검사로 지정할 잡 이름만 알려줘.

🔍 읽는 포인트 : 2단계의 "병합은 절대 하지 마"와 "닫기 전에 내 확인"이 핵심입니다. 관문이 막는지는 내 눈으로 봐야 하기 때문입니다. 브랜치 보호는 관문 자체를 정하는 설정이라 사람이 직접 겁니다.

받을 증거

  • 1단계 PR의 Actions 실행 주소와 단계별 결과 원문 (전부 초록)
  • 2단계 시험용 PR 주소와 실패 로그 원문 (어느 테스트가 실패했는지 이름이 보여야 함)
  • 필수 검사로 지정할 잡 이름 목록

내가 직접 확인할 것

볼 것이걸로 아는 것 / 왜 내가 보는가
1단계 PR 화면의 초록 체크CI가 실제로 돌았다. 에이전트의 "통과"가 아니라 GitHub의 기록 (축 3)
Settings → 보호 규칙에 잡 이름 두 개 · 관리자 포함 체크관문이 설정으로 걸렸다 (4절). 이건 내가 직접 켠다
⭐ 행동 시험: 2단계 시험용 PR 화면빨간 X와 함께 병합 버튼이 막혀 있어야 정상. 눌린다면 필수 검사 지정이 빠진 것
이후 .github/workflows/가 바뀐 PR5.2절의 단어가 새로 생겼는지 찾기. 아니면 "검사 단계가 추가 · 삭제 · 완화된 것을 목록으로 알려줘"라고 질문
같은 PR에서 "재실행"을 누른 횟수재실행이 습관이 되면 불안정한 테스트가 숨어 있다 (5.3)

💡 PR 화면의 초록 체크와 빨간 X가 당신의 계기판 입니다. CI는 코드를 읽지 못하는 사람 대신 매번 같은 검사를 빠짐없이 수행합니다. 그래서 이 방식에서 CI는 "있으면 좋은 자동화"가 아니라 가장 믿을 수 있는 팀원 이고, README 9.1의 신뢰 근거 ① 강제 장치의 대표입니다.


부록 A. 스스로 확인하기

#질문답이 있는 곳
1CI를 유와 종차로 정의하면? 커밋 검사와 다섯 가지로 비교하면?1.1, 1.2
2워크플로만 있는 CI가 관문이 아닌 이유는?1.3, 4
3CI가 매번 깨끗한 환경에서 도는 것이 왜 중요한가? 무엇이 드러나는가?2
4통과 관문의 검사 여섯 가지를 빠른 순서로 나열하면? 관문의 몸통은?3.1
5CI 예시에서 필수 검사로 지정할 이름은 어디서 찾나?3.2
6브랜치 보호에서 켜야 할 세 가지와, "관리자 포함"이 빠지면 생기는 일은?4
7CI 실패를 에이전트에게 고치게 할 때 꼭 넣을 문장은?5.1
8관문이 낮아지는 신호 단어 다섯 가지는?5.2
9불안정한 테스트가 관문을 낮추는 방식은?5.3

부록 B. 자주 하는 실수

실수바로잡기
워크플로만 만들고 필수 검사로 지정하지 않는다❌ 빨간 X가 떠도 병합됩니다. 브랜치 보호에서 지정 (4)
"관리자 포함"을 빼 둔다⚠️ 나와 내 권한으로 일하는 에이전트가 우회할 수 있습니다 (4)
가끔 실패하는 테스트 때문에 "재실행"이 일상이 된다❌ 원인을 고치세요. 곧 진짜 실패도 재실행으로 넘깁니다 (5.3)
에이전트가 CI를 통과시키려고 검사 단계를 지우거나 continue-on-error를 붙인다⭕ 워크플로 변경 PR에서 신호 단어를 찾고, 20차시 CODEOWNERS로 막기 (5.2)
비밀값이 필요한 단계에 실제 운영 키를 넣는다❌ CI에는 테스트 키만 (3.2)
에이전트의 "로컬에서 테스트 통과했습니다"를 CI 대신 받아들인다❌ 주장이고, 로컬 환경에 기댑니다 (1.3, 2)
관문 시험 없이 "설정했으니 막히겠지"로 끝낸다⭕ 일부러 실패하는 PR로 병합 버튼이 막히는지 직접 본다 (7)

부록 C. NotebookLM 복습 프롬프트

이 19차시 노트만 근거로 5문제를 내줘. 비전공자 기준으로.
"커밋 검사와 CI의 차이", "워크플로만으로는 관문이 되지 않는 이유", "관문이 낮아지는 신호"는 반드시 포함해줘.
답은 내가 답한 다음에 채점하고, 틀린 이유를 노트의 절 번호를 근거로 설명해줘.