Docker와 Jenkins를 통한 싱글 서버 구성 방식 및 flow
Docker Out-of-Docker예시
- Jenkins 컨테이너:
- 하나의 Docker 컨테이너에 Jenkins를 띄워서 CI/CD 파이프라인을 관리
- Jenkins가 Docker 명령어를 실행할 수 있도록, 보통 Docker 소켓(/var/run/docker.sock)을 마운트하거나 Docker 플러그인을 사용
- 애플리케이션 컨테이너:
- 또 다른 Docker 환경(컨테이너 또는 Docker Compose를 활용)에서 Spring Boot 애플리케이션과 MySQL 데이터베이스를 실행
- 이 컨테이너들은 Jenkins 파이프라인에 의해 빌드, 배포 및 관리
즉, Jenkins는 Docker 환경에 있는 애플리케이션(예: Spring Boot, MySQL 컨테이너)을 자동으로 빌드하고 배포하도록 구성
전체 Flow
- GitLab에 코드 푸시:
- dev나 be 브랜치에 코드가 push되면, GitLab 또는 Jenkins에서 파이프라인이 자동으로 트리거됩니다.
- 코드 빌드 및 테스트:
- 파이프라인 내에서 Spring Boot 프로젝트를 빌드하고 단위 테스트, 통합 테스트 등을 실행합니다.
- Docker 이미지 빌드:
- 빌드된 애플리케이션을 기반으로 Docker 이미지를 생성합니다.
- Dockerfile을 이용해 애플리케이션과 필요한 의존성을 포함한 실행 가능한 이미지를 만듭니다.
- Docker Hub로 이미지 푸시:
- 빌드한 Docker 이미지를 버전 태그와 함께 Docker Hub에 푸시합니다.
- 이 과정을 통해 서버는 항상 최신 이미지를 Docker Hub에서 가져올 수 있습니다.
- 서버에서 배포 자동화 (Jenkins 활용):
- Jenkins 파이프라인 내 배포 단계에서, 대상 서버에 접근해 Docker Hub에서 최신 이미지를 pull하고, 기존 컨테이너를 종료한 후 새로운 컨테이너로 실행
- 만약 Docker Compose를 사용한다면, 해당 Compose 파일을 이용해 전체 스택(Spring Boot, MySQL 등)을 업데이트할 수 있다
- Jenkins 파이프라인 예시:
- Checkout: GitLab에서 코드를 가져옴
- Build & Test: Maven/Gradle을 통해 애플리케이션을 빌드 및 테스트
- Docker Build & Push: Docker 이미지를 빌드하고 Docker Hub에 푸시
- Deploy: 대상 서버에서 docker pull 및 컨테이너 재시작(또는 Docker Compose 업데이트)을 실행
Jenkins 및 Gitlab 설정
1.Jenkins에 secrets.properties 및 env 관련된 key내용 저장(Dashboard - Jenkins 관리 - Credentials)
- Add credentials클릭시 유형 선택 가능
- 보통은 secret text
- key.pem과 서버 user등록은 SSH Username with private key
- secrets.properties는 secret file형태로 file 업로드
2. gitlab에서 jenkins에 등록할 Access Token발급(프로필 - prefernece - Access tokens - Add new token)
3. 발급된 토큰 기반으로 아래와 같이 jenkins에 jenkins 관리 - system에서 하단 gitlab쪽 아래와 같이 작성
4. jenkins Pipeline 설정(Dashboard - 생성한 item 클릭 - configuration or 구성)
- Repositor URL: 프로젝트 주소
- Branch Specifier: gitlab에서 push event보내주면 끌고올 source위치 설정
- Credentials: 미리 등록한 Username wwith password 넣어주기
5.jenkins Trigger 설정(Dashboard - 생성한 item 클릭 - configuration or 구성)
- gitlab의 pushevent 경로가 향해야 하는곳: webhookURL
- pushevent 발생하는 branch중 허용할 branch
- 발급된 Secret token은 추후 gitlab의 webhook에 등록 필요
6. jenkins에서 플러그인 설치 및 재시작(Dashboard - Jenkins 관리)
7. gitlab에서 Webhook 설정
- 본인이 프로젝트 Maintainer이어야함, 아니면 settings가 안뜸
- 하단 설정 등록
- url: 아까 jenkins pipeline url등록
- secret token: jenkins trigger등록시 발급되는 token 등록
- Trigger: push events만 설정, 자동배포 적용할 branch 정규식으로 입력
Jenkins 파이프라인 구성
Flow
- push Event발생시에 자동으로 gitlab의 코드 Checksum 파이프라인은 기본 설정이다. 즉 코드를 자동으로 jenkins서버 workspace로 불러들인다는 뜻이다.
- .gitignore로 등록해서 별도로 jenkins credentials에 등록한 secret-properties를 jenkins workspace에 생성된 프로젝트 내 기존 위치와 동일하게 secrets.properties를 만들어준다
- 이제 프로젝트 build를 해준다(gradle 프로젝트이므로 ./gradlew build 사용)
- scp명령어를 통해서 빌드된 jar파일(=프로젝트 파일) ec2 서버로 복사
- ssh명령어로 원격 접속 후 기존 Spring docker 컨테이너 종료 및 재실행
- jenkins(9090포트)페이지 접속후 자동배포 성공/실패 여부 확인 및 Swagger를 통한 확인
- 추후 health check 용 url 생성시 Swagger확인은 불필요
Jenkins 실행 로직 파일 생성
pipeline {
agent any
stages {
stage('Prepare Secrets') {
steps {
// withCredentials를 사용해 secret file을 TEMP_FILE 변수에 할당
withCredentials([file(credentialsId: 'secret-properties', variable: 'SECRET_FILE')]) {
sh '''
# 기존 secrets.properties 파일 삭제 (존재하지 않아도 오류 없이 진행)
rm -f src/main/resources/secrets.properties
# 새로운 secrets.properties 파일 복사
cp "$SECRET_FILE" src/main/resources/secrets.properties
'''
}
}
}
stage('Build') {
steps {
sh 'chmod +x gradlew'
sh './gradlew build -x test'
}
}
stage('Deploy') {
steps {
withCredentials([
sshUserPrivateKey(
credentialsId: 'server-ssh', // SSH Username with private key 타입으로 등록한 credentials ID
keyFileVariable: 'SSH_KEY_FILE', // Jenkins가 임시 파일 경로를 저장할 변수
usernameVariable: 'SERVER_USER' // ssh 사용자명
),
string(credentialsId: 'server-ip', variable: 'SERVER_IP')
]) {
// 복사
sh '''
scp -i "$SSH_KEY_FILE" -o StrictHostKeyChecking=no build/libs/gogoma-0.0.1-SNAPSHOT.jar ${SERVER_USER}@${SERVER_IP}:/home/ubuntu/backend/
'''
// 원격 서버에서 docker-compose 실행
sh '''
ssh -i "$SSH_KEY_FILE" -o StrictHostKeyChecking=no ${SERVER_USER}@${SERVER_IP} "cd /home/ubuntu && sudo docker-compose stop springboot && sudo docker-compose up -d --build springboot"
'''
}
}
}
}
post {
failure {
echo "Build or deployment failed. Please check the logs."
}
}
}
'배포, 운영' 카테고리의 다른 글
[배포] Github Actions 활용한 Spring 백엔드 자동배포 (1) | 2024.12.28 |
---|---|
[배포] Github Actions 활용한 Vue 프론트엔드 자동배포 (0) | 2024.12.28 |
[도메인] 도메인 구입 및 DNS 설정 (0) | 2024.12.16 |
[배포] AWS EC2 생성 및 웹 프로젝트 배포 (0) | 2024.12.16 |
[Ubuntu] Ubuntu 20.04서버 대기 모드로 들어가는 문제 해결 (0) | 2024.05.23 |