본문 바로가기

IT

젠킨스(jenkins)로 스프링부트 자동화 2(도커, DB 설치, 빌드)

728x90

jenkins_1에서 도커를 설치하여 HOST OS의 도커명령어를 사용할 수 있도록 한다. 

jenkins_1 bash 도커 설치

apt-get update -y
apt-get install -y ca-certificates curl gnupg lsb-release
mkdir -p /etc/apt/keyrings
rm /etc/apt/keyrings/docker.gpg
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
apt-get install -y docker-ce docker-ce-cli docker-compose-plugin
exit

프로젝트에서 DB도 사용하기 때문에 설치를 진행한다.

MariaDB 최신 이미지 실행

docker run \
  --name mariadb_1 \
  -d \
  --restart unless-stopped \
  -e MARIADB_ROOT_PASSWORD=lldj123414 \
  -e TZ=Asia/Seoul \
  -p 3306:3306 \
  -v /docker_projects/mariadb_1/conf.d:/etc/mysql/conf.d \
  -v /docker_projects/mariadb_1/mysql:/var/lib/mysql \
  -v /docker_projects/mariadb_1/run/mysqld:/run/mysqld/ \
  mariadb:latest

보안설정

  • docker exec -it mariadb_1 /usr/bin/mariadb-secure-installation
    • Switch to unix_socket authentication [Y/n] n
    • Change the root password? [Y/n] n
    • 나머지 Y

마스터계정 생성 및 DB 생성

  • docker exec -it mariadb_1 mysql -u root -p
  • GRANT ALL PRIVILEGES ON *.* TO lldj@'%' IDENTIFIED BY 'lldj123414';
  • GRANT ALL PRIVILEGES ON *.* TO lldjlocal@127.0.0.1 IDENTIFIED BY '1234';
  • GRANT ALL PRIVILEGES ON *.* TO lldjlocal@'172.17.%.%' IDENTIFIED BY '1234';
CREATE DATABASE nginx;
CREATE DATABASE app20220916_2__test;
CREATE DATABASE app20220916_2;

USE app20220916_2;

CREATE TABLE `article` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `subject` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

insert  into `article`(`id`,`subject`) values 
(1,'제목1'),
(2,'제목2');

git 설치

  • sudo yum install git -y

java-17-openjdk 설치

  • sudo yum install java-17-openjdk -y
  • sudo yum install java-17-openjdk-devel -y

프로젝트 구성 및 빌드

빌드 성공

현재 실행중인 컨테이너 중지 및 삭제

  • docker stop sbdb_1
    • 안되면 : docker kill sbdb_1
  • docker rm -f sbdb_1

새 sbdb 이미지 만들기 ("프로젝트에 도커파일이 존재")

  • git pull origin master ("git clone으로 받았다면 스킵"
  • 그래드 빌드
  • docker build -t sbdb .

sbdb 이미지 실행

docker run \
  --name=sbdb_1 \
  -p 8080:8080 \
  -v /docker_projects/sbdb_1/volumes/gen:/gen \
  --restart unless-stopped \
  -e TZ=Asia/Seoul \
  -d \
  sbdb

실행 결과

실행 결과

이 방법은 jenkins가 아닌 수동으로 리눅스 서버에서 프로젝트를 받고 DB를 설치하고 빌드한 결과이다. 이 방법 이외에도 ./gradle bootBuildImage로 한번에 간단하게 하는 방법도 존재한다. 자세한 과정은 https://sh970901.tistory.com/62에 기록하였다.하지만 우리가 원하는건 jenkins를 활용하여 빌드를 자동화하는 것이다.  

 

jenkins에 프로젝트를 생성

hook trigger 체크

접속 후 해당 폴더로 이동

  • docker exec -it jenkins_1 bash
  • cd /var/jenkins_home/workspace/sbdb_1 => 이전에 만들었던 젠킨스 설정 참고

JAVA_HOME 환경변수 변경

  • export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64

그래들 빌드

  • chmod 744 ./gradlew
  • ./gradlew clean build

실패원인

  • jenkins_1 안에서는 127.0.0.1 으로 DB서버를 찾을 수 없다. 127.0.0.1은 젠킨스 본인 자신을 말한다. 이전에 수동으로 성공했던 이유는 리눅스에서는 127.0.0.1에  3306포트가 Mariadb의 3306과 포트포워딩으로 DB연결이 되었지만 지금 젠킨스에서 빌드할 때는 127.0.0.1로 실행해서는 DB를 찾을 수 없어 안된다.

build 실패

application.yml에 DB 설정 url을 변경하였다.

환경 변수 값 추가

이렇게 되면 testDbIp값이 존재하지 않을 때만 127.0.0.1의 주소를 사용하게 된다. 

다시 젠킨스로 돌아와서 빌드버튼을 누르면 (수동) 값이 변경 됨을 확인 할 수 있다.

환경 변수 값

재 실행

  • testDbIp=172.17.0.1 (안되면 vim(vi)을 설치하고(apt-get install) 값을 바꿔주고 빌드를 다시해보자)
  • ./gradlew clean build

빌드 실패

버전으로 인한 빌드 실패 에러메시지가 출력되었다. => export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64

빌드 성공