Jenkins SSH를 이용한 GitHub 연동방법

젠킨스와 GitHub를 연동하여 프로젝트 소스를 가져와서 빌드하는 방법이 여러가지가 있지만, 사용자명과 비밀번호 인증방식은 보안상 추천하지 않기 때문에 SSH기반으로 젠킨스와 GitHub를 연동하는 방법에 대해서 직접 구축해봤습니다.

Jenkins 설치가 안되어있다면 Jenkins 설치 방법를 참조하시면 됩니다.

1. 키파일 생성

먼저, Jenkins가 실행중인지 확인합니다.

ps aux | grep jenkins

image

구글링을 통해서 키 파일 생성방법을 찾을 때 jenkins 권한을 가진 jenkins 계정으로 접속하라는 글을 보았지만, 저 같은 경우에는 제 별도의 계정으로 jenkins를 실행했기 때문에 jenkins라는 계정이 존재하지 않았습니다. 실제로 실행중인 프로세스를 보면 limjun-young 계정으로 jenkins가 실행되는 것을 볼 수 있습니다.

그럼 본격적으로 키 생성을 위해 bash 쉘로 접속합니다.

sudo -u limjun-young /bin/bash

image

.ssh 디렉토리를 하나 생성합니다.

mkdir /var/lib/jenkins/.ssh
cd /var/lib/jenkins/.ssh

혹시 디렉토리 생성 권한이 없다고 나오면 sudo를 앞에 붙여서 다시 실행합니다.

이제 여기서 ssh 키를 생성합니다.

ssh-keygen -t rsa -f /var/lib/jenkins/.ssh/github_ansible-in-action

image

비밀번호는 모두 입력없이 바로 Enter로 넘어갑니다.

위와 같이 터미널 콘솔에 출력되었다면 키들이 RSA 공개키/비밀키가 잘 생성되었는지 확인합니다.

image

2. GitHub

이제 젠킨스로 연동하고 싶은 GitHub의 Setting 페이지로 이동합니다.

Deploy keys -> Add deploy key 클릭 하면 아래와 같이 공개키를 입력하는 폼 화면이 나옵니다.

스크린샷 2021-05-19 오후 7 28 07

젠킨스 서버에서 생성한 공개키 코드를 복사해서 붙이면 됩니다.

공개키 등록

cat /var/lib/jenkins/.ssh/github_ansible-in-action.pub
bash-3.2$ cat github_ansible-in-action.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCnLB6lRaWdLRCDjhoIj1n9BYWd7oTCKbKQXuaxH82tkhFmmgL4VNPlUZV+TKLaQpyQN3ZxG86fGXNQFmuDRdmuJvLtQyeVY2abKkv9KFvmpeUV1++G7JBduxV9WU7qtlGt/LoR+s9Wvlv9Tc6hdDMiTg/jKSK5Ppk5d3HUotTQNfncPYzU6lqyZhR9x+uUhEUKObh3oGi0Xz+x2VHEYrDYpnWQPOsmYJbH8uqA12coQyL+9YPt4wfbuqsGl9qUy3eS7YkRCQQCQXYUiTibPvz6DLieWKF+EO/lVZO/3rCAvX9EI4zhre2ATDLVOjqMmWnL+Db3OoAjGCOxz5FuIm6CojKNdj2BJdadipd8Qop+uPbBnkePnYSx4b4Arlh5OFSONdeyxTV5CoF+NTQCzGRcc+Yj3sAbOKZvU3qX5NwBZRSUskvla1w3Bg+ybU59f5sHc5PuHAF46BdS28J2tJ6Sep0c8nMeZTNJjAqAhlJQ9NjmHViQ2kRzxt1nnre7mD8= root@imjun-yeong-ui-MacBookPro.local

출력된 코드를 key 항복에 붙여넣습니다.

image

3. Jenkins

젠킨스 웹 화면에서 Jenkins 관리 -> Security의 Manage Credentials -> Stores scoped to Jenkins의 Domains의 global 클릭 -> 왼쪽 사이드바의 Add Credentials 클릭합니다.

비밀키 등록

image

비밀키를 등록하기 위해 젠킨스 서버에 있는 비밀키를 복사합니다.

cat /var/lib/jenkins/.ssh/github_ansible-in-action
  • kind
    • 인증 방식을 선택합니다.
    • 여기선 비밀키 방식을 선택해야 GitHub의 공개키/비밀키로 인증이 가능합니다.
  • Username
    • 각 젠킨스 Job에서 보여줄 인증키 이름입니다.
    • 키 이름 그대로 사용해도 됩니다.
  • Private Key
    • 복사한 비밀키를 그대로 붙여넣습니다.

이제 고대했던 젠킨스와 GitHub 연동이 끝났습니다. 실제로 ssh 연동이 잘 되는지 확인이 필요합니다.

Jenkins 웹 화면에서 새로운 Item을 클릭합니다.

image

FreeStyle 프로젝트를 생성합니다.

image

GitHub의 코드를 가져올 수 있는지 소스코드 관리 항목에 입력합니다.

image

  • Repository URL에는 공개키를 등록한 URL을 등록합니다.
  • Credentials에는 이전에 등록한 젠킨스 인증 Username을 선택합니다.
  • 브랜치는 기본 브랜치인 master를 등록합니다.

이제 저장 후 GitHub에 있는 소스코드를 Build 해보겠습니다.

아래와 같이 GitHub에서 코드를 가져오는 로그가 출력된다면 연동이 성공한 것입니다.

image

4, Build 결과물

Build가 성공했으니 실제 결과물을 확인해야 합니다. 저는 FreeStyle 프로젝트 생성 시 입력한 타이틀을 github로 하였습니다. 작업공간을 클릭합니다.

image

짜잔!! 실제 GitHub에서 가져온 소스코드를 빌드한 결과물을 zip 파일로 압축이 가능해졌습니다.

image

이제 개발할 때마다 깃허브에 PUSH를 하면 Jenkins에서 변경된 사항에 대해서 Build가 가능해집니다.

참조 사이트: https://jojoldu.tistory.com/442

'SpringFramework' 카테고리의 다른 글

Jenkins에서 EC2로 배포하기  (0) 2021.05.20
Jenkins 설치 및 구동하기  (0) 2021.05.19
Remember - Me 인증하기  (0) 2019.11.18

Jenkins에서 EC2로 배포하기

GitHub와 젠킨스를 SSH로 연동했다면, 이제 AWS(Amazone Web Service)에서 제공하는 가장 유명한 EC2(Elastic Compute Cloud)에 배포를 해봤습니다.

1. Publish Over SSH 플러그인 설치

먼저, Jenkins에서 제공해주는 플러그인 중에 SSH로 EC2에 jar 배포 파일을 전달을 해주는 Publish Over SSH 플러그인을 설치해야 합니다.

플러그인 다운로드

왼쪽 사이드 바에서 Jenkins 관리에서 플러그인 관리를 클릭합니다.

스크린샷 2021-05-20 오후 6 32 45

저는 이미 설치를 한번 했기 때문에 설치된 플러그인 목록에서 Publish Over SSH를 보여주지만, 처음 설치하시면 설치 가능에서 Publish Over SSH 검색하시면 됩니다.

image

2. 시스템 설정

Jenkins 관리에서 시스템 설정을 클릭합니다.

image

맨 하단에 Publish over SSH라는 폼 화면이 보이게 됩니다.

image

Key에는 AWS EC2 인스턴스 생성 시 발급받은 RSA 키가 필요합니다. EC2 생성할 때 받은 ssh 접속 키인 pem 파일내용을 붙여넣기를 하면 됩니다.

image

  • Name: 본인이 사용할 임의의 SSH Server의 Name을 입력하면 됩니다.
  • Hostname: 실제로 접속할 원격 서버 ip, 접속 경로를 입력합니다. ex) 퍼블릭 IPv4 주소: 3.37.87.X
  • Username: 접속할 원격 서버의 user 이름입니다. ex) ec2-user입니다.
  • Remote Directory: 원격서버에서 접속하여 작업을 하게 되는 디렉토리 입니다.

Test Configuratoin을 눌러서 Success라고 문구가 나오면 성공적으로 SSH 설정이 되었습니다.

3. Jenkins Item 구성

이제 SSH를 통해 배포 jar 파일을 보낼 준비가 거의 다 되었습니다.
아래 Jenkins Item을 클릭 후 구성 버튼을 누릅니다.

image

Build

Build 항목은 하단의 셀렉트 박스를 통해서 빌드 시 할 수 있는 작업을 정의해 놓았습니다.

image

젠킨스 통합환경 설정에서 Gradle Toll Configuration에서 Gradle을 다운받아 전역적으로 사용이 가능합니다.
저는 GitHub에 Gradle wrapper를 push 하였기 때문에 Invoke Gradle script 방식으로 Build를 설정하였습니다.

Use Gradle Wrapper를 선택하고, Tasks에 clean 후 Build를 수행하도록 설정하였습니다. 만약 test도 수행하고 싶으면 스프링 부트 프로젝트의 build.gradle 파일에 아래 설정을 추가하면 됩니다. 보통은 기본적으로 추가가 되어있습니다.

test {
    useJunitPlatform()
}

빌드 후 조치

이제 스프링 부트 어플리케이션 배포 파일을 보내는 설정을 하고 어떻게 실행할지 정의하는 부분을 입력해야 되는데.. 이게 가장 햇갈렸지만 이미 다른 개발자분들의 좋은 블로그 글을 통해서 금방 이해할 수 있었습니다.

image

  • Source files: 내가 전송할 파일의 위치를 적습니다. Jenkins의 workspace 기준으로 적게 되는데 git pull로 당겨온 스프링 부트 앱의 루트 경로라고 생각하면 됩니다. jar 파일의 위치는 build/libs 하위에 있습니다. 이 경로를 jar 파일이라고 명시를 해줍니다.
  • Remote Directory: 파일을 전송할 원격 서버의 디렉토리를 명시하는 부분입니다. 여기서 주의할 점은 위에서 SSH 서버 설정하는 부분에서 이미 경로(/home/ec2-user)를 적어줬기 때문에 그 밑의 경로부터 적어야 합니다. 저는 /deploy로 적었기 때문에 빌드 후에 ec2 서버의 /home/ec2-user/deploy 하위로 jar 파일이 배포가 됩니다.
  • Exec command: 파일 전송 후 실행할 명령어를 입력합니다. 절대 경로로 ec2 루트경로(/home/ec2-user/start_server.sh)부터 적었습니다.

배포 후 실행될 스크립트 명령어

!#/bin/bash

echo "Start Spring Boot Application!"
CURRENT_PID=$(ps -ef | grep java | grep dokotlin | awk '{print $2}')
echo "$CURRENT_PID"

 if [ -z $CURRENT_PID ]; then
echo ">현재 구동중인 어플리케이션이 없으므로 종료하지 않습니다."

else
echo "> kill -9 $CURRENT_PID"
kill -9 $CURRENT_PID
sleep 10
fi
 echo ">어플리케이션 배포 진행!"
nohup java -jar /home/ec2-user/deploy/dokotlin-0.0.1-SNAPSHOT.jar >> /home/ec2-user/deploy/logs/dokotlin.log &

bash 쉘을 이용하여 작성한 스크립트로 단순히 grep 명령어로 실행 중인 부트 애플리케이션의 pid (프로세스 식별자)를 조회하여 길이가 0이면 앱을 실행시키고, 만약 떠있는 앱이 존재하면, kill -9 명령어로 강제로 내린 후에 다시 재기동을 하도록 작성하였습니다.

image

Name 하위에 고급 버튼을 클릭후 Verbose output in console을 체크하면 빌드할 때 상세 내역이 표시되므로 유용합니다.

4. Jenkins 빌드 결과물

이제 Jenkins로 다시 Build를 수행하면 /home/ec2-user/deploy/ 디렉토리 하위에 jar 파일이 떨어지고, 파일 전송 후 실행할 어플리케이션 기동 명령어가 저장되어 있는 start_server.sh이 실행됩니다.

아래 젠킨스 콘솔 로그에서 확인 가능합니다.

image

EC2 서버에 배포된 jar 파일

image

EC2 서버 스프링 부트 어플리케이션 실행 화면

image

만약에 EC2 서버 로컬에서 정상적으로 웹 API 호출이 되지만, 내 PC 로컬 브라우저에서 화면이 안보인다면 아래와 같이 EC2 Security Group에서 인바운드 규칙을 살펴봐야 합니다. 저같은 경우에는 스프링 부트 어플리케이션을 8080 포트로 실행시켰기 때문에 인바운드 규칙에 TCP 8080포트를 허용하도록 설정했습니다.

인바운드 규칙

image

참조 사이트: https://pjh3749.tistory.com/261, https://goddaehee.tistory.com/259?category=399178

'SpringFramework' 카테고리의 다른 글

Jenkins SSH를 이용한 GitHub 연동방법  (0) 2021.05.20
Jenkins 설치 및 구동하기  (0) 2021.05.19
Remember - Me 인증하기  (0) 2019.11.18

Jenkins 설치 및 구동하기

대표적인 CI 도구인 Travis-CI와 젠킨스가 있지만, 그 중에서 오래된 역사와 다양한 플러그인을 제공해주는 Jenkins를 설치하는 방법에 대해서 살펴보았고, 직접 저의 로컬환경에서 구축해봤습니다.

설치환경

  • Mac OS
  • 패키지 관리자 homebrew

1. Jenkins 설치

먼저, GitHub와 연동해야 할 대표적인 CI 툴인 젠킨스를 설치해야 합니다.
제 PC 환경은 Mac OS이기 때문에 패키지 관리자인 homebrew를 통해서 설치하였습니다.

Jenkins 설치 명령어

brew install jenkins
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

혹시 설치가 정상적으로 안되고 위와 같은 에러로그가 찍히면 xcode-select --install를 설치하시면 됩니다.

Jenkins 포털 설정 화면

unlock jenkins

Administrator password를 입력하면 되는데 패스워드는 아래 경로에 있는 파일을 열어서 복사 후 입력하시면 됩니다.

$ vi /var/lib/jenkins/secrets/initialAdminPassword

플러그인 설치 화면

패스워드를 입력 후 아래와 같이 플러그인 설치화면이 나오는데 특별히 설치할 플러그인이 필요없다면 install suggested plugins를 선택합니다.

jenkins install

Admin 계정 생성

이제 Admin 사용자를 생성하고 다음 화면을 누르면 Jenkins 화면이 보이는 것을 확인할 수 있습니다.

스크린샷 2021-05-19 오후 4 18 20

2.외부 IP로 접근 가능하도록 설정

해당 Mac 호스트를 CI 전용 서버로 쓰는 경우 localhost:8080 이외의 도메인이나 공인 IP, 외부 IP로 접속하기를 원할 수 있습니다. 이 경우에는 아래와 같은 경로에서 --httpListenAddress 값을 127.0.0.1에서 0.0.0.0으로 변경해야합니다. 만약 Jenkins 포트번호도 변경하고 싶다면 --httpPort={port번호}를 수정하면 됩니다. 그럼 이제 공인이나 사설 IP로도 Jenkins로 접근이 가능해집니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>homebrew.mxcl.jenkins</string>
    <key>ProgramArguments</key>
    <array>
      <string>/usr/libexec/java_home</string>
      <string>-v</string>
      <string>1.8.0_201</string>
      <string>--exec</string>
      <string>java</string>
      <string>-Dmail.smtp.starttls.enable=true</string>
      <string>-jar</string>
      <string>/usr/local/opt/jenkins/libexec/jenkins.war</string>
      <string>--httpListenAddress=0.0.0.0</string>
      <string>--httpPort=8888</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
  </dict>
</plist>

-Dmail.smtp ~ 위에 설정한 JDK 버전 값은 만약 /usr/libexec/java_home -V에서 여러개의 JDK를 설치된 경우 특정 JDK 버전을 지정하기 위해서 명시한 설정 값입니다. 저 같은 경우에는 JDK가 2개가 설치되어 있어서 1.8.0_201버전으로 Jenkins의 Job을 구동하도록 설정하였습니다.

3. Jenkins 웹 UI 화면

만약 저처럼 위 설정파일에서 젠킨스 실행포트를 8888로 변경하지 않았다면 기본인http://localhost:8080로 접속하면 아래와 같이 젠킨스 웹 화면이보이게 됩니다.

스크린샷 2021-05-19 오후 6 58 04

참조 사이트: https://wan-blog.tistory.com/74?category=776763

'SpringFramework' 카테고리의 다른 글

Jenkins SSH를 이용한 GitHub 연동방법  (0) 2021.05.20
Jenkins에서 EC2로 배포하기  (0) 2021.05.20
Remember - Me 인증하기  (0) 2019.11.18

+ Recent posts