젠킨스 인스턴스, 젠킨스가 SSH로 접속할 worker 인스턴스 서버를 설치, 환경을 구성해야 한다.
이 블로그에서 jenkins 설치부분을 참조하길 바란다.
https://velog.io/@mooh2jj/젠킨스-자동배포하기
자 설치와 젠킨스 인스턴스, worker 인스턴스 서버(class101 backend
)를 구성했다면, 이제. 젠킨스 프로젝트 구성해보자.
새로운 Item > 프로젝트명 docker-jenkins-github-test
으로.
Freestyle project
로 해놓았다.
소스코드관리 > Git
Repositroy URL -> 배포할 프로젝트 URL 이름을 입력한다.
Freestyle project Build 방법에 2가지를 소재하겠습니다.
1) Excute Shell (추천)
Add build step -> Excute Shell
선택
Command에 다음과 같이 입력한다.
chmod +x gradlew
./gradlew clean build
2) Invoke Gradle script
& Use Gradle Wrapper
Add build step -> Invoke Gradle script
를 선택 -> Use Gradle Wrapper
Invoke Gradle을 선택할 경우 Jenkins에 Global Toll Configuration에서 Gradle 패키지를 설치해야 사용할 수 있습니다.
Use Gradle Wrapper
의 경우 Gradle을 설치할 필요가 없다.
Make gradlew executable
도 체크해준다. 체크하면 권한 문제로 실행이 안 되는 상황을 방지할 수 있다.
Tasks에 clean build
를 입력하면 Build 정의는 한차례 완료된 것이게 됩니다.
그다음 Build Now 해서 제대로 실행되는 지 확인.
Build > Send files or excute commands over SSH
여기선 Transfers에서 실질적으로 빌드한 파일을 Service Server(SSH 서버)로 보내고 배포하는 행위를 정의하는 것이다.
SSH Server
: publish over SSH
폼화면에 등록한 서버 Name : 추가한 SSH Server의 이름이 리스트 형태로 나타난 걸 선택.
- Source files :
build/libs/*jar
로 정의한다.- Remove prefix :
build/libs
- Remote directory :
/service_server/target
Build Server의 Jenkins 계정의 루트 경로는 /var/lib/jenkins다.
Jenkins에서 Gradle Build를 하게 될 경우 /var/lib/jenkins/build/libs 에 jar 파일이 위치하게 되므로
Remote directory는 파일을 전송받는 Service Server의 경로를 의미한다.
SSH 접속 루트를 /home/ubuntu로 되어있으므로 결과적으로 Remote directory는
/home/ubuntu/service_server/target
이 될 것이다.
Service Server에서 미리 service_server/target 디렉터리를 생성해 주자.
또한 프로젝트 구동 시의 로그 파일을 저장하기 위한 logs 디렉터리도 함께 만들어주자.
# Service Server
mkdir -p ~/service_server/target
mkdir -p ~/service_server/logs
이제 Exec command
를 작성해주어야 한다.
이곳에는 빌드가 완료되어 jar파일이 Service Server에 전달되고 난 후 실행되는 스크립트를 작성하는 곳이다.
스크립트를 직접 작성해도 되고 .sh파일을 미리 준비했다 그것을 실행하는 형태로 해도 무방하다.
본 예제에서는 스크립트 구문을 직접 입력하는 방식으로 진행한다.
아래의 스크립트를 Exec commands에 입력한다.
echo "PID Check..."
CURRENT_PID=$(ps -ef | grep java | grep gradle-springboot-test* | awk '{print $2}')
echo "Running PID: {$CURRENT_PID}"
if "$CURRENT_PID" [ -z CURRENT_PID ] ; then
echo "Project is not running"
else
kill -9 $CURRENT_PID
sleep 10
fi
echo "Deploy Project...."
nohup java -jar /home/ubuntu/service_server/target/gradle-springboot-test-0.0.1-SNAPSHOT.jar >> /home/ubuntu/service_server/logs/gradle-springboot-test.log &
echo "Done"
💥주의) 여기서 jar 파일 이름은 프로젝트명과 다를 수 있으니 잘 확인하고 기입하자!
난 달라서 배포된 jar 이름 확인하고 기입했다.
실제 배포도 잘 됐고 브라우저 확인을 잘 실해된 것도 확인됐다.
Unstable 상태 오류
해결방법출처: https://oingdaddy.tistory.com/189 [SI Supply Depot]
Build Now를 하고 콘솔 출력을 보니 Build Success가 나왔다. 하지만 잠시 Unstable 상태 오류
는 난다...
SSH: Disconnecting configuration [batch_001] ...
ERROR: Exception when publishing, exception message [Exec timed out or was interrupted after 213,127 ms]
Build step 'Send files or execute commands over SSH' changed build result to UNSTABLE
결론은 timeout 관련된 오류
다.
Jenkins는 스케쥴러 역할을 하는 녀석으로 B라는 서버에 올라가 있고 A라는 서버에는 Batch instance가 올라가있다. 이 B가 A한테 ssh를 사용해 "batch 수행해!" 라고 명령했고 A는 열심히 일을 했는데 B는 결과를 기다리다가 timeout이 난 것이다.
해결책은 간단하다. 명령을 날리는 Jenkins(B)가 충분한 시간동안 기다려줄수 있도록 timeout 옵션을 변경해주면 된다.
Exec timeout (ms) -> 0(무한시간)으로 바꿔준다.
저장하고 Build Now를 하니 정상적으로 작동되는 것을 확인할 수 있다.