젠킨스 세팅
docker 설치여부 확인
yum list installed | grep docker
설치된 내역이 없으면 설치를 해준다.
docker 설치 (리눅스 centos 기준)
# yum-utils 업데이트
sudo yum update
sudo yum install -y yum-utils
# docker-ce 레포 추가
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# Docker 설치
sudo yum install docker-ce docker-ce-cli containerd.io -y
# Docker 시작 및 서비스 등록
# 버전확인
docker -v
# 서비스 시작.
sudo systemctl start docker
# 부팅 시 서비스 자동 시작.
sudo systemctl enable docker
# 서비스 상태.
sudo systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: disabled)
Active: active (running) since Mon 2024-11-25 14:17:15 KST; 1 month 13 days ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
서비스 상태확인시 Active: active 상태라면 정상적으로 docker가 실행되고 있는중입니다.
docker에 jenkins 세팅
# docker 설치 후 젠킨스 이미지 설치(java17)
docker pull jenkins/jenkins:jdk17
# docker 이미지 확인
docker images
# docker 이미지 삭제하고 싶을 경우 아래 명령어로 삭제하면 됩니다.
# docker rmi 이미지명(jenkins/jenkins:jdk17)
# docker 컨테이너 실행
# 아래 명령어 실행시 docker 컨테이너에 8080포트의 jenkins서비스를 실행합니다.
# 외부에서 10050포트로 접속하면 docker가 알아서 8080포트로 포워딩합니다.
docker run --name jenkins -d -p 10050:8080 jenkins/jenkins:jdk17
# docker 컨테이너 확인
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2f8f353aa8c2 jenkins/jenkins:jdk17 "/usr/bin/tini -- /u…" 4 months ago Up 5 weeks 50000/tcp, 0.0.0.0:10050->8080/tcp, :::10050->8080/tcp jenkins-salesadjust-admin-dev
# docker 컨테이너 root로 접속
# -u root 없이 접속할 경우 권한이 없어 vim 설치하는데 귀찮아집니다.
docker exec -it -u root 2f8f353aa8c2 /bin/bash
# docker 컨테이너에 vim 설치후 initialAdminPassword 파일에 적혀있는 비밀번호 확인
apt-get update
apt-get install vim
cat /var/jenkins_home/secrets/initialAdminPassword
#아래 명렁어는 docker기능 사용시 참고하실 명령어입니다.
#컨테이너 시작/중지/재시작
docker start 2f8f353aa8c2
docker stop 2f8f353aa8c2
docker restart 2f8f353aa8c2
jenkins 사이트 접속하면 아래와 같은 초기비밀번호를 입력하라는 화면이 보여짐
이런 경우 docker 컨테이너에 직접 접속하여 초기비밀번호를 확인해야 함.
initialAdminPassword파일에 적혀 있는 비밀번호 입력
jenkins 접속은 http://서버IP:10050으로 접속
오른쪽상단 계정명을 클릭하여 ' Account' 카테고리 접속
jenkins time Zone ' Asia/Seoul '로 변경
jenkins와 gitlab연동
jenkins에 gitlab 플러그인설치
Available plugins 메뉴에서 gitlab 검색후 install 버튼 클릭
설치가 완료되면 하단에 재시작버튼 클릭
서버에서 docker 컨테이너를 재시작
# 실행중인 docker 컨테이너 중지
docker stop 2f8f353aa8c2
# 실행중인 docker 컨테이너 시작
docker start 2f8f353aa8c2
gitlab 플러그인이 정상적으로 설치되었다면
'Dashboard > Jenkins 관리 > Credentials > System > Global credentials (unrestricted)' 메뉴 접속후
화면의 Kind 카테고리에 GitLab API token 항목이 있다면 정상적으로 플러그인 설치 완료
gitlab api token 생성
아래와 같이 체크 후 토큰생성
생성된 토큰을 jenkins에 등록해준다.
jenkins 환경설정
- docker 컨테이너의 OS환경변수 세팅
- jenkins와 gitlab 연결 , Test Connection 버튼을 클릭하여 접속 테스트 시행
만약 아래와 같은 오류가 발생한다면 gitlab 도메인의 crt 인증서 파일을 생성하여 jenkins의 자바코드가 바라보고 있는 인증서 저장공간에 넣어줘야 한다.
Client error: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
* 자체적으로 구축된 gitlab 서버가 CA기관에 등록된 ssl인증서로 https를 세팅한게 아닐경우 발생하는것으로 예상됨.
# docker jenkins 컨테이너 접속
docker exec -u root -it 13efaceed47d /bin/bash
# gitlab 도메인 crt 인증서 파일 생성
echo | openssl s_client -connect gitlab.zlgoon.com:443 | openssl x509 > gitlab-cert.crt
# keytool 유틸리티를 사용하여 자체 서명된 SSL 인증서(gitlab-cert.crt)를
# Java 키 저장소(cacerts)에 신뢰된 인증서로 추가
# 시스템에서 질문이 들어올경우 yes 입력
keytool -import -alias gitlab -keystore /opt/java/openjdk/lib/security/cacerts -file /var/jenkins_home/gitlab-cert.crt -storepass changeit
# Git의 SSL 인증서 검증을 비활성화
# 위에 내용을 적용해줘도 gitlab이 안될 경우 아래 명령어 실행
git config --global http.sslVerify false
자바 키 저장소에 정상적으로 추가되었다면 Success 결과를 반환한다.
참고로 토큰은 일회성입니다. 다른 환경의 jenkins에서 같은 토큰으로 검증이 안되며
새로 토큰을 받으셔야 합니다.
젠킨스에 gitlab 프로젝트 등록
'Dashboard > All > New Item' 메뉴 접속
프로젝트 이름을 입력한 후 Freestyle project 선택후 OK버튼 클릭
소스코드 관리 > Git 선택 Credentials 에 선택할 자격증명 option이 없을 경우
아래와 같이 + Add버튼을 클릭하여 추가해준다.
gitlab 계정을 등록해주면 된다.
소스코드 관리에 gitlab저장소 정보 및 자격증명을 등록하여
gitlab 저장소와 젠킨스 연동완료 후 저장 버튼 클릭
여기까지가 설정을 완료하면 gitlab 저장소에 코드를 pull 받을수 있다.
왼쪽 카테고리에 지금빌드를 클릭하게 되면 pull이 적용 되고 결과에 Builds 부분에 표시된다.
소스 빌드 및 배포 자동화 처리하기 ( gradle 기준 )
카테고리에 구성으로 들어가 아래와 같이 세팅해주어 gradle clean, build처리 되도록 설정해준다.
저장한 후 다시 '지금빌드'를 클릭하여 소스코드 gitlab pull, gradle build를 적용해준다.
자세한 빌드결과나 오류내용을 보고 싶다면 Builds 영역의 빌드처리 내역을 클릭 한후 'Console Output' 를 클릭하여
빌드 결과를 확인할수 있다.
소스코드 기준 ./gradle/wrapper/ 경로에 gradle-wrapper.jar 라이브러리가 있어야 gradle 빌드가 된다.
빌드후 생성된 war파일 배포하기
배포 자동화는 빌드후 생성한 war파일을 젠킨스를 이용하여 scp 명령어로 배포서버에 war파일을 전송하고 이후에 ssh명령어로 배포서버의 쉘스크립트를 실행시켜 처리한다.
Add build step을 클릭하여 Execute shell을 클릭하여 빌드완료후 처리할 스크립트를 넣어준다.
scp /var/jenkins_home/workspace/project/build/libs/test-admin.war \
root@test.com:/home/tomcat/webapps
ssh root@test.com << EOF /home/tomcat/bin/jenkins-deploy.sh EOF
# 참고
scp {jenkins 빌드시 생성된 war파일 경로} \
{배포서버 계정ID}@{배포서버 IP 또는 도메인주소}:{배포서버 war 배포경로}
ssh {배포서버 계정ID}@{배포서버 IP 또는 도메인주소} << EOF {배포서버에 저장된 배포 스크립트 경로 쉘 스크립트 파일명까지 기재}.sh EOF
#!/bin/bash
# jenkins-deploy.sh 배포 스크립트 파일
SERVICE_NAME=salesadjust
SERVICE_PROCESS_NAME=$SERVICE_NAME-admin
SERVICE_PROCESS_FULL_NAME=$SERVICE_PROCESS_NAME
TIMESTAMP=$(date +%Y%m%d%H%M%S) # 현재 날짜와 시간을 YYYYMMDDHHMMSS 형식으로
BACKUP_WAR_FILE="${SERVICE_PROCESS_NAME}.war.${TIMESTAMP}" # 백업 WAR 파일 이름
# Tomcat 설치 경로
TOMCAT_HOME="/home/tomcat/"
# Tomcat PID
XPID=`ps -ef | grep java | grep $SERVICE_PROCESS_NAME | grep -v grep | awk '{print $2}'`
# Tomcat의 shutdown 및 startup 스크립트 경로
SHUTDOWN_SCRIPT="$TOMCAT_HOME/bin/shutdown.sh"
STARTUP_SCRIPT="$TOMCAT_HOME/bin/startup.sh"
BACKUP_WAR="cp -r ${TOMCAT_HOME}webapps/${SERVICE_PROCESS_NAME}.war ${TOMCAT_HOME}webapps/${BACKUP_WAR_FILE}"
# Tomcat 프로세스의 PID를 찾는 함수
find_pid() {
XPID=$(ps -ef | grep java | grep $SERVICE_PROCESS_NAME | grep -v grep | awk '{print $2}')
echo $XPID
}
# Tomcat 중지 함수
stop_tomcat() {
echo "Stopping Tomcat..."
PID=$(find_pid)
if [ -n "$PID" ]; then
echo "Found Tomcat PID: $PID"
$SHUTDOWN_SCRIPT
sleep 10
# 강제 종료
if [ -n "$(find_pid)" ]; then
echo "Tomcat did not stop in time, forcing shutdown..."
kill -9 $PID
fi
else
echo "Tomcat is not running."
fi
}
# Tomcat 시작 함수
start_tomcat() {
echo "Starting Tomcat..."
$STARTUP_SCRIPT
}
# WAR 파일 백업
$BACKUP_WAR
# Tomcat 중지
stop_tomcat
# Tomcat 시작
start_tomcat
# 배포 확인 및 복구 로직
if [ $? -ne 0 ]; then
echo "Error occurred during startup, restoring from backup..."
# WAR 파일 복구
cp -r ${TOMCAT_HOME}webapps/${BACKUP_WAR_FILE} ${TOMCAT_HOME}webapps/${SERVICE_PROCESS_NAME}.war
# Tomcat 다시 시작
start_tomcat
else
echo "Deployment successful."
fi
모두 적용하고 다시 ' 지금빌드' 클릭 'Console Output' 에서 결과 확인
정상적으로 빌드 및 자동배포까지 완료.
jenkins 계정별 빌드 및 배포 권한 부여하기
jenkins관리 > Security 접속하여 로그인인증한 계정에 기본 권한을 설정 후 저장
빌드권한을 설정할 소스코드 클릭 한후 왼쪽 카테고리에 구성 클릭
' Enable project-based security' 체크 후 Inheritance Strategy > 'Do not inherit permission grants from other ACLs' 선택
권한을 부여할 계정을 등록한 후 Job > Build, Job > Cancel, Job > Read, Job > Workspace, SCM > Tag 에 체크 한후 저장하면 홍길동이라는 계정한테 project-a라는 소스코드를 빌드할수 있는 권한이 부여된다.