
깃허브에서 hook으로 jenkins에 데이터를 보낸 후, S3에 배포까지 했다.
이로 인해서 프론트엔드 배포는 끝이 났고, 백엔드 배포만 하면 되는 상황이다.
우리는 2가지 목표가 있다.
1. Nginx를 통한 BlueGreen 배포
2. 이후 빌드 완료 메시지 보내기
추가)
-> 하지만 진행 과정이 너무길어 일단 배포까지 끝냈다.
끝이 보인다. 조금만 더 힘내자.
pipeline {
agent any
tools {
jdk ("OpenJDK21")
}
environment {
PROJECT_DIR = "/var/jenkins_home/workspace/HarpSeal_Hook" // 프로젝트 경로
PORT_1 = 8081 // 고정된 운영 포트
PORT_2 = 8082 // 배포 포트
NGINX_CONFIG_PATH = "/etc/nginx/conf.d/default.conf" // Nginx 설정 파일 경로
}
stages {
stage('Build') {
steps {
script {
echo "Building backend application..."
// 프로젝트 디렉토리로 이동 후 Gradle 빌드 명령어 실행
sh """
cd ${PROJECT_DIR}
./gradlew clean build
"""
}
}
}
stage('Deploy to New Port') {
steps {
script {
echo "Deploying application on port ${PORT_2}..."
// 새로운 포트에서 애플리케이션 실행
sh """
nohup java -jar ${PROJECT_DIR}/build/libs/*.jar --server.port=${PORT_2} &
"""
}
}
}
stage('Switch Nginx to New Port') {
steps {
script {
echo "Updating Nginx configuration to switch to new port ${PORT_2}..."
// Nginx 설정 파일에서 트래픽을 새로운 포트로 전환
sh """
sed -i 's|server localhost:${PORT_1};|server localhost:${PORT_2};|' ${NGINX_CONFIG_PATH}
nginx -s reload
"""
}
}
}
stage('Stop Previous Application') {
steps {
script {
echo "Stopping application on port ${PORT_1}..."
// 이전 포트에서 애플리케이션 종료
sh """
fuser -k ${PORT_1}/tcp || true
"""
}
}
}
}
post {
always {
echo "Pipeline finished."
}
}
}
코드는 위와 같다.
이후 배포하니 에러가 발생했다.

java 21버전이 없다고 하는 것이었다.
찾아보니 jenkins는 17버전까지 제공하였고,

위와 같이 jdk를 추가해줬다.

또 오류가 났다. java에 권한이 없다는 것이었다.

그래서 java 관련은 권한을 줘 버렸다.
빌드를 했더니 또 오류가 났다..
그래서 검색을 했는데
레퍼런스 : https://chobi-meow.tistory.com/m/20
뭐 하라고 적혀있었다. 하지만
이 글을 보고 따라하니까

(로그찍은모습)
그냥 jenkins가 실행이 안된다.
정신나갈거같다.
한 반나절정도 패닉에 빠져서 검색했지만 방법이 없었고
결국 인스턴스를 밀고 다시하기로 했다.

EC2 재생성 - Hook 걸고 데이터 받아온 뒤

스왑디스크 설정 후

프론트 배포도 완료했다.
겁먹었는데 40분 정도 걸린거 같다.
이후 내가 왜 터졌나 곰곰히 생각해보니

java 21 버전을 지원하지 않길레 수동으로 업데이트 해 줬는데
이때 JAVA_HOME 경로를 잘못 적은거 같다.
그 상황에서 이것저것 건드리다가 환경변수를 잘못 바꿨고, 그대로
Jenkins가 java를 인식하지 못해서 실행이 안됐던 것이다.
그래서


EC2에서 직접 java21 버전을 깔았고, 21버전을 기본 java로 설정하였다.
이후 빌드를 실행하니

드디어..!
저 자바 버전 하나 못맞춰서
하루종일 쌩고생하고 ec2 인스턴스 하나 날려먹고 난리도 아니었다.
이후 Build 하고 데이터를 DockerHub로 올릴려고 한다.

이처럼 DockerHub로 데이터를 올리는 이유는 다음과 같다.
따라서 구조는 jenkins -> dockerhub -> instance(docker) 순으로 될 것이다.
하지만 docker build를 할때 문제가 발생했다.
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
레퍼런스 : https://hackmamba.io/blog/2022/04/running-docker-in-a-jenkins-container/
처음부터 -v를 통해 daemon을 연결해주지 않으면 소켓이 연결되지 않는다고 한다.
멘탈이 박살나버렸지만 다시 jenkins를 깔아보자..
이런 정보는 꼭 서버를 터뜨려야 나오는게 참 원망스럽다
jenkins 컨테이너를 만들때 docker 소켓을 마운트 해야 한다.

이후 컨테이너를 새로 만든 후 docker.sock이 마운트 된걸 확인했다.
또 한번더 jenkins 설정을 다시 하고, 프론트 배포를 확인 한 후 백엔드 배포를 하니
jenkins docker permission denied
오류코드를 찍어놓진 못했는데, Jenkins에서 Docker 사용을 못한다는 것이다.
이는 Docker 안에 Jenkins가 컨테이너로 돌아가고, Docker와 소켓으로
연결은 시켰지만 사용 권한이 없다는 것이다.
그래서 jenkins 권한을 Docker와 같이 설정했다.
이후 DockerHub로 데이터를 올리니

드디어 끝났다...
밤새버렸는데 자고와서 마저 적어야겠다
난 왜 정글 끝났는데 잠못자고있는가
다음날 docker 파일을 서버에 실행시키려고 했다.


이미지는 있는데 manifest 설정이 잘못되었다고 한다.
이를 찾아보니 gradle 2.5버전 이후로는 plain 파일이 나온다고 한다.
그래서
jar {
archiveFileName.set("ProjectHarpSeal.jar")
enabled = false
}
build.gradl에서 plain 파일을 못만들게 하고 배포 후 실행하니

스프링 서버가 로그에 뜨기 시작했다!
하지만
[api.properties] cannot be opened because it does not exist
에러가 나왔다.
곰곰하게 생각해보니

이전에 환경변수로 민감데이터 숨긴다고 gitignore에 추가해 버려서 데이터가 서버에 올라가지 못하는 것이었다..
이제 한가지 모순에 빠지게 되는데
참 골때리는 상황이 아닐 수 없다..
일단은 properties를 더미파일로 하나 만들어줬다.
그러자

hibernate에서 postgresql이 안열렸다고 한다.
그럼 일단 서버는 문제없다는것!
이제 문제는 DB가 연결이 안되는 것이다.
당연한게 local 영역에서 db를 설정해 놨기 때문에 aws rds랑은 당연히 연결이 안된다.
레퍼런스 : https://gksdudrb922.tistory.com/240
막혔던 부분은 레퍼런스를 참고했다.

local 영역에서 연결이 확인되었고 이제는 환경변수가 문제였다.
왜냐면 위의 properties와 같은 문제가 발생하는데
절대 git에는 민감정보를 올리면 안된다!
git은 퍼블릭으로 설정되어 있어서 보안상 심각한 취약점이 될 수 있었다.
그래서 생각해 낸 것이 환경변수인데,

jenkins에서 실행할때 환경변수로 설정 데이터를 집어넣어 버렸다.
이건 나중에 포트를 막아버려서 jenkins에 접근이 안되면 절대 털릴수 없다.
그리고 다시 서버를 실행했고

드디어... CI/CD 자동화 완성!
이제 커밋 한번하면 프론트/백엔드 자동배포가 된다.