yoursyun
CentOS7에서 Docker 로 Jenkins 서비스 등록 ( gradle, github 이용 ) 본문
CentOS7에서 Docker 로 Jenkins 서비스 등록 ( gradle, github 이용 )
yoursyun 2020. 12. 2. 13:51설치 전 docker, docker-compose 가 설치되어 있어야 합니다.
Dockerfile
FROM jenkins:latest
MAINTAINER kei < kei@gmail.com >
ENV JENKINS_OPTS --httpPort=18080
ENV JENKINS_SLAVE_AGENT_PORT 50001
EXPOSE 18080 50001
USER root
RUN apt-get update && apt-get -y install vim
docker-compose.yml
# docker-compose compile version
version: '3.1'
# docker container == service
services:
jenkins: # service name
container_name: jenkins
image: jenkins:latest # using docker image
restart: always
ports:
- 18080:18080
- 50001:50001
privileged: true
volumes:
- /docker/jenkins/jenkins_home:/var/jenkins_home
user: root
* 참고 - 데비안 locale 설정 :
gpt-get install –y locales
dpkg-reconfigure locales
한글 ko_KR, UTF-8 선텍
기본 locale 선택
기본 locale 확인 cat /etc/default/locale
위 두개 파일 실행후, localhost:18080 에서
의 화면이 보이면 정상 설치 된 것입니다.
* 참고 – 외부방화벽오픈
firewall-cmd --zone=public --permanent --add-port=18080/tcp
filewall-cmd --reload
Unlock을 위해 위 화면의 위치로 이동하여 입력합니다.
[root@pororicom jenkins]# vi jenkins_home/secrets/initialAdminPassword
이후 설치를 위해 기본 플러그인 설치로 진행합니다. ( 2.249.3 버전은 GitHub 포함되어 있음 )
플러그인 설치에 오류가 있는경우, docker의 jenkins 버전이 낮은 경우임으로, ( 도커 이미지의 젠킨스는 버전이 낮습니다. 2020.12 기준 ) : [root@pororicom jenkins]# docker logs jenkins 로 확인한다.
가장 최신 버전의 jenkins 버전으로 교체 합니다.
[root@pororicom jenkins]# docker exec -it -u 0 jenkins bash #관리자권한으로 컨테이너에 들어갑니다.
최신버전다운로드
root@bd0437f5e3b8:/# wget http://updates.jenkins-ci.org/download/war/2.249.3/jenkins.war
덮어쓰기
root@bd0437f5e3b8:/# mv ./jenkins.war /usr/share/jenkins
실행권한변경
root@bd0437f5e3b8:/# chown jenkins:jenkins /usr/share/jenkins/jenkins.war
도커 재실행
[root@pororicom jenkins]# docker restart jenkins
설치이후 관리자 계정을 만든다.
배포하고자하는 서버의 SSH 연결을 위해 플러그인을 설치되었는지 확인한다.
기본 2.249.3 버전은 플러그인 조회가 되질 않았다. https://updates.jenkins.io/download/plugins/publish-over-ssh/
을 통해 플러그인 업데이트 파일을 다운로드 받고 수동 설치를 진행하였다.
위 플러그인 설치 후, Jenkins 관리 > 시스템 설정에 아래와 같이 입력하여 서버와의 연결을 등록해준다.
연결설정을 완료후에 “새로운Item” 메뉴 에서 Freestyle project로 생성한다.
빌드 배포 프로젝트명을 demo 로 정했다. demo 작업 진행중에 나갔다면 메뉴 구성에서 다시 확인 할 수 있다.
젠킨스를이용한 Git Hub > Jar or War 배포가 목표이므로, 아래와 같이 구성한다.
Credentials 을 이용하여, 인증정보등을 작성한다. 여기서 Branch Specifier 는 빌드할 브렌치명을 작성해준다. ( 개발 데모용 으로 작성함 ) , Add를 눌러 아래와 같이 Git 인증정보를 입력한다.
Build
이중 Invoke Gradle script 와 Send files or execute commands over SSH 를 이용한다.
Invoke Gradle script
Jenkins 통합환경설정에서 Global Tools Configuration 에서 Gradle을 다운받아 사용가능하다.
하지만 스프링부트 프로젝트에서 Git에 push 시에 Gradle.wrapper 를 올렸다면 따로 설정할 필요없이 사용이 가능하다.
-x test : 테스트에 대해 빌드를 하지않는다.
Build 명령시 테스트도 빌드하고자 한다면 build.gradle 에 test { useJUnitPlatform() } 이 추가 되어있어야한다.
Make gradlew executable : 체크하지 않으면 permission 오류 발생합니다.
아래는 빌드된 jar 파일을 배포대상서버로 전송하는 설정 화면이다.
Source files : build/libs/*.jar
Jenkins 의 workspace 기준으로 git에서 pull 가져온 Springboot앱의 루트경로이다.
보통 build/libs 안에 들어가 있다.
Remote Directory : /webapp/demo
원격 서버의 디렉터리이다. 원격서버의 SSH 로 설정한 폴더 기준으로 작성한다.
현재 Jenkins관리 > 시스템설정 > publish over SSH ( 배포기준서버 ) > Remote Directory : /webapp
아래 와 같이 /webapp/demo 로 jar 파일을 배포할 위치를 설정 해주었으며, 서버에도 해당 directory가 존재해야한다.
배포대상서버 구조
[root@pororicom /]# tree webapp
webapp
├── demo
│ └── init_server.sh
└── orgsrv
Exec command : 파일전송후 실행할 명령어를 입력한다.
Init_server.sh
echo "demo application 의 구동중인 pid 확인 중"
CURRENT_PID=$(ps -ef | grep java | grep demo* | awk '{print $2}')
echo "$CURRENT_PID"
if [ -z $CURRENT_PID ]; then
echo "demo application 의 구동이 확인되지 않습니다."
else
echo "> kill -9 $CURRENT_PID" kill -9 $CURRENT_PID
sleep 10
fi
echo "구동중인 demo application 을 종료하였으며, 배포를 진행합니다."
nohup java -jar /webapp/demo/demo-0.0.1-SNAPSHOT.war >> /webapp/demo/logs/demo.log &
* 참고 nohup “no hangups”으로 터미널이 종료되어도 실행은 멈추지 않는다. & : 백그라운드 실행을 의미
Jar 파일 배포를 하려 했으나, 개발소스가 JSP를 지원 해야 하므로 war 파일로 배포 되도록 변경되어 있습니다.
이후 해당 빌드 프로젝트에 들어가서 “Build Now” 버튼으로 빌드 및 배포까지 정상적으로 이뤄지는지 확인합니다. 오류가 발생하는 등의 문제는 오류 정보를 자세히 확인하여 처리 해야합니다.