Skip to content

자동배포 설정하기

SeungChulNa edited this page Feb 15, 2022 · 24 revisions

자동배포하는 방법에 대한 페이지입니다. 아래와 같은 기술을 사용합니다.

  • 젠킨스
  • AWS의 S3
  • AWS의 CodeDeploy

해당 작업전에 준비해야 하는 사항은 아래와 같습니다.

  • 웹애플리케이션을 배포할 EC2 인스턴스
  • 로컬 PC에 도커 설치

1. 젠킨스의 도커 이미지를 pull받고 컨테이너를 생성

  • 링크에서 젠킨스의 도커 이미지를 pull받습니다.
    이때, 그냥 jenkins를 받으면 안되고, jenkins/jenkins:lts로 받아야 합니다.
  • pull 받은 이미지를 가지고 젠킨스 컨테이너를 생성합니다.
    반드시 컨테이너의 8080포트에 로컬PC의 포트를 매핑해줘야 합니다. 이 주소로 젠킨스 페이지에 접속하기 때문입니다.
    아래의 경우 http://localhost:48080으로 젠킨스에 접속하게 됩니다. image
  • 젠킨스 컨테이너로 진입해서 자바 11을 설치해줍니다.
# 컨테이너로 진입합니다.
docker exec -itu 0 jenkins-container /bin/bash

# 패키지매니저를 업데이트하고, 자바11버전과 zip 명령어를 설치합니다.
apt-get update
apt-get install openjdk-11-jdk
apt-get install zip
  • vim도 설치해주도록 합니다.
apt-get install vim
  • http://localhost:48080으로 접속하면 다음과 같은 페이지를 볼 수 있습니다.
    지시사항대로 /var/jenkins_home/secrets/initialAdminPassword으로 이동해서 비밀번호를 가져오도록 합니다.
    view 명령어로 파일을 읽기전용으로 열고, 안의 내용을 복사해서 로그인 페이지에 입력합니다.
view /var/jenkins_home/secrets/initialAdminPassword

image

  • 왼쪽 버튼을 클릭해서 플러그인을 설치합니다.
    image
  • 설치 완료를 기다립니다.
    image
  • 설치가 끝나면 젠킨스 계정정보를 물어봅니다. 입력해주고 save and continue버튼을 클릭합니다.

2. AWS S3 버킷과 IAM USER 생성

  • S3버킷을 생성합니다.
  • IAM 사용자를 생성합니다.
    • 사용자는 다음의 권한을 가져야 합니다. [AmazonS3FullAccess, AWSCodeDeployFullAccess]
    • 자격증명유형은 액세스키여야 합니다.
      image
    • CSV 파일은 꼭 저장하도록 합니다.
      image

3. AWS CodeDeploy를 위한 IAM Role과 애플리케이션 생성

  • IAM에서 다음과 같이 ROLE을 생성합니다
    image
  • AWS 관리콘솔에서 CodeDeploy로 이동해서 애플리케이션을 생성합니다.
    image
  • 배포그룹을 생성합니다.
    image

4. 젠킨스 플러그인을 설치

  • Jenkins관리 > 플러그인 관리 > 설치가능 탭으로 이동한 다음 검색창에 s3 publisher라고 검색하고 설치합니다.
    image
  • codedeploy라고 검색한 다음 설치합니다.
    image
  • S3 설정을 하기 위해 Dashboard > Jenkins 관리 > 시스템 설정으로 이동합니다.
  • Amazon S3 profiles을 찾고 프로필을 추가합니다.
    image
  • AWS CodeDeploy Credentials를 찾고, 액세스 키와 시크릿 키를 입력합니다.
    image

5. 젠킨스에서 배포 스크립트를 생성

  • 새로운 Item 버튼을 누른 후 다음과 같이 설정하여 스크립트를 생성합니다
    image
  • 소스코드 관리에서 Git을 선택하고 저장소의 URL을 입력합니다
    image
  • 배포용 브랜치가 따로 있다면, 브랜치를 지정할 수도 있습니다.
    image
  • Build에서 Add build step을 클릭 후 execute shell을 선택합니다.
    image
  • 실행할 쉘 스크립트를 입력합니다
# 빌드를 위해 백엔드 디렉토리로 이동
cd /var/jenkins_home/workspace/deploy-qnaoverflow/be/qnaboard

# 백엔드 CodeDeploy 스크립트를 루트로 가져옴
mv appspec.yml ../../appspec.yml

# 배포 완료 후 앱을 실행하는 스크립트 가져옴
mkdir -p ../../scripts
cp ./deploy.sh ../../scripts/deploy.sh
cp ./beforeDeploy.sh ../../scripts/beforeDeploy.sh

# 실행권한을 위해 chmod 수행
chmod +x gradlew

# git repository에는 없는 설정파일 주입
cp /var/jenkins_home/workspace/ignored-settings/* /var/jenkins_home/workspace/deploy-qnaoverflow/be/qnaboard/src/main/resources/

# 빌드
./gradlew clean build

# 워크스페이스 루트로 이동
cd /var/jenkins_home/workspace/deploy-qnaoverflow
mkdir -p deploy
mv ./be/qnaboard/build/libs/qnaboard-0.0.1-SNAPSHOT.jar ./deploy/qnaboard-0.0.1-SNAPSHOT.jar

# 빌드된 jar를 zip으로 압축
cd deploy
zip -r deploy-be.zip *
  • 빌드 후 조치에서 publish artifacts to S3 Bucket을 선택하고 다음과 같이 설정합니다.
    image
  • 그 다음 빌드 후 조치를 추가합니다. Deploy an application to AWS CodeDeploy입니다.
    image

6. 웹 애플리케이션의 배포버전에 대한 설정 추가

  • 젠킨스의 빌드버튼을 클릭하여 배포를 발생시킵니다. 하지만 스크립트에서 필요로 하는 폴더가 존재하지 않아서 배포는 합니다. 그럼에도 배포를 하는 이유는, 첫 배포를 시도해야 workspace폴더가 생기기 때문입니다. 배포를 시도하고 나면, 아래와 같이 workspace폴더 밑에 프로젝트 폴더가 생긴 것을 확인할 수 있습니다.
$ pwd
/var/jenkins_home/workspace/deploy-qnaoverflow
$ ls
README.md  be  design  jenkins
  • workspace폴더 밑에 ignored-settins라는 폴더를 생성하고, 그 안에 github 저장소에 올라가있지 않은 설정파일을 넣어둡니다.
    배포스크립트는 해당 경로에 있는 모든 파일을 복사해서 백엔드 프로젝트의 resources폴더에 붙여넣습니다.
$ mkdir ignored-settins
$ cd ignored-settins/
$ cp /external/QnaBoard-wiki/application-* ./
$ ls
application-local.yml  application-oauth.yml

7. EC2 인스턴스에 CodeDeploy 에이전트를 설치

  • 링크를 참고해서 CodeDeploy에이전트를 설치합니다.
sudo yum update
sudo yum install ruby
yum install wget
sudo yum install wget
wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto
  • EC2 인스턴스에 CodeDeploy 권한이 있는 IAM Role을 추가합니다.
    image
  • CodeDeploy 에이전트를 재시작합니다.
sudo service codedeploy-agent restart

8. 자동배포 수행

  • Build Now 버튼을 클릭하여 자동배포를 시작합니다.
    image
  • 빌드에 성공하면 체크 아이콘이 뜹니다.
    image
  • AWS관리콘솔의 CodeDeploy페이지의 배포내역으로 이동해서 배포가 잘 되었는지 확인합니다.