TOPIC/DevOps

Jenkins, ArgoCD로 CI/CD Pipeline 구성하기 (1)

H-Y-E-N 2024. 1. 31. 14:46

안녕하세요. HYEN입니다.

드디어 길고 길었던 CI/CD Pipeline 구성이 끝이 났습니다. 🥳🥳

개인적으로, CI/CD Pipeline은 구성할 때마다 어렵다 😟 이거 언제 다 연결하지? 라는 마음이 드는데요.

막상 구성해 놓고 보면 자동으로 척척 빌드되고 배포되는 게 멋있고 뿌듯하더라구요. 

하지만 할 때마다 어려워 할 수는 없으니! 이번 기회에 쭈욱 정리해 보고자 합니다.


Contents

     

    ※ Jenkins와 ArgoCD 등 CI/CD Pipeline 구성에 필요한 모든 리소스는 사전에 배포해 두었습니다.※

     

    1. CI/CD Flow

    1. 개발자가 코드를 수정한 후 'Toy-Project-Web' Repository에 변경 사항을 push합니다.
      (Toy-Project-Web이라는 GitHub Repository에는 Dockerfile과 웹 어플리케이션 소스 코드가 포함되어 있습니다.)

    2. GitHub에 설정된 Webhook이 push 이벤트를 감지하고 Jenkins의 job을 트리거합니다.

    3. Jenkins는 트리거를 받아 구성된 job을 실행하여 새로운 코드 변경 사항을 기반으로 이미지를 build하고 이를 Azure Container Registry에 push 합니다. 

    4. Jenkins의 첫 번째 job의 마지막 stage에서 두 번째 job을 트리거합니다.

    5. Jenkins에서 두 번째 job이 실행되고, 이에 따라 'Manifest' Repository의 deploy.yaml file 내의 image version이 업데이트 됩니다.

    6. ArgoCD는 주기적으로 'Manifest' Repository를 체크하다가 변경 사항을 감지하면 AKS의 현재 상태와 GitHub에 정의된 desired state 간 Sync를 진행합니다.

    7. AKS 내 배포된 Deployment에 대한 새로운 변경 사항을 rollout합니다. 

     

    2. GitHub - Jenkins 연결

    2.1 Personal Access Token 발급 

    GitHub Private Repository와 Jenkins를 연결하기 위해 Personal Access Token를 발급해야 합니다.
    GitHub의 Personal Access Token(PAT)는 API를 통해 GitHub에 인증하여 접근할 수 있는 방법 중 하나입니다. 

     

    • GitHub Log in > Profile 아이콘 클릭 > [Settings] > [Developer settings] > [Tokens (classic)] > [Generate new token]

     

    • token 이름과 권한 범위를 선택합니다.
      • repo, admin:org, admin:repo_hook 권한을 부여합니다.

     

    • 하단의 [Generate token] 버튼을 클릭하여 token을 생성합니다.

    • 발급된 PAT를 복사한 후 보관합니다. 
      • 해당 키는 다시 볼 수 없기 때문에 메모장 등에 따로 보관해 두어야 합니다. 

     

    2.2 Jenkins에 GitHub의 Personal Access Token을 Credentials로 등록

    GitHub의 PAT를 Jenkins Server에 Credentials로 등록 합니다.

     

    • [Dashboard] > [Manage Jenkins] > [System] > [GitHub] > [Add GitHub Server] 

     

    • Credentials 추가를 위해 [+ Add] > [Jenkins]로 이동합니다.
      • Kind : Secret text 선택
      • Secret : 복사해 둔 Personal Access Token 입력
      • ID : 해당 credential 식별에 사용할 ID 입력

     

    • 생성한 Credentials 선택한 후 [Test Connection] 버튼을 클릭하여 연결을 확인합니다.

     

    • 하단의 [Save] 버튼을 클릭하여 변경 사항을 저장합니다.

     

    2.3 GitHub Webhook 설정

    ✅ GitHub Repository에 변경 사항이 발생할 경우 GitHub는 Webhook을 통해 Jenkins에게 Event에 대한 트리거를 보냅니다. 
    ❌ Jenkins Server가 Private IP 주소만 가지고 있을 경우 이 ip 주소를 Payload URL로 사용할 수 없습니다.
    ➡️ 이 경우, Azure Firewall로 트래픽을 라우팅 하여 Azure Firewall의 Public IP 주소로 Webhook의 Payload URL을 지정하도록 구성해야 합니다. 

     

    구성 방법은 그렇게 어렵지 않습니다! 아래를 봐주세요. 

     

    • GitHub Webhook의 Payload URL을 Azure Firewall의 Public IP로 지정하기 위해서 Azure Firewall에 DNAT Rule을 추가합니다.
      • 원본 : GitHub Webhook IP 주소 (참고 링크 : https://api.github.com/meta)
      • 대상 포트 : 8080 # 원하는 port 지정 
      • 대상 : Azure Firewall의 Public IP 주소
      • 변환된 주소 : Jenkins Server의 Private IP 주소
      • 번역된 포트 : 8080 # Jenkins가 LISTEN하고 있는 port 입력 필요

     

    이렇게만 해주면 됩니다! 

    규칙 추가가 끝났다면 본론으로 돌아와 다시 Webhook 설정을 진행해 보도록 하겠습니다.

     

    • Repository > [Settings] > [Webhooks] > [Add webhook]

     

    • Webhook 추가 
      • Payload URL : Azure Firewall의 Public IP 주소 뒤에 /github-webhook/를 추가해 줍니다. 

     

    • [Add Webhook]을 클릭하여 Webhook을 생성합니다.

     

    • Webhook이 정상적으로 연결되면 하기와 같이 ✅ 마크가 Payload URL 앞에 표시됩니다.

     

    3. Azure Container Registry - Jenkins 연결 

    code를 수정한 후 GitHub에 변경 사항을 push 할 때, 이러한 push event를 알려줄 GitHub Webhook에 대한 구성을 완료했습니다.

    그럼 그 다음에 해야할 일은 무엇일까요? 바로, Jenkins에 첫 번째 job을 생성하는 것인데요.

     

    하지만 ❗❗❗ 

    job을 생성하기 전에 해야 할 일이 있습니다.

     

    ACR과 Jenkins를 연결하기 위한 Environment Variables와 Managed Identity에 대한 Credentials을 먼저 생성해 주어야 하는 것이 선행되어야 합니다.

     

    그럼 먼저 Azure Container Registry용 Environment Variables를 생성해 보겠습니다. 

     

    3.1 Azure Container Registry용 Environment Variables 생성

    • [Dashboard] > [Manage Jenkins] > [System] > [Global properties] > [Environment variables] > [Add]
      • Name : 변수 명
      • Value : Azure Container Registry 로그인 서버 이름 입력
      • 하단의 [Save] 버튼을 클릭하여 저장

     

    3.2  Managed Identity에 대한 Credentials 생성

    ✅ 먼저 Azure Credentials Plugins을 설치해 주어야 합니다. 
    ✅ Managed Identity를 사용해서 Jenkins에서 ACR에 접근하기 위함입니다. 

     

    • [Dashboard] > [Manage Jenkins] > [Plugins] > [Available plugins] > [Azure Credentials] 설치

     

     

    Azure Credentials Plugin이 설치되었으니 Credentials을 등록해 보겠습니다. 

     

    • [Dashboard] > [Manage Jenkins] > [Credentials] > [System] > [Global credentials (unrestricted)] > [+ Add Credentials]

     

    • Azure Container Registry에 기여자 역할이 할당된 Managed Identity에 대한 정보를 입력 합니다.
      • Kind : Azure Managed Identity (Azure Credentials Plugins 사전 설치 필요)
      • Subscription ID : Azure Container Registry가 있는 구독 ID 입력
      • ID : 연결하고자 하는 Managed Identity의 이름 입력

     

    • 하단의 [Create] 버튼을 클릭하여 Credentials을 생성합니다. 

     

    Credentials이 생성되었다면 다음엔

    생성한 Credentials에 대한 Verification을 수행해야 합니다.

     

    • 위에서 생성한 Credentials(mi-aks-boc)을 클릭합니다. 

     

    • 좌측의 [Update] 버튼을 클릭합니다. 

     

    • 우측 하단의 [Verify Configuration] 버튼을 클릭하여 유효성을 검사합니다. 

     

    만약, 하기와 같은 문구가 출력되었다면 유효성 검증은 정상적으로 진행된 것입니다.

     

    그러나 에러가 발생하기도 하는데요, 특히 Managed Identity에 대한 내용은 구글링으로도 찾기가 어려워 저도 처음에는 많이 헤맸습니다. 😭

     

    3.3  Managed Identity에 대한 Credentials 생성 시 에러가 발생하는 경우

    결과부터 적어보자면,

    [Verify Configuration] 버튼을 클릭했을 때 하기와 같은 메시지가 출력될 경우에는 Managed Identity와 Virtual Machine을 연결해 주어야 합니다. 

     

    ⚠️The provided credentials are not valid: managed identity authentication is not available.

     

    제가 생각하기에는 Jenkins Server가 구동되는 Spoke VM에 Managed Identity에 대한 권한 또는 연결점이 없어서 이러한 에러가 발생하는 것 같습니다. (아니라면 알려주세요!) 

     

    그래서 가상 머신과 Managed Identity를 연결하는 과정을 추가적으로 진행해 주었습니다. 

     

    • [가상 머신] > [설정] > [ID] > [사용자 할당 항목] > [+ 추가] 

     

    • VM에서 Managed Identity를 사용하여 Azure Login을 진행합니다. 

     

    • [Verify Configuration]을 다시 클릭하여 유효성 검사를 재수행합니다.

    이렇게 하면 정상적으로 유효성 검사가 진행되는 것을 확인하실 수 있습니다.


    이번 글에서는 본격적으로 Jenkins, ArgoCD를 통해 CI/CD Pipeline을 구성하기에 앞서 필요한 사전 준비에 대해 다뤄보았습니다. 

    다음 글부터는 실제 Jenkins에서 Job을 생성하는 과정에 대해 다뤄보겠습니다. 

    728x90
    320x100
    SMALL