[AWS] Docker + Jenkins 자동 배포 (Feat. GitHub Webhook)

준우·2023년 3월 29일
1

AWS

목록 보기
3/3
post-thumbnail

1. EC2 생성

  • https://velog.io/@wijoonwu/AWS-EC2
    위 글을 참고해서 젠킨스용 EC2 인스턴스를 생성하고, ssh 접속까지 한다.
    단, 인바운드 보안 규칙에서 젠킨스 웹페이지에서 사용할 포트번호(8000 혹은 9000)를 추가로 열어줘야 한다.

2. Docker 설치

  • ec2 서버 접속 후 아래 명령어로 도커를 설치한다.
sudo yum update -y
sudo yum install -y docker
sudo service docker start

3. Jenkins 설치

  • 아래 명령어로 Jenkins 이미지를 다운로드 받고, Jenkins 컨테이너를 실행한다.
docker pull jenkins/jenkins:lts
docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins:lts
  • 아래 명령어로 Jenkins 컨테이너 ID를 확인한다.
docker ps
  • 그리고 아래 명령어로 Jenkins 컨테이너에 진입한 뒤, 초기 패스워드를 확인한 뒤 복사해둔다.
docker exec -it --user root [CONTAINER ID] /bin/bash
cd /var/jenkins_home/secrets/
vim initialAdminPassword
  • http://<EC2 인스턴스 IP 주소>:8080 로 접속해서 Jenkins 설정을 시작한다.
  • 첫화면이 나타나면 위에서 복사했던 초기패스워드를 붙여넣는다.
  • 그리고 Install Sugeested plugins를 선택한다.
  • 설치가 모두 완료되면 계정명부터 이메일주소까지 적고 Save한다.

4. 자동 배포 설정

(1) github 설정

토큰 생성

  • github 로그인 후 settings>developer settings에 접속한 뒤
    personal access token의 tokens 탭에서 generate new token을 클릭한다.
  • 토큰의 이름과 권한을 설정한 뒤 발급을 완료하고, 이후 나오는 token값을 복사해서 안전한 곳에 보관해둔다.

Webhook 설정

  • 자동 배포를 원하는 프로젝트의 레포지터리에서 Settings를 클릭한다
  • Webhooks 에서 Add webhook 을 클릭하고, 아래처럼 http://젠킨스ec2의IP:포트번호/github-webhook/ 을 입력한다. 반드시 마지막 /까지 입력해야한다.

(2) Jenkins 설정

  • 젠킨스 대쉬보드의 Jenkins 관리 > 플러그인 관리 를 클릭한다.
    Available plugins에서 ssh를 검색하여 Publish Over SSH 플러그인을 설치한다.

  • 다시 Jenkins 관리 > 시스템 설정을 클릭한다.

  • GitHub 영역에서 [Add GitHub Server] 를 클릭한다.

  • 그리고 이름을 지정한 뒤, Credentials에서 Add를 클릭한다.

  • 아래처럼 팝업이 나오면 도메인은 Global Credentials, Kind는 Username with password로 설정하고, username은 깃헙 로그인id, password는 위에서 발급하고 복사해뒀던 token 값을 적는다. id란에는 이 설정의 credential id를 새로 지어주는 것이다. 그리고 add를 클릭한다.

  • 그리고 밑으로 내려서 Publish over SSH 영역으로 간다.

  • passphrase 값에는 ssh 비밀번호를 새로 입력하고, key 값에는 Springboot가 배포된 ec2에 접속할 때 쓰는 pem 파일을 vim 명령어로 열어서 -----BEGIN RSA PRIVATE KEY-----부터 -----END RSA PRIVATE KEY----- 값까지 복사하여 붙여준다.

  • 그리고 SSH Servers 영역에 추가를 눌러서 위와 같이 Hostname에 스프링부트가 배포된 ec2 서버의 ip와 username, remote directory를 적어준다.

(3) Jenkins Item 추가

  • 그리고 젠킨스 대쉬보드의 +새로운 Item을 클릭한다.
  • 그리고 아이템의 이름을 지어주고, Freestyle project를 클릭한다.
  • 이후 소스코드 관리에서 배포된 스프링부트 repo의 URL을 넣고, credentials에서는 아까 jenkins 설정에서 등록한 github token의 credentaial id를 선택한다.
  • 빌드 유발 영역에서는 아래와 같이 github hook trigger을 선택한다.
  • 빌드 Step에는 ./gradlew clean build를 입력한다.
  • 빌드 후 조치에는 아래와 같이,Send build artifacts over SSH를 선택 한 뒤, 이전에 설정한 ssh 이름을 선택한다.

source files: 대상 ec2에 전달할 파일의 경로와 파일의 종류
remote directory: 대상 ec2에 생성하고 관리할 경로
exec command: 전달 후 실행할 명령어

(4) ec2 script 생성

  • 스프링부트 프로젝트가 배포된 ec2에 ssh 명령어로 접속해서 /home/ec2-user/ 경로에 sh 파일을 만든다
cd ~
touch start_server.sh
vim start_server.sh

그리고 해당 파일에 아래와 같이 입력하고 저장한다.

REPOSITORY=/home/ec2-user/deploy

echo "> 현재 구동중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -f wemanage.*.jar)

echo " 현재 구동중인 애플리케이션 pid: $CURRENT_PID"

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

echo "> 새 애플리케이션 배포"
JAR_NAME=$(ls -tr $REPOSITORY/*.jar | tail -n 1)
echo "> JAR Name: $JAR_NAME"
nohup java -jar $JAR_NAME > $REPOSITORY/nohup.out 2>&1 &

# 실행 권한 확인 및 부여
if [ ! -x "$REPOSITORY/nohup.out" ]; then
    echo "> $REPOSITORY/nohup.out 실행 권한이 없으므로 추가합니다."
    chmod +x $REPOSITORY/nohup.out
fi

# 이전 jar 파일 삭제
JAR_COUNT=$(ls -1 $REPOSITORY/*.jar | wc -l)
if [ $JAR_COUNT -gt 1 ]; then
    PREV_JAR=$(ls -tr $REPOSITORY/*.jar | head -n 1)
    echo "> 이전 jar 파일 삭제: $PREV_JAR"
    rm -f $PREV_JAR
fi
  • 그리고 해당 레포지터리에 push를 발생시키거나, 젠킨스에서 만든 Item을 클릭하고 [지금 빌드]를 클릭하면 해당 repo의 jar 파일을 빌드하고 ssh 연결로 대상 서버에 전달한 뒤 sh 파일을 실행시키게 된다.
  • 빌드가 시작됐다면 Console Output을 클릭해 진행상황을 볼 수 있다.
  • 빌드가 완료된 후에는 대상 서버의 deploy 경로에 jar 파일과 nohup.out 파일이 생긴 것을 확인할 수 있다.
  • 아래 명령어로 스프링부트 서버가 시작된 후의 로그도 확인할 수 있다.
vim nohup.out

참조

0개의 댓글