[CI/CD]1주차 - Jenkins 기본 사용
Jenkins는 CI/CD를 제공하는 오픈소스 자동화 도구이다.
다양한 플러그인을 제공하여 사용할 수 있고 파이프라인을 통한 소프트웨어 빌드, 테스트 및 배포를 지원한다.
여러 플러그인을 제공하니 편리하게 사용할 수 있는데, 예를 들어 Git과 연동하고 특정 조건을 걸면 레포지토리에 push 또는 merge할 때마다 젠킨스 파이프라인을 구동시킬 수 있다. 또는 크론을 이용해서 특정 주기마다 파이프라인을 구동시킬 수 있다.
먼저 단순하게 Execute shell로 젠킨스에서 Command 동작이 잘 이루어지는지 확인해 본다.
Freestyle project로 Item을 생성한다.
나머지는 별다른 설정없이 Build Steps에 간단한 명령어를 입력하고 빌드를 돌리면
Console Output에서 빌드 성공한 출력을 확인할 수 있다.
이는 젠킨스 컨테이너 내부에 접속하여 명령어를 실행하는 것과 동일하다
또한 내부에 프로젝트가 잘생성되었는지도 확인할 수 있다
두 번째 실습에 앞서 gogs에 대한 credentials를 설정해 준다. 초기화면에서 Jenkins 관리 > Credentials > Globals에 들어오면 credential을 추가할 수 있다.
이는 Jenkins가 스크립트에서 gogs-dev-app이라는 id를 통해 지금 설정한 credentials를 활용할 수 있다. Jenkins에서 gogs 레포지토리에 접근하기 위함이다.
두 번째 Item을 만들어서 파라미터+git+스크립트를 사용하는 빌드 과정을 만든다.
String Parameter를 통해 매개변수를 지정할 수 있다.
gogs 레포지토리는 git을 체크하고 설정해 줄 수 있는데, 내 레포지토리를 입력하고 Credentials를 선택하면 바로 인증된다. 브랜치는 main 브랜치이다.
마지막 Excute shell에 파라미터 값을 찍고 레포지토리에 올라와있는 VERSION 파일을 확인해 보면 파라미터 값을 찍는지와 git 레포와 연동이 잘되었는지 확인할 수 있다.
파라미터와 함께 빌드를 누르면 매개변수를 빌드 시마다 변경해서 사용할 수 있다.
Console Output에서 확인하면 gogs-dev-app이라는 credential을 통해 내 원격 레포지토리에 접근 로그가 확인된다.
젠킨스 내부 서버에서 확인해 보면 원격 레포에 올라가 있는 파일을 전부 받아왔다.
젠킨스 웹의 작업공간에서도 직관적으로 확인할 수 있다.
마지막으로 도커허브와 연동해서 빌드된 컨테이너 이미지를 도커허브에 push하는 과정도 실습해 본다
우선 메인페이지 > Jenkins 관리 > Plugins에서 아래 세 가지 플러그인을 설치해 준다
- Pipeline Stage View: 각 빌드 단계 과정을 시각화해 주는 플러그인
- Docker Pipeline: docker build, push와 같은 명령어를 실행시켜 주는 플러그인
- Gogs: gogs 웹훅 플러그인
세 가지 다 설치해 주었고 이 플러그인은 Jenkins를 재시작해 주지 않아도 바로 사용 가능하다
이제 도커허브를 사용하기 위해 git과 동일하게 credentials부터 생성해 준다.
이제 New Item으로 파이프라인을 실행시켜 보자
아래 파이프라인은 Checkout → Read VERSION → Docker Build and Push 단계로 구성되어 있다
pipeline {
agent any
environment {
DOCKER_IMAGE = '6ain/dev-app' // Docker 이미지 이름
}
stages {
stage('Checkout') {
steps {
git branch: 'main',
url: 'http://192.168.219.100:3000/devops/dev-app.git', // Git에서 코드 체크아웃
credentialsId: 'gogs-dev-app' // Credentials ID
}
}
stage('Read VERSION') {
steps {
script {
// VERSION 파일 읽기
def version = readFile('VERSION').trim()
echo "Version found: ${version}"
// 환경 변수 설정
env.DOCKER_TAG = version
}
}
}
stage('Docker Build and Push') {
steps {
script {
docker.withRegistry('https://index.docker.io/v1/', 'dockerhub-credentials') {
// DOCKER_TAG 사용
def appImage = docker.build("${DOCKER_IMAGE}:${DOCKER_TAG}")
appImage.push()
}
}
}
}
}
post {
success {
echo "Docker image ${DOCKER_IMAGE}:${DOCKER_TAG} has been built and pushed successfully!"
}
failure {
echo "Pipeline failed. Please check the logs."
}
}
}
- environment: Docker 이미지 이름을 내 도커허브 레포지토리에 맞게 지정해 준다.
-
stage(‘Checkout’): git checkout 과정인데 git에 대한 자격증명과 url을 설정해 주면 해당 레포에서 소스를 젠킨스서버로 가져올 수 있다
-
stage(‘Read VERSION’): 저장소에서 가져온 소스들 중 버전파일을 확인한다
- stage(‘Docker Build and Push’): Docker Pipeline 플러그인을 빌드 및 푸시를 진행한다
-
docker.withRegistry
: 도커허브에 로그인한다 -
docker.build
: 도커 이미지를 빌드한다 -
appImage.push()
: 빌드된 이미지를 도커허브에 푸시한다
-
-
post: 마지막으로 성공 혹은 실패에 따라 다른 메세지를 출력할 수 있다.
파이프라인을 실행시키면 설치했던 Pipeline Stage View 플러그인 덕분에 단계별로 한눈에 볼 수 있다
실패한 내역은 도커허브 credential에서 패스워드가 틀렸었고 이는 Console Output에서 로그를 통해 확인 가능하다
최종적으로 도커허브에 들어와서 이미지가 잘저장됐는지 확인할 수 있고
호스트에서도 해당 이미지가 저장되어 있는지 확인할 수 있다
Leave a comment