Infra/Jenkins

[Jenkins] Docker 환경에서 git 배포 (springboot - jar)

당닝 2021. 11. 30. 13:04
728x90

※ 깃허브를 이용하지 않고, 도커에 만들어둔 깃 서버로부터 배포 자동화할 것이다.

 

1. 깃 서버 컨테이너 구축

 

[Docker] CentOS 깃 서버(Git Server) 컨테이너 구축하기

다른 컨테이너의 작업물을 깃 서버 컨테이너에 올릴 수 있도록 할 것이다 [CentOS] Linux Git Server 구축하기 목차 1. Git 설치 2. 저장소 생성 3. 계정 생성 4. git 서버로 키 등록 5. 테스트 1. Git 설치 yum i.

da2uns2.tistory.com

 

 

 

 

2. 젠킨스 컨테이너 구축

docker run -d --privileged -p 8091:8080 -u root --name myjenk jenkins/jenkins:lts

jenkins/jenkins:lts 이미지를 통해 쉽게 구축하면 된다.

 

 --privileged 옵션 추가

-u root 옵션 추가

포트번호 _____:8080

 

 

3. 젠킨스 - Publish Over SSH 플러그인 설치

보통은, Jenkins 관리 > Plugin Manager > 설치 가능 에서 ssh를 검색해 Publish Over SSH 설치를 진행하면 된다.

 

하지만 나는 폐쇄망 환경이므로 아래 글의 방법으로 설치했다.

 

[Jenkins] 폐쇄망 환경에서 수동으로 플러그인 설치하기(Offline)

젠킨스 초기 설정 시, 보통 기본 플러그인들이 자동으로 설치된다. 하지만, 외부와 통신이 불가능한 폐쇄망 환경에서는 필요한 플러그인들을 수동으로 설치해줘야 한다. 순서는 다음과 같다. 1.

da2uns2.tistory.com

 

Some plugins could not be loaded due to unsatisfied dependencies. 
Fix these issues and restart Jenkins to re-enable these plugins.

Dependency errors:
  Publish Over SSH (1.22)
  	Plugin is missing: publish-over (0.22)

만약 다음 에러가 발생했다면, publish-over 플러그인도 설치한다.

 

 

 

4. SSH 키 등록

ssh-keygen -t rsa

젠킨스 환경에서 ssh 키를 생성한다.

 

vi authorized_keys

이후, 깃 서버의 .ssh 디렉토리에서 authorized_keys 파일을 생성해, 젠킨스 환경의 id_ras.pub 파일을 복사한다.

파일 자체를 복사하든, 파일 내용을 복붙하든 편한 방법으로 진행하면 된다.

 

 

 

5. Service Server 세팅

docker run --privileged -d -p 8083:8083 --name myservice centos:7 init
docker exec -it myservice bash

서비스 서버 컨테이너를 생성 후 실행한다.

--privileged를 꼭 붙여줘야 한다.

 

yum install net-tools
yum install openssh-server

ssh 포트 (22번 포트)를 열어주기 위해 openssh-server를 설치하고, 네트워크 상태를 확인하기 위해 net-tools를 설치한다.

 

systemctl start sshd
systemctl status sshd

ssh를 실행시키고 상태를 확인한다.

 

netstat -ntl

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp6       0      0 :::22                   :::*                    LISTEN

netstat -ntl을 통해 네트워크 상태를 확인한다. 다음과 같이 22번 포트가 열렸다면 성공이다.

 

vi /etc/ssh/sshd_config

PermitRootLogin을 찾아 주석을 해제하고 yes로 바꿔준다. >> PermitRootLogin yes

 

yum list java*jdk-devel
yum install java-11-openjdk-devel.x86_64

설치가능한 jdk 버전을 확인 후, 설치한다.

 

useradd parkdaeun
passwd parkdaeun

현재 root 계정으로 되어있다면, 유저 계정을 생성하고 비밀번호도 설정해준다.

 

su parkdaeun
mkdir ~/.ssh

유저계정으로 변경후, .ssh 디렉토리를 생성한다.

 

cd ~/.ssh
vi authorized_keys

깃 서버의 id_rsa.pub을 authorized_keys에 복사한다.

 

chmod 700 ~/.ssh 
chmod 600 ~/.ssh/authorized_keys

ssh 디렉토리와 authorized_keys의 권한을 각각 700, 600으로 설정한다.

만약 설정하지 않는다면, jenkins에서 인증이 불가하다.

 

 

 

6. Jenkins에 Service Server SSH 접근 설정

Jenkins 관리 > 시스템 설정의 하단 부분에서 Publish over SSH를 찾는다.

 

SSH Servers의 추가 버튼을 누를다.

 

Name, Hostname, Username, Remote Directory, Passphrase/Password를 설정할 것이다.

 

  • Name: 서버의 이름을 설정한다. (본인이 식별할 수 있는 아무 이름으로 지정해도 무방함)
  • Hostname: Service Server의 IP 주소를 입력한다. (Service Server에서 hostname -i 명령어로 알아내기)
  • Username: 위에서 설정한 Service Server의 Username을 입력한다.
  • Remote Directory: 배포할 서버의 기본 workspace라 보면 된다. 파일 전송 시 디렉토리를 정하지 않으면 이 곳으로 가게 된다.
  • Passphrase/Password: 위에서 설정한 Service Server User의 Password를 입력한다.

 

Test Configuration을 클릭했을 때 다음과 같이 Success가 뜬다면 성공이다.

 

 

 

7. Jenkins 프로젝트 추가

새로운 Item을 클릭한다.

 

프로젝트 이름을 입력하고 Freestyle project를 클릭 후 좌측 하단의 OK를 누른다.

 

소스 코드 관리 탭에서 Git을 선택한다.

Repository URL의 깃 서버의 주소를 입력한다. (ssh://깃서버계정@깃서버IP:프로젝트경로)

ex) ssh://root@172.22.0.2:/opt/git/project.git >> git clone 시 사용하는 주소!

 

이후, Credentials의 Add를 눌러 Jenkins로 설정한다.

※ Username: 식별 이름, ID: git 서버 유저명, Password: git 서버 유저 비밀번호

 

 

근데 128 오류가 발생했다.

code 128: stdout: 
stderr: Host key verification failed. 
fatal: Could not read from remote repository.

1. ssh 제대로 설정했는지 확인, 깃서버 주소 확인, Credentials 확인

 

2. 같은 네트워크로 연결되어있는지 확인 (도커 네트워크)

 

3. 현재 연결 상황 확인하기

systemctl status sshd

jenkins 컨테이너에서 명령어 실행

 

Connection closed by 172.22.0.5 port 56958 [preauth]

다음과 같이 뜬다면, 통신은 되지만 어떠한 이유로 인해 연결이 막힌 것임.

따라서 3번을 시도해보았다.

 

4. jenkins 서버 컨테이너에서 git clone ssh://깃서버계정@깃서버IP:프로젝트경로 해보기.

혹시 중간에 Are you sure you want to continue connecting (yes/no/[fingerprint])?이 뜬다면 이 때문일 가능성도 있다.

ssh도 최소 10번은 확인했고,, 이를 임시로 막는다면 보안상 좋지 않을지는 잘 모르겠다.

 

[Linux / Mac] SSH 접근시 "Are you sure you want to continue connecting (yes/no)?" 없이 접근하기 (tistory.com)

이 방법을 사용해보았지만 계속 Are you sure you want to continue connecting (yes/no/[fingerprint])?가 떴다.

 

jenkins 컨테이너에서 yes라 입력해 벗어나고, 두번째 clone 부터는 위 문구가 뜨지 않는다.

이후, 다시 페이지로 돌아와 Repository URL을 입력했더니 128 오류가 사라졌다!

 

 

 

Build 탭에서 Invoke Gradle script를 누른다. 아래 (1), (2) 중 택해서 진행하면 된다.

 

1) Use Gradle Wrapper

Use Gradle Wrapper을 클릭하고, Make gradlew executable을 체크한다.

Tasks에 clean build를 입력한다.

 

2) Invoke Gradle

1번 보다는 번거로운 방법이다. 하지만, 난 1번에 실패해 2번으로 진행하였다.

 

Invoke Gradle을 체크한다.

 

Invoke Gradle을 택하기 위해선 설정해야할 것이 있다.

Jenkins 관리 > 플러그인 관리 에서 Gradle 설치

 

 

 

Add build step을 한번 더 누르고, Send files or execute commands over SSH를 클릭한다.

 

Service Server와 관련해 설정하는 곳이다.

  • Name: Service Server을 식별할 수 있는 이름을 설정한다.
  • Source files: jenkins 서버에서의 jar 파일의 위치
  • Remote directory: service 서버에서 jar파일이 저장될 위치
  • Exec command: java -jar {jar 파일 경로} &
    • --server.port: 8080이 사용 중이라 8087로 바꾸어주었다.

 

 

8. 빌드 후 배포

BUILD SUCCESSFUL이 떠야 성공이다.

 

난 BUILD SUCCESSFUL이 떴지만, 7번의 SSH Server 설정 과정에서 경로를 잘못 입력해서 원활히 작동되지 않았다.

이런 경우, Transferred 0 file(s)라 뜰 것이다.

 

Service 서버의 포트로 접속 시, 제대로 작동되면 성공이다!

 

 

참고

[Jenkins] Jenkins - Spring Boot 프로젝트 jar 배포 (tistory.com)

728x90