repository는 Github 에서 호스팅되고 있습니다. 그리고 회사 코드이기 때문에 public repository가 아닌 private repository 입니다.
2022.04.07 10:00 업데이트
일단 제가 구상하고 있는 시나리오는 다음과 같습니다.
기능을 개발한 feature/** branch가 main branch에 병합되면, CI 파이프라인이 트리거되어 Container Image 를 빌드하여 Container Registry에 등록합니다.
그 후, 개발자가 로컬 개발 환경이 아닌 통합 개발 환경에서 테스트하기로 결정하여 staging/** branch 로 관련 내용을 수정하여 main branch에 병합하면, Staging CD 파이프라인이 트리거되어 개발자와 테스터만 접근 가능한 Kubernetes 에 배포합니다.
테스터가 통합 개발 환경에서 동작 수행에 문제가 없음을 확인된 후, release/** branch 또는 v1.*.* tag 로 Release CD 파이프라인이 동작하여 고객이 접근 가능한 Kubernetes 에 배포합니다.
그런데 위 시나리오에서 문제가 staging/** branch 가 main branch 통합되면 CI 파이프라인도 같이 트리거가 되어 수행됩니다.
제안해주신 workflow_dispatch와 repository_dispatch 문서를 읽어보니, webhook을 사용하여 메뉴얼로 사용자가 CD 파이프라인을 돌리는 방식으로 이해됩니다.
그렇다면 CD 파이프라인은 자동 트리거 보다는 수동 트리거가 더 적합한 것 같다. 로 이해하면 될까요?
@SangHyeon.Kim 님께서 말씀해주신 대로, AKS (Azure Kubernetes Service)에 Production 배포는 수동 트리거, 즉 Azure Pipeline 에서 직접 시작하는 방법을 사용하는 방안이 좋을 것 같습니다.
다만, Staging의 경우 자동 트리거가 더 적합하지 않을까 생각하는데 어떻게 생각하실까요?
그리고 제안해주신 해결책은 Azure Pipeline이 아닌 Github Action으로 보입니다.
그렇다면 CI 파이프라인은 Azure Pipeline으로 관리하고, CD 파이프라인은 Github Action으로 관리하는 방안을 말씀해주시는 걸까요?
P.S
Azure Pipeline은 가격 정책이 파이프라인을 실행할 에이전트 수로 요금을 청구하는 반면, Github Action은 파이프라인 운영 시간으로 요금을 청구하는 걸로 알고 있습니다. 그래서 빌드 시간에 제약이 없는 Azure Pipeline으로 최대한 운영하고자 합니다.
말씀해주신 대로 Github 에서 public repository는 CI/CD 요금이 무료가 맞습니다.
그러나 개인 프로젝트가 아닌 회사 프로젝트다 보니, public repository 로 운영할 수가 없습니다.
질문에 관련 내용이 없어 오해를 드린 것 같아 죄송합니다. 다른 분들도 오해 없도록 질문 업데이트했습니다.
공식 문서에 classic release pipelines 라고 표현되어 있고 YAML 파일로 관리하는 방식이 아닌 것 같아 보였습니다. 저는 YAML 파일로 CI/CD 파이프라인을 관리하고 싶어, CD 파이프라인을 구성할 때 고려하지 않았습니다.
질문에 시나리오에 대한 설명이 없었군요. 질문에 추가했습니다.
일단 제가 구상하고 있는 시나리오는 다음과 같습니다.
기능을 개발한 feature/** branch가 main branch에 병합되면, CI 파이프라인이 트리거되어 Container Image 를 빌드하여 Container Registry에 등록합니다.
그 후, 개발자가 로컬 개발 환경이 아닌 통합 개발 환경에서 테스트하기로 결정하여 staging/** branch 로 관련 내용을 수정하여 main branch에 병합하면, Staging CD 파이프라인이 트리거되어 개발자와 테스터만 접근 가능한 Kubernetes 에 배포합니다.
테스터가 통합 개발 환경에서 동작 수행에 문제가 없음을 확인된 후, release/** branch 또는 v1.*.* tag 로 Release CD 파이프라인이 동작하여 고객이 접근 가능한 Kubernetes 에 배포합니다.
그런데 위 시나리오에서 문제가 staging/** branch 가 main branch 통합되면 CI 파이프라인도 같이 트리거가 되어 수행됩니다.
CI/CD 파이프라인 구성과 관련하여 나름 좋은 해결책을 찾았습니다.
핵심은 Trigger 조건을 어떻게 설정하느냐가 아닌 브랜치 전략을 어떻게 가져가느냐였습니다.
아래와 그림과 같이 Gitflow를 CI/CD 관점에서 보니, release branch 와 main branch에 commit이 push될 때마다 CD 파이프라인이 동작하도록 했습니다.
GitHub의 pull request 기능을 통해 CD 파이프라인이 trigger 되기 전에 리뷰를 할 수 있어, release branch가 main branch에 병합되기 전 테스터가 pull request 기능으로 production으로 배포해도 되는지를 검토하고 허가할 수 있는 권한을 줄 수 있게 되었습니다.
요약하면 release branch에 새로운 commit 이 생기면 staging으로 배포하는 CD 파이프라인을 trigger 하고, main branch에 새로운 commit이 생기면 production으로 배포하는 CD 파이프라인을 trigger합니다.
CI 파이프라인은 feature branch 와 develop branch에 pull request가 생기거나 업데이트될 때 trigger 되도록 했습니다. 이제 main branch에서 CI 파이프라인이 trigger 되지 않아 질문과 같은 문제가 발생하지 않게 되었습니다.