1. 개요

전체적인 흐름입니다.
Jenkins를 Docker 컨테이너로 실행하고 Github에서 소스 코드를 받아 Spring 서버에 빌드하고 배포하는 구조입니다.
빌드 환경 버전은 다음과 같습니다.
스프링 커프스 – 2.7.5
자바-11
Jenkins와 Spring Server의 Java 버전은 동일한 버전으로 설정되어야 합니다.
Jenkins를 설치하면 기본값은 Java11입니다. 따라서 이 버전을 사용 중이었고 다른 버전이 필요한 경우 Jenkins의 Java 버전을 변경해야 합니다.
여기서는 webhook으로 Github에 커밋할 때 Jenkins를 자동으로 실행하는 기능을 포함하지 않습니다.
2. 도커 설치
Docker: 가속화되고 컨테이너화된 애플리케이션 개발
Docker: 가속화되고 컨테이너화된 애플리케이션 개발
Docker는 개발자가 최신 애플리케이션을 빌드, 공유 및 실행할 수 있도록 설계된 플랫폼입니다. 코드에 집중할 수 있도록 지루한 설정을 처리합니다.
www.docker.com
운영체제에 따라 docker 홈페이지나 apt-get, yum 등을 이용하여 docker를 설치할 수 있습니다.
3. Jenkins 컨테이너 설치
docker pull jenkins/jenkins:lts
위의 명령을 사용하여 최신 버전의 Jenkins 이미지를 다운로드합니다.

docker images 명령을 사용하여 설치가 성공했는지 확인하십시오.
docker run --name jenkins-docker -d -p 8080:8080 -p 50000:50000 -v C:\Users\User-4T\Desktop\jenkins_test\jenkins:/var/jenkins_home -u root jenkins/jenkins:lts
위의 명령을 입력하여 이미지를 컨테이너에 로드합니다.
–name: 컨테이너 이름 설정
-d: 백그라운드에서 실행
-p: 컨테이너 및 호스트 포트 매핑
-v: 마운트 폴더(호스트 폴더: 컨테이너 폴더)
로드되면 localhost:8080에 접속하여 기본 설치를 진행합니다.

첫 번째 비밀번호는 ‘도커 로그 jenkins-docker 명령어를 통해 확인할 수 있습니다.

로그인 후 추천 플러그인 설치를 클릭하여 설치합니다.
예상보다 시간이 조금 더 걸리므로 인내심을 가지고 기다려 주십시오.

관리 사용자 계정을 추가합니다.

Public over SSH 플러그인을 설치합니다.

4. Spring Boot Server 컨테이너 설치
Spring Boot를 실행할 서버 컨테이너를 설치합니다.
다음 Dockerfile을 만듭니다.
파일 이름의 D는 대문자여야 합니다.
FROM ubuntu:20.04
# default user
ENV USER serve
# packages install
RUN apt-get update && apt-get upgrade -y
RUN apt-get install -y sudo vim net-tools ssh openssh-server openjdk-11-jdk-headless
# Access Option
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed -i 's/UsePAM yes/#UserPAM yes/g' /etc/ssh/sshd_config
#user add & set
RUN groupadd -g 999 $USER
RUN useradd -m -r -u 999 -g $USER $USER
RUN sed -ri '20a'$USER' ALL=(ALL) NOPASSWD:ALL' /etc/sudoers
#set root & user passwd
RUN echo 'root:root' | chpasswd
RUN echo $USER':serve123' | chpasswd
# java 환경변수
ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
ENTRYPOINT sudo service ssh restart && bash
USER $USER
계정을 serve로 설정하고 비밀번호를 serve123으로 설정합니다.
개발 상황에 따라 변경할 수 있습니다.
그런 다음 Dockerfile이 있는 폴더에서 다음 명령을 실행하여 이미지를 빌드합니다.
마지막 마침표(.)를 입력해야 합니다. 그런 다음 해당 폴더에서 Dockerfile을 찾아 빌드합니다.
docker build -t service-server .
그런 다음 이미지를 컨테이너에 로드합니다.
docker run --name spring-server -itd -p 9000:9000 -p 9022:22 service-server:latest
포트 9000을 열고 포트 9022를 포트 22에 연결합니다.
포트 9022는 Jenkins와의 SSH 연결용입니다.
그런 다음 Spring-Sever의 터미널에 접속하여 두 개의 폴더를 생성합니다.
cd /home/serve
mkdir spring_project
cd spring_project
mkdir logs
mkdir target
그리고 apt로 lsof를 설치합니다.
터미널에 연결하면 서비스 계정이기 때문에 sudo 명령이 작동하지 않습니다.
다음 명령으로 lsof를 설치하기 위해 연결합니다.
docker exec -it spring-server /bin/bash
접속 후
sudo apt update
sudo apt install lsof
5. github, jenkins ssh 키 등록
Jenkins 터미널에 액세스하는 방법에는 여러 가지가 있습니다.
Windows에서는 Docker 프로그램을 사용하여 액세스할 수 있습니다.

또는 다음 명령으로 액세스할 수 있습니다.
docker exec -it jenkins-docker /bin/bash
호스트 PC나 컨테이너 터미널에서 진행할 수 있으나 이전에 마운트한 경로를 확인 후 진행하시기 바랍니다.
터미널에 직접 연결해서 진행했습니다.
cd /var/jenkins_home
mkdir .ssh
chmod 700 .ssh
ssh-keygen -t rsa
아래와 같이 폴더 지정
Enter file in which to save the key (/root/.ssh/id_rsa): /home/jenkins/.ssh/id_rsa

생성된 파일 간에 id_rsa.pub 값을 복사합니다.

6. GitHub에 Jenkins SSH 키 등록

github의 설정으로 이동하십시오.

새 ssh 키를 입력합니다.

복사한 pub 파일의 내용을 붙여넣습니다.
7. 스프링 서버에 Jenkins SSH 키 등록
Spring 서버에 Jenkins pub 파일의 내용을 등록합니다.
cd ~
mkdir .ssh
vi ~/.ssh/authorized_keys
이후 jenkins의 pub 파일 내용 입력
8. jenkins에 대한 서비스 서버의 SSH 액세스 구성
Jenkins에서 Jenkins 관리 -> 시스템 설정으로 이동합니다.
ssh를 통해 공개 추가를 클릭하고 나타나는 ssh 서버에서 고급을 클릭하고 다음을 입력합니다.

서비스 서버에서 이전에 설정한 값을 입력하기만 하면 됩니다.
hostname의 경우 로컬 환경이라도 localhost가 아닌 할당된 IP를 입력해야 합니다.

입력한 후 아래의 테스트 구성을 클릭하여 성공 문구가 표시되는지 확인하고 저장합니다.
9. Jenkins에 GitHub 리포지토리 추가

github에서 ssh 주소를 확인하십시오.

Jenkins 대시보드에서 새 항목을 클릭합니다.

적절한 이름을 지정하고 자유형 프로젝트로 생성합니다.

다음 설정에서 Source control -> Git check -> github의 ssh 주소를 입력하면 오류가 발생합니다.
ssh 키를 등록해야 합니다.

추가 버튼을 클릭한 다음 Jenkins를 클릭합니다.

개인 키가 있는 ssh 사용자 이름으로 유형을 변경하고 개인 키에서 직접 입력을 활성화합니다.
그런 다음 ssh-keygen으로 생성한 id_rsa 파일의 전체 내용을 Jenkins 터미널에 붙여넣습니다.

방금 생성한 자격 증명을 설정해도 빨간색 오류가 사라지지 않는 경우가 있을 수 있습니다.

이 경우 Jenkins 터미널 오류의 첫 번째 줄에서 git ls-remote ~ 명령을 실행하면 됩니다.
중간에 yes를 입력해야 합니다.
그런 다음 자격 증명을 -없음-으로 선택하고 생성한 자격 증명을 다시 클릭하면 오류가 수정됩니다.

고급을 클릭하고 위와 같이 설정합니다.
참조 사양: +refs/pull/*:refs/remotes/origin/pr/*

빌드 단계에서 Invoke Gradle Script를 클릭하고 다음과 같이 설정합니다.

빌드 단계에서 파일 보내기 또는 ssh를 통해 명령 실행을 클릭하여 빌드 후 파일을 Spring 서버로 보내고 빌드 후 배포 작업을 설정합니다.

실행 명령어는 JAR 파일이 빌드된 후 Spring 서버로 전송된 후 실행되는 명령어를 말한다.
아래와 같이 작성합니다.
echo "kill previous process..."
# 9000 포트를 검색하여 프로세스 종료
kill -9 $(lsof -t -i :9000)
sleep 10
echo "deploy spring boot project..."
# demo-0.0.1-SNAPSHO.jar 파일의 경우 각자 셋팅한 파일명이 다르기 때문에 확인 필요
nohup java -jar /home/serve/spring_project/target/demo-0.0.1-SNAPSHOT.jar >> /home/serve/spring_project/logs/jenkins_test_spring.log 1>/dev/null 2>&1 &
echo "Done"
저장한 후 생성하고 배포가 성공했는지 확인합니다.
오류가 발생하면 jenkins 및 spring-server 로그를 확인하여 수정하십시오.
※ Jenkins 로그에 시간 초과 오류가 발생하면 파일 보내기 또는 ssh를 통해 명령 실행에서 고급 버튼을 클릭하여 실행 시간 초과 값을 0(무한대)으로 변경하십시오.

녹색 아이콘이 표시되면 빌드 및 배포가 완료된 것이므로 API를 호출하여 확인합니다.
