git repository에 있는 spring boot project를 Jenkins를 사용해
자동으로 개발서버에 빌드 및 도커 컨테이너로 배포하는 일기다.
젠킨스 > Jenkins 관리 > 플러그인 관리
docker를 사용하여 컨테이너를 띄울 예정이니 docker 관련 플러그인을 설치해주자.
Jenkins에서 파이프라인을 만들어보자
새로운 Item을 생성한다.
'Pipeline', 배관 아이템을 선택한다. 아이템 이름은 필수값이다.
SCM을 Git으로 선택 후, GitHub의 Repository를 선택해준다.
Credentials에서는 여기서 생성한 Credential을 넣으면 된다.
Branches to build에는 master브랜치를 입력해준다.
개발 branch를 따로 지정해주고 싶다면 그렇게 해도 된다.
Script Path에는 레파지토리에 사전 작성할 파이프라인 스크립트의 파일명을 입력해주면 된다.
그리고 레파지토레에 Script Path에 해당하는 경로에 Script파일을 작성하면 된다.
나는 다음과 같이 작성했다.
pipeline {
agent none
//기본적으로 체크아웃을 하지 않는 옵션
options { skipDefaultCheckout(true) }
stages {
stage('Checkout repository') {
agent any
steps {
checkout scm
}
}
stage('Build and test') {
agent {
docker {
image 'gradle:6.6.1-jdk11-openj9'
args '-v /root/.m2:/root/.m2'
}
}
steps {
sh 'gradle clean build -x test'
}
}
stage('Docker build') {
agent any
steps {
sh 'docker build -t {container_name}:latest .'
}
}
stage('Docker run') {
agent any
steps {
sh 'docker ps -f name={container_name} -q | xargs --no-run-if-empty docker container stop'
sh 'docker container ls -a -fname=sbor_dev -q | xargs -r docker container rm'
sh 'docker images --no-trunc --all --quiet --filter="dangling=true" | xargs --no-run-if-empty docker rmi'
sh 'docker run -d --name {container_name} -p 8080:8080 {container_name}:latest'
}
}
}
}
Checkout repository에서 레파지토리 내용을 checkout받고
Build and test에서 gradle을 docker agent로 실행해 소스를 build한다.
Docker build에서 도커 이미지를 빌드하고
Docker run에서 기존 컨테이너와 이미지를 지우고 새로운 컨테이너를 실행한다.
도커 build stage에서 사용할 Dockerfile은 다음과 같이 작성했다.
FROM openjdk:11
ADD {your_application_file} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
open jdk 이미지의 정보는 https://hub.docker.com/_/openjdk 여기서 확인할 수 있으며 컨테이너와 파일교환을 위해 volume을 따로 설정해줘도 좋다.
이제 젠킨스에서 PIPELINE 실행을 통해 GitHub 레파지토리의 파일을 체크아웃받아 gradle로 빌드를 하고 OpenJDK11버전 이미지를 통해 SpringBoot Application을 컨테이너로 실행 할 수 있다.
[Trouble Shooting]
Jenkins
Invalid agent type "docker" specified.
Jenkins에서 docker 관련 플러그인이 없을 경우. 관련 플러그인 설치로 해결.
container 내부 docker 설치
/var/jenkins_home/workspace/{depends on you}/script.sh: docker: not found
컨테이너 내부에 docker가 설치되어있지 않음을 간과한경우.
도커가 설치되어 있는 컨테이너를 사용해야 한다.
curl -fsSL https://get.docker.com/ | sudo sh
Jenkins docker container
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/amd64/gradle:6.6.1-jdk11-openj9/json: dial unix /var/run/docker.sock: connect: permission denied
컨테이너에서 docker.sock에 대한 실행권한이 없다. 컨테이너에서 구동되는 jenkins는 jenkins라는 user권한을 사용하기 때문에 docker그룹에 추가해주자.
컨테이너의 root권한 bash를 열어준 뒤 그룹에 추가하면 된다.
이후 도커 데몬을 재기동 해주자.
usermod -aG docker jenkins
service docker restart
docker rmi
docker: "rmi" requires a minimum of 1 argument.
docker rmi 명령어가 삭제할 이미지가 없는 경우다.
docker rmi $(docker images --filter "dangling=true" -q --no-trunc)
위와 같이 잉여 이미지를 정리하는 명령어를 사용 할 때, 이미지가 하나도 없는 깨끗한 상태라면 바로 에러를 뿜게 된다.
따라서 다음과 같이 --no-run-if-empty를 사용하자
docker images --no-trunc --all --quiet --filter="dangling=true" | xargs --no-run-if-empty docker rmi
참조: stackoverflow.com/questions/35416962/error-while-cleaning-images-from-docker
작성 참조 링크
tomgregory.com/building-a-spring-boot-application-in-docker-and-jenkins/
'Application > Jenkins' 카테고리의 다른 글
젠킨스로 React 프로젝트 node빌드 및 nginX 컨테이너로 실행하기 (0) | 2021.01.13 |
---|---|
Jenkins와 Github 연동하기 (0) | 2021.01.12 |
Ubuntu 18.04에서 Docker를 사용해 Jenkins 띄우기 (0) | 2021.01.04 |