지난번에 했던걸 이어서 해보자.
1. acm 인증서를 kt cloud 에 등록 (( cert manager ))
2. https alb 에 인증서 등록
3. gitlab 도메인에 https 붙었는지 확인 후 argocd 연결
-> 나는 바보였다. 뒤에 .git 만 붙이면 되는거였다.
나는 바보다.
삼창
나는바보다.
나는바보다.
나는바보다.
https://honglab.tistory.com/330
argoCD 배포 전략
그러면 매니페스트 레포에 각 백엔드 레포 이름을 애플리케이션으로 잡고, 그 안에 deployment 파일들을 만들어야겠다.
내 현재 파일 구조를 변경해야겠다.
clpaas-gitops
ㄴ clpaas-spring
ㄴ base
머 이런느낌
argocd application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: clpaas-test
namespace: argocd # Argo CD가 설치된 네임스페이스
spec:
project: default # 사용할 프로젝트
source:
repoURL: 'https://gitlab.com/cl-paas/clpaas-gitops.git' # Git 리포지토리 URL
targetRevision: HEAD # 사용할 브랜치
path: 'clpaas-test/base' # base 디렉토리 경로
destination:
server: 'https://kubernetes.default.svc' # Kubernetes API 서버
namespace: dev # 배포할 네임스페이스
syncPolicy:
automated:
prune: true # 삭제된 리소스를 자동으로 제거
selfHeal: true # 상태가 변경된 경우 자동으로 복구
함 읽어보자 ( 링크 )
argocd login <ARGOCD_SERVER> --username <USERNAME> --password <PASSWORD>
argocd app create --file clpaas-test/argocd-application.yaml
jenkins pipeline 을 이용해서 백엔드 CI작업을 통해 docker image 가 변경 -> 변경을 하면서 k8s manifest 의 image tag 를 변경하고, 다시 gitlab 에 push 하면 argoCD 가 인식
이중에 내가 해야할 작업은 후자이다.
k8s 매니페스트에 이미지 태그 변경값을 반영하고, 이를 다시 깃랩에 푸쉬하면
아르고가 인식하게 되는과정을 확인해야한다.
우리 팀원이 했던 것 :
https://github.com/lunch-12/PAPERPLE-CD/blob/main/AI/Jenkinsfile
커뮤니티데이 자료:
https://github.com/hnnynh/k8s-manifest-repo
스크립트 파일을 작성해본다.
아래 접은글 두개는 gpt 의 결과이다.
네, 맞습니다! Jenkins가 이미지를 빌드할 때, Kubernetes 매니페스트의 이미지 태그 값을 변경하는 과정이 필요합니다. 이 과정을 통해 Argo CD가 최신 이미지를 배포할 수 있도록 합니다.
### Jenkins에서 이미지 태그 업데이트 단계
1. **이미지 빌드**: Jenkins가 새로운 이미지를 빌드하고, 이를 Nexus에 푸시합니다. 이때, 새로운 이미지 태그(예: `my-app:latest` 또는 `my-app:${env.BUILD_ID}`)를 생성합니다.
2. **매니페스트 파일 업데이트**: Jenkins 파이프라인 내에서 `sed` 명령어 등을 사용하여 매니페스트 파일의 이미지 태그를 업데이트합니다. 예를 들어:
```groovy
stage('Update Manifest') {
steps {
script {
def newImage = "my-app:${env.BUILD_ID}"
sh "sed -i 's|image: .*|image: ${newImage}|' path/to/manifest.yaml"
}
}
}
```
3. **Git 레포지토리에 커밋**: 매니페스트 파일을 업데이트한 후, Jenkins에서 변경된 파일을 GitLab에 커밋하고 푸시하여 Argo CD가 이를 감지할 수 있도록 합니다.
```groovy
stage('Commit Changes') {
steps {
git credentialsId: 'your-credentials-id', url: 'https://gitlab.com/myuser/myrepo.git'
sh "git add path/to/manifest.yaml"
sh "git commit -m 'Update image tag to ${newImage}'"
sh "git push"
}
}
```
이 과정이 완료되면, Argo CD는 GitLab에서 매니페스트 파일의 변경을 감지하고, 새로운 이미지 태그로 Kubernetes 클러스터에 배포를 수행합니다.
추가 질문이 있으시면 언제든지 말씀해 주세요!
이런 자료를 참고했어요.
[1] 티스토리 - Jenkins pipeline 소개 및 Java 애플리케이션 CI/CD pipeline 작성 (https://beer1.tistory.com/55)
[2] 티스토리 - [GitOps] Jenkins 연동 및 컨테이너 이미지 버전 태그 자동 생성 (https://jh-labs.tistory.com/673)
[3] velog - GitOps / Jenkins - Pipeline Ver. Docker (https://velog.io/@codelab/GitOps-Jenkins-Pipeline)
[4] 티스토리 - Jenkins pipeline, ArgoCD로 K8S배포 자동화 하기 - 1 (https://hwannny.tistory.com/113)
뤼튼 사용하러 가기 > https://agent.wrtn.ai/5xb91l
Jenkinsfile은 일반적으로 프로젝트의 루트 디렉토리에 위치합니다. Jenkins가 이 파일을 인식하고 파이프라인을 실행하기 위해 다음 단계를 따르면 됩니다.
### 1. Jenkinsfile 위치
- **프로젝트 루트**: Git 저장소의 루트 디렉토리에 `Jenkinsfile`이라는 이름으로 파일을 생성합니다.
```
your-repo/
├── Jenkinsfile
├── src/
├── Dockerfile
└── ...
```
### 2. Jenkins에서 파이프라인 설정
1. **Jenkins 대시보드**에 로그인합니다.
2. **새로운 아이템(New Item)**을 클릭합니다.
3. **Pipeline**을 선택하고, 프로젝트 이름을 입력합니다.
4. **Pipeline** 설정 페이지에서 **Pipeline script from SCM**을 선택합니다.
5. **SCM**에서 Git을 선택하고, 저장소 URL을 입력합니다.
6. **Branch Specifier**에 사용할 브랜치를 입력합니다 (예: `*/main`).
7. **Script Path**에 `Jenkinsfile` 또는 원하는 경로를 입력합니다 (기본적으로 `Jenkinsfile`로 설정할 수 있습니다).
### 3. 빌드 실행
- 설정이 완료되면 **저장(Save)** 버튼을 클릭하고, 프로젝트 페이지로 돌아가서 **Build Now**를 클릭하여 파이프라인을 실행할 수 있습니다.
### 4. 추가 사항
- Jenkinsfile을 수정할 경우, 변경 사항을 Git에 커밋하고 푸시한 후, Jenkins에서 다시 빌드를 실행해야 합니다.
- Jenkins의 멀티 브랜치 파이프라인 기능을 사용하면, 여러 브랜치에서 Jenkinsfile을 자동으로 인식하도록 설정할 수도 있습니다.
이 과정을 통해 Jenkinsfile을 프로젝트에 추가하고, Jenkins에서 CI/CD 파이프라인을 설정할 수 있습니다. 추가 질문이 있으면 언제든지 말씀해 주세요!
이런 자료를 참고했어요.
[1] 티스토리 - jenkins 특정 폴더로 build - 개발 잡학사전 (https://genie247.tistory.com/entry/jenkins-%ED%8A%B9%EC%A0%95-%ED%8F%B4%EB%8D%94%EB%A1%9C-build)
[2] velog - Jenkins를 이용해서 배포하기 (https://velog.io/@znftm97/Jenkins%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4%EC%84%9C-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0)
[3] velog - Jenkins를 활용한 배포 (https://velog.io/@dh97k/Jenkins%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EB%B0%B0%ED%8F%AC)
[4] 티스토리 - [Jenkins CI/CD] 3. Jar 파일을 클라우드 서버로 전달하기 (https://zayson.tistory.com/entry/Jenkins-CICD-3-Jar-%ED%8C%8C%EC%9D%BC%EC%9D%84-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EC%84%9C%EB%B2%84%EB%A1%9C-%EC%A0%84%EB%8B%AC%ED%95%98%EA%B8%B0)
뤼튼 사용하러 가기 > https://agent.wrtn.ai/5xb91l
일단 나의 파이프라인은 매니페스트에 이미지 태그값을 변경해주고, 이를 다시 푸쉬해준다.
푸쉬 이후에는 argocd 가 이를 반영하니 따로 설정을 더 할 필요는 없다.
타 파이프라인에서 (이미지 빌드, 태그값 변경) 작업을 마친 후에, 각각의 환경변수 ( 이미지 이름, 이미지 태그등 의 값을 담음)
를 전달해줄 것이라고 가정하고,
결론적으로 내가 작성한 스크립트 파일은 다음과 같다.
이게 근데 잘 돌아갈지는 모르겠음...
어떻게 확인하지?
pipeline {
agent any
parameters {
string(name: 'DOCKER_IMAGE', defaultValue: 'clpaas-test', description: 'Docker 이미지 이름')
string(name: 'IMAGE_TAG', defaultValue: 'latest', description: 'Docker 이미지 태그')
string(name: 'REGISTRY_ACCOUNT', defaultValue: 'pinetree0308', description: 'Docker 레지스트리 계정')
}
environment {
gitlabURL = "https://gitlab.com" // GitLab
gitlabCredential = "gitlab-gitops-token"
gitlabAccount = "cl-paas"
gitlabProject = "clpaas-gitops"
registryURLPull = "https://hub.docker.com/repository/docker/pinetree0308/nginx/general" // Docker registry URL
}
stages {
stage('Clone Git Repository') {
steps {
script {
// GitLab에서 리포지토리 클론
withCredentials([usernamePassword(credentialsId: "$gitlabCredential",
usernameVariable: 'GITLAB_USER',
passwordVariable: 'GITLAB_ACCESS_TOKEN')]) {
sh """
git clone https://${GITLAB_USER}:${GITLAB_PASSWORD}@${gitlabURL}/${gitlabAccount}/${gitlabProject}.git
"""
}
}
}
}
stage('Update Image Tag in Manifest') {
steps {
script {e
// Kustomize를 사용하여 이미지 태그 업데이트
dir(gitlabProject) {
sh """
cd ${params.DOCKER_IMAGE}/overlays/development
kustomize edit set image ${registryURLPull}/${params.REGISTRY_ACCOUNT}/${params.DOCKER_IMAGE}:${env.BUILD_ID}
"""
}
}
}
}
stage('Push Changes to Git') {
steps {
script {
// 변경 사항을 Git에 커밋하고 푸시
withCredentials([usernamePassword(credentialsId: "$gitlabCredential",
usernameVariable: 'GITLAB_USER',
passwordVariable: 'GITLAB_ACCESS_TOKEN')]) {
sh """
cd ${gitlabProject}
git config --global user.email "clpaas@kt.co.kr"
git config --global user.name "Jenkins clpaas pipeline"
git add .
git commit -m "Update image tag to ${env.IMAGE_TAG}"
git push
"""
}
}
}
}
}
}
일단 테스트 파일로써만 임시로 적어뒀다.
차후 백엔드별로 파이프라인 작성할 예정이다.
(사실 글로벌 환경변수로 일일이 작성하지 않고 하나의 파이프라인을 적어둔담에 그걸 따로 앱들이 호출해서 환경변수를 삽입하면 되지않을까? 했지만 나의 부족한 젠킨스 실력으로는 찾기가 어려워서 일단..넘어가겠다)
그렇다면, 이미지가 빌드되고 태그값이 변경하는 파이프라인에서 내 파이프라인은 어떻게 호출할 까?
2. Parameterized Trigger Plugin 사용하기
이 플러그인을 사용하면 다른 Job을 호출할 때 파라미터를 쉽게 전달할 수 있습니다. 이 플러그인은 설치가 필요합니다.
groovy
pipeline {
agent any
stages {
stage('Trigger Another Pipeline') {
steps {
// 다른 Job을 호출
build job: 'another-pipeline-name',
parameters: [string(name: 'PARAM1', value: 'value1')]
}
}
}
}
gpt 한테 물어본 결과이긴 한데,,
여튼 다른 job 을 호출할 수 있는듯 하다.
안된다면? 그냥 각 애플리케이션마다 젠킨스파일에 위 내용을 추가해주면 될 듯 하다.
솔직히,, 제일 편한방법은 태그값 고정시켜놓는거긴 하지만,,
그렇게되면이미지가 업데이트되어도 argoCD 가 변경사항을 알 수 없기 때문에...
일단 저렇게 해두겠다.
다음 작업)
각 백엔드 어플리케이션에 젠킨스 파일 추가해서, 젠킨스 파이프라인 동작 + argoCD 로 배포 잘 되는지 확인!
참고)
'☁️2024 > Cloud' 카테고리의 다른 글
[KT Cloud] K2P Standard Container DevOps 이해 및 응용 #5 (3) | 2024.10.15 |
---|---|
[KT Cloud] K2P Standard Container DevOps 이해 및 응용 #4 (2) | 2024.10.04 |
[KT Cloud] K2P Standard Container Devops 이해 및 응용 #2 (0) | 2024.09.23 |
[KT Cloud] K2P Standard Container Devops 이해 및 응용 #1 (0) | 2024.08.23 |
CKA 응시 후기 ( 과연 결과는 ?! ) (0) | 2024.05.17 |