서론
이전 기사에서 다룬 Jenkins 구축 및 플러그인 설치 내용은 다음 링크에서 확인할 수 있습니다: https://www.cnblogs.com/nhdlb/p/18561435
SSH 원격 서버 연결 구성
SSH 연결 플러그인을 설치해야 합니다. 이전 기사에서 설치 방법을 확인할 수 있습니다.
SSH 연결 구성 시작
저장!!
새로운 뷰 생성
프로젝트의 프론트엔드와 백엔드를 통합하기 쉽게 하기 위함
새로운 작업 생성
뷰 선택
프로젝트(작업) 생성
작업 구성
프로젝트 구조
먼저 프로젝트 구조를 소개하면, 다음 작업 이해에 도움이 될 것입니다.
우리가 하려는 것은 원격 서버 자동 배포이므로, 이 프로젝트의 Dockerfile, docker-compose.yml은 원격 서버의 디렉토리에 배치해야 합니다. 나중에 설명하니 지금은 이 파일들에 대해 너무 신경 쓰지 마세요.
매개변수화된 빌드 구성
여기에 매개변수를 구성하는 목적은 나중에 셸 스크립트가 매개변수에 따라 다른 이미지와 컨테이너를 생성할 수 있도록 하기 위함입니다.
참고: 빌드 경로의 기본 경로는 GitLab 프로젝트의 루트 디렉토리이므로, 여기서의 빌드 경로는 base-modules/로 시작합니다.
프로젝트 주소 구성
빌드 트리거 구성
스냅샷 빌드 구성
예약된 작업 빌드
프로젝트 요구사항에 따라 예약된 작업을 설정할지 여부를 결정합니다.
Jenkins는 Cron 표현식을 사용하여 예약된 작업의 실행 규칙을 설정합니다:
Jenkins의 H 표시는 작업이 동일한 시점에 과부하되지 않도록 트리거 시간을 분산시키는 데 사용됩니다. 이는 원래 Cron과 약간 다릅니다.
5분마다 한 번씩 실행
H/5 * * * *
매일 오전 10시와 오후 4시에 각각 실행
H 10,16 * * *
15분마다 빌드
H/15 * * * *
매일 오전 8시부터 오후 5시까지 2시간마다 빌드
H 8-17/2 * * *
월요일부터 금요일까지 오전 8시부터 오후 5시까지 2시간마다 빌드
H 8-17/2 * * 1-5
12월을 제외한 매월 1일과 15일에 각각 빌드
H H 1,15 1-11 *
빌드 로그 사용자 정의 이름 지정
매개변수 빌드 이름 지정 참조
Jar 패키징을 위한 pom 파일 구성
# 모든 모듈을 패키징하려면 다음 명령 사용
clean package -U -Dmaven.test.skip=true
# 특정 모듈만 패키징하려면 다음 명령 사용
clean package -U -pl ${매개변수 빌드 속성 이름} -am -Dmaven.test.skip=true
모든 모듈 패키징
특정 모듈 패키징
셸 스크립트 구성
여기서는 "Send files or execute commands over SSH"를 선택합니다.
중요: 각 모듈에 대해 Transfer Set을 생성해야 합니다. Remove prefix는 모호 일치를 지원하지 않으므로 이 부분이 다소 번거로울 수 있습니다.
각 모듈에 대해 Transfer Set 모듈을 생성해야 합니다.
마지막 Transfer Set 모듈의 Exec command에 실행할 명령을 작성합니다.
원격 서버 환경
디렉토리 구조
현재 디렉토리는 기사 시작 부분에 설정된 jar 저장 디렉토리입니다. /home/compose/business/
Dockerfile
FROM openjdk:21
#LABEL authors="zhaoyue"
# 빌드 매개변수 설정
ARG JARNAME
# 빌드 매개변수 설정
ARG JARPORT
# 빌드 매개변수 설정
ARG ACTIVEPRO
# 값 전달
ENV PRO_ACTIVE=${ACTIVEPRO}
# jar 매핑
COPY ${JARNAME}.jar app.jar
# 포트
EXPOSE ${JARPORT}
# 실행 명령
ENTRYPOINT ["java", "-jar", "-Duser.timezone=Asia/Shanghai","-Dfile.encoding=UTF-8", "app.jar", "--spring.profiles.active=${PRO_ACTIVE}"]
docker-compose.yml
#version: "3.8"
networks:
# 다른 compose와 공유하는 네트워크
htec_net:
external: true
services:
gateway:
# 여기서 이미지 이름은 컨테이너 이름과 일치하여 관리 작업이 용이합니다
image: portal-gateway:latest
container_name: portal-gateway
restart: always
ports:
- 9601:9601
networks:
htec_net:
ipv4_address: 172.19.8.11
volumes:
- /etc/localtime:/etc/localtime:ro
core:
image: portal-core:latest
container_name: portal-core
restart: always
ports:
- 9603:9603
networks:
htec_net:
ipv4_address: 172.19.8.13
volumes:
- /etc/localtime:/etc/localtime:ro
project:
image: portal-project:latest
container_name: portal-project
restart: always
ports:
- 9604:9604
networks:
htec_net:
ipv4_address: 172.19.8.14
volumes:
- /etc/localtime:/etc/localtime:ro
system:
image: portal-system:latest
container_name: portal-system
restart: always
ports:
- 9606:9606
networks:
htec_net:
ipv4_address: 172.19.8.16
volumes:
- /etc/localtime:/etc/localtime:ro
jar_build.sh
#!/bin/bash
# 변수 정의
# jar 저장 절대 경로
JAR_PATH="/home/compose/business/"
# 이미지 이름과 포트
JAR_NAMES="portal-gateway:9601,portal-core:9603,portal-project:9604,portal-system:9606"
# 프로덕션 환경 설정
MAVEN_ENV="portalPlatform_pro"
# 이전 IFS 값 저장
OLD_IFS=$IFS
# IFS를 쉼표로 설정
IFS=','
# 문자열을 배열로 분할
echo "########## 다중 옵션 값 읽기 #####################"
read -ra names <<< "$JAR_NAMES"
# IFS를 이전 값으로 복원
IFS=$OLD_IFS
# 지정된 디렉토리로 이동
cd $JAR_PATH || { echo "디렉토리 변경 실패"; exit 1; }
echo "########## 모든 컨테이너 중지 #####################"
# docker-compose로 컨테이너 정리 실행
docker-compose down
echo "########## 비즈니스 모듈명 순회 #####################"
for name in "${names[@]}"; do
# 머리부: 이름
base_name=$(echo "${name%%:*}" | awk '{$1=$1};1')
# 이름 가져오기
module_name=${base_name##*-}
# 꼬리부: 포트 번호
base_port=${name##*:}
echo "#---------- $base_name + $base_port"
# 이미지 ID 가져오기
CID_BUSINE=$(docker images | grep "$base_name" | awk '{print $1}')
echo "# - - - - - $CID_BUSINE"
if [ -z "$CID_BUSINE" ]; then
echo "값이 없음, 이미지 삭제 불필요!"
else
# 이미지 삭제
docker rmi $CID_BUSINE
fi
# 새 이미지 빌드
docker build -t $base_name:latest --build-arg ACTIVEPRO=$MAVEN_ENV --build-arg JARNAME=./base-$module_name --build-arg JARPORT=$base_port .
done
echo "########## 프로젝트 컨테이너 시작 #####################"
docker-compose up -d
echo "########## 컨테이너 실행 완료 #####################"
빌드 실행
원격 서버에서 백엔드 컨테이너 빌드가 완료되었습니다!!!!!