Jenkins으로 CD Pipeline 설정

비전·2025년 1월 18일

새로운 Item 생성

Github에 파일 올리기

CI 를 통해서 깃허브 레포지토리 변경을 감지했을 때 실행할 수 있는 파일을 올립니다.

  • Jenkinsfile
pipeline {
    agent any  // 파이프라인을 실행할 Jenkins 에이전트 지정

    environment {
        AZURE_CLIENT_ID = credentials('azure-client-id')  // Azure 클라이언트 ID를 Jenkins 크리덴셜에서 가져옴
        AZURE_CLIENT_SECRET = credentials('azure-client-secret')  // Azure 클라이언트 시크릿
        AZURE_TENANT_ID = credentials('azure-tenant-id')  // Azure 테넌트 ID
        DOCKER_IMAGE = 'acrproject.azurecr.io/web-app:latest'  // Docker 이미지 경로
    }

    stages {
        stage('Login to Azure') {
            steps {
                script {
                    // Azure에 로그인하는 단계
                    sh '''
                        az login --service-principal -u $AZURE_CLIENT_ID -p $AZURE_CLIENT_SECRET --tenant $AZURE_TENANT_ID
                    '''
                }
            }
        }

        stage('Clone Repository') {
            steps {
                // GitHub에서 애플리케이션 소스를 클론
                git branch: 'main', url: 'https://github.com/visionn7111/TickettingWeb.git'
            }
        }

        stage('Build Docker Image') {
            steps {
                script {
                    // Docker 이미지를 빌드하는 단계
                    sh 'docker build -t $DOCKER_IMAGE .'
                }
            }
        }

        stage('Push to ACR') {
            steps {
                script {
                    // Azure Container Registry에 Docker 이미지를 푸시
                    sh '''
                        docker login acrproject.azurecr.io --username $AZURE_CLIENT_ID --password $AZURE_CLIENT_SECRET
                        docker push $DOCKER_IMAGE
                    '''
                }
            }
        }

        stage('Deploy to AKS') {
            steps {
                script {
                    // AKS 클러스터에 배포
                    sh '''
                        az aks get-credentials --resource-group resourcegroup-project --name AKS
                        kubectl apply -f ticketing-web-deployment.yaml
                    '''
                }
            }
        }

        stage('Apply Service YAML') {
            steps {
                script {
                    // 외부 서비스와 연결하기 위한 Service YAML 적용
                    sh '''
                        kubectl apply -f ticketing-web-service.yaml
                    '''
                }
            }
        }
    }

    post {
        always {
            echo 'Deployment finished.'
        }
        failure {
            echo 'Deployment failed. Please check the logs.'
        }
    }
}
  • Dockerfile
# 베이스 이미지로 Ubuntu 사용
FROM ubuntu:20.04

# 환경 변수 설정 (비대화식 설치를 위한 설정)
ENV DEBIAN_FRONTEND=noninteractive

# 필수 패키지 설치 및 Apache 웹 서버 설치
RUN apt-get update && apt-get install -y \
    apache2 \
    git \
    curl \
    && apt-get clean

# /var/www/html 디렉토리를 비운 후 GitHub에서 리포지토리 클론
RUN rm -rf /var/www/html/* && \
    git clone https://github.com/visionn7111/TickettingWeb /var/www/html

# Apache 설정
RUN chown -R www-data:www-data /var/www/html && \
    chmod -R 755 /var/www/html

# Apache를 포그라운드에서 실행하도록 설정
CMD ["apache2ctl", "-D", "FOREGROUND"]

# 컨테이너의 80번 포트 노출
EXPOSE 80
  • ticketing-web-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ticketing-web
spec:
  replicas: 2
  selector:
    matchLabels:
      app: ticketing-web
  template:
    metadata:
      labels:
        app: ticketing-web
    spec:
      containers:
      - name: ticketing-web
        image: acrproject.azurecr.io/ticketing-web:latest  # ACR 이미지 주소
        ports:
        - containerPort: 80
      imagePullSecrets:
      - name: acr-secret  # your-app에서 사용된 동일한 시크릿 이름
  • ticketing-web-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: ticketing-web-service
spec:
  selector:
    app: ticketing-web
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer

ACR AKS 연동

az aks update \
    --name AKS \
    --resource-group resourcegroup-project \
    --attach-acr acrproject

크리덴셜 설정

현재 mgnt-aks 서버에 존재하는 /.kube/config 파일을 크리덴셜로 지정해야 합니다.
Kind를 Secret file로 선택합니다.
File 항목에, 앞서 다운로드한 kubeconfig 파일을 선택하여 업로드합니다.

이후 크레덴셜 ID 를 Jenkinsfile에 맞춥니다.


docker run -d \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /var/lib/jenkins:/var/jenkins_home \
    --name jenkins \
    jenkins/jenkins:lts
  • ACR 로그인
    az acr login --name acrproject
az ad sp create-for-rbac --name acr-service-principal --role Reader --scopes /subscriptions/f92334ca-bcc0-464d-a702-27b6693903eb/resourceGroups/resourcegroup-project/providers/Microsoft.ContainerRegistry/registries/acrproject
  • 프리시펄 생성
az ad sp create-for-rbac --name "myJenkinsSP" --role contributor --scopes /subscriptions/f92334ca-bcc0-464d-a702-27b6693903eb
  • 생성결과
{
  "appId": "97c3c3ac-96b0-4e42-a774-9f718f8894f3",
  "displayName": "myJenkinsSP",
  "password": "nTk8Q~si8FLYaKwDcCDRx-yDxdRWnt0bP28nwdkT",
  "tenant": "0f101777-e695-41a5-abcf-cc426437b3eb"
}
  • 권한부여
az role assignment create --assignee 97c3c3ac-96b0-4e42-a774-9f718f8894f3 --role AcrPush --scope /subscriptions/f92334ca-bcc0-464d-a702-27b6693903eb/resourceGroups/resourcegroup-project/providers/Microsoft.ContainerRegistry/registries/acrproject

크레덴셜 설정

범위(Scope): Global 또는 다른 적절한 범위
자격 증명 유형(Credentials type): Secret text
ID: azure-client-id
Secret: 97c3c3ac-96b0-4e42-a774-9f718f8894f3 (App ID)
azure-client-secret

범위(Scope): Global 또는 다른 적절한 범위
자격 증명 유형(Credentials type): Secret text
ID: azure-client-secret
Secret: nTk8Q~si8FLYaKwDcCDRx-yDxdRWnt0bP28nwdkT (Password)
azure-tenant-id

범위(Scope): Global 또는 다른 적절한 범위
자격 증명 유형(Credentials type): Secret text
ID: azure-tenant-id
Secret: 0f101777-e695-41a5-abcf-cc426437b3eb (Tenant ID)

거의 100번 시도만에 빌드 완료

파드 작동중입니다.

서비스 중이며 IP를 통해 접속합니다.

profile
아는 만큼 보인다

0개의 댓글