


CI 를 통해서 깃허브 레포지토리 변경을 감지했을 때 실행할 수 있는 파일을 올립니다.
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.'
}
}
}
# 베이스 이미지로 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
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에서 사용된 동일한 시크릿 이름
apiVersion: v1
kind: Service
metadata:
name: ticketing-web-service
spec:
selector:
app: ticketing-web
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
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
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를 통해 접속합니다.