콘텐츠로 이동

Main apply

실행 정의는 terraform-apply.yml에 있다. PR의 plan 파일을 재사용하지 않고 main 코드로 새 plan을 만든 뒤 같은 러너에서 적용한다. PR의 _tf-root.yml에는 plan job만 있으며 main 적용은 이 문서의 별도 워크플로에서 수행한다.

실행 흐름

flowchart TD
    Trigger["대상 경로의 main push<br/>또는 main 수동 실행"] --> Queue["terraform-apply 대기열"]
    Queue --> Discover["discover<br/>루트 검증과 waves 계산"]
    Discover --> ApplyJob["apply job<br/>OIDC로 apply 역할 사용"]
    ApplyJob --> Next{"남은 루트가 있는가?"}
    Next -->|예| Init["wave 순서로 다음 루트 init"]
    Init --> Plan["plan -out=tfplan<br/>-detailed-exitcode"]
    Plan --> Code{"종료 코드"}
    Code -->|0| Skip["apply 생략, tfplan 정리"]
    Code -->|2| Apply["같은 tfplan을 apply"]
    Code -->|그 외| Failed["실패, 이후 루트 실행 중단"]
    Init -->|실패| Failed
    Apply -->|실패| Failed
    Apply -->|성공| Clean["tfplan 정리"]
    Clean --> Next
    Skip --> Next
    Next -->|아니오| Done["완료"]
    Failed --> Cleanup["always() 산출물 정리"]
    Done --> Cleanup

discover가 실패하면 apply job을 실행하지 않는다. 취소된 실행도 마지막 정리 스텝의 대상이다.

적용과 재실행

terraform-apply.yml은 main push와 수동 실행을 지원한다. tf-roots.jsdepends_on 그래프의 깊이를 계산하고, apply job이 결과 배열을 반복하며 모든 wave를 순서대로 실행한다. 같은 wave의 루트는 한 job 안에서 차례로 적용한다.

각 루트는 같은 러너에서 plan -detailed-exitcode -out=tfplan을 실행한다.

종료 코드 처리
0 변경 없음, apply 생략
2 생성한 tfplan을 apply
그 외 실패

워크플로의 queue: max가 최대 100개 실행을 대기시킨다. 한 실행 안에서는 루트별 plan과 apply가 연속으로 실행된다. 대기열은 대기 시작 시각의 FIFO이며 커밋 순서를 보장하지는 않는다(GitHub concurrency 안내). 문서처럼 paths-ignore에 해당하는 파일만 머지하면 자동 apply는 실행하지 않는다. 그 외 파일이 함께 바뀌거나 수동 실행하면 모든 루트를 plan하므로, PR에서 plan을 생략한 루트라도 기존 인프라 드리프트가 있다면 apply 대상에 포함될 수 있다. 어느 루트에서든 init, plan 또는 apply가 실패하면 뒤의 루트와 wave는 실행하지 않는다. plan 파일은 실패나 취소 시에도 정리한다.

수동 재실행은 Actions → terraform apply → Run workflow에서 main을 선택한다. apply 역할의 OIDC trust가 main subject만 허용한다.

wave 계산과 새 루트 등록은 저장소 구조를 참고한다. PR에서는 apply 순서 코멘트로 의존성 변경을 확인한다. PR이 변경 영향이 없는 루트의 plan을 생략하는 기준은 plan 대상 선별에 있다.