시나브로

Jenkins, Codedeploy, S3, git으로 CI/CD 구현하기 본문

Cloud/AWS 기록

Jenkins, Codedeploy, S3, git으로 CI/CD 구현하기

sa1347 2025. 6. 28. 17:34

 

 

docker 위에 Jenkins를 올려서 AWS Codedeploy 로 배포하려고 합니다.

(저는.. 많은 에러를 발견하여 서버에 jar 파일 빌드되기까지 한 20번은 재설치하였습니다. 인스턴스 실행부터..)

 

 

※ 기본구성 ※

 

먼저, 인스턴스를 생성합니다.

 

 

- 인스턴스 유형 : t2.large

- 퍼블릭 자동할당 설정

- iam 프로파일 할당

- Volume 30GB

- 보안그룹 구성

 

 

※ Jenkins 및 Plugin 설치 ※

 

Public Ip로 터미널에 접속하여 선행작업을 진행합니다.

docker 설치합니다.

docker위에 Jenkins를 올립니다.

password를 확인하고 웹으로 Jenkins를 실행합니다.

public Ip:32789

password 복붙하기

 

많은 설치 실패를 겪었습니다.....ㅎ

 

설치 후에 나오는 시작화면에 계정 정보와 Jenkins URL을 저장하고 마칩니다.

 

Jenkins 화면 입니다.

오른쪽 상단에 보이는 설정 을 클릭합니다.

 

플러그인을 클릭해도 되고 왼쪽 상단에 'Avaliable Plugins'을 클릭해도 됩니다.

 

 

 

플러그인을 정상적으로 설치하였습니다.

 

프로젝트명을 입력하고 넘어갑니다.

 

Build Steps - Add build step - Execute shell 선택

깔끔하게 빌드를 진행하기 위해

Execute shell 에 명령어를 입력합니다.

 

 

※ Codedeploy 애플리케이션 정보 구성 

 

빌드 후에 

 

▶  배포될 애플리케이션 정보 구성 ◀

CodeDeploy 애플리케이션 이름

CodeDeploy 배포 그룹

리전

S3 버킷 이름

구성에 필요한 파일들

Access key

Secret key

 

Apply 하고 저장합니다.

 

 

※ github Webhook 구성 ※

github에 webhook을 구성하기 위해 Payload와 type을 지정합니다.

 

다음으로 aws configure 구성하고 list로 확인합니다.

 

 

※ Codedeploy Agent 설치 ※

다음은 Codedeploy agent 설치단계인데, 실행 기반인 ruby를 먼저 설치한 후에 agent 를 설치합니다.

 

wget https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install

chmod +x ./install

sudo yum install ruby

sudo ./install auto

 

그런다음, agent의 상태를 확인합니다.

PID가 일치한지 확인합니다.

 

마지막으로, Java를 설치합니다.

저는 17버전으로 설치하였습니다.

 

 

※ 배포할 애플리케이션 구성

배포할 애플리케이션을 EC2/온프레미스 용으로 생성합니다.

배포그룹 이름을 적고, 미리 생성해둔 iam deploy Role을 선택합니다.

 

배포유형과 인스턴스 구성을 설정합니다.

agent는 서버에 구성하였으니 따로 설치하지 않음

배포 구성은 한꺼번에 배포함

인스턴스가 1대라 로드밸런싱은 활성화 체크해제 합니다.

 

 

※ S3 버킷 구성 ※

S3 버킷도 생성합니다.

 

 

※ 스크립트 확인 ※

 

이제 전체 구성은 완료했습니다.

다음은 스크립트를 보겠습니다.

 

vi appspec.yml

version: 0.0
os: linux

files:
  - source: /
    destination: /home/ec2-user/deploy
    overwrite: yes

permissions:
  - object: /
    pattern: "**"
    owner: ec2-user
    group: ec2-user

hooks:
  ApplicationStart:
    - location: scripts/deploy.sh
      timeout: 60
      runas: ec2-user

 

 

vi deploy.sh

#!/bin/bash

BUILD_JAR=$(ls /home/ec2-user/deploy/build/libs/*.jar)
JAR_NAME=$(basename $BUILD_JAR)
echo ">>> build 파일명: $JAR_NAME" >> /home/ec2-user/deploy.log

echo ">>> build 파일 복사" >> /home/ec2-user/deploy.log
DEPLOY_PATH=/home/ec2-user/
cp $BUILD_JAR $DEPLOY_PATH

echo ">>> 현재 실행중인 애플리케이션 pid 확인 후 일괄 종료" >> /home/ec2-user/deploy.log
sudo ps -ef | grep java | awk '{print $2}' | xargs kill -15

DEPLOY_JAR=$DEPLOY_PATH$JAR_NAME
echo ">>> DEPLOY_JAR 배포"    >> /home/ec2-user/deploy.log
nohup java -jar $DEPLOY_JAR >> /home/ec2-user/deploy.log 2>/home/ec2-user/deploy_err.log &
# 터미널 세션이 끊겨도 프로세스가 종료되지 않게 함

 

Jenkins를 활용한 Codedeploy 배포 자동화 구성에서

많은 분들이 appspec.yml과 deploy.sh로 .jar 파일까지 배포 성공한것을 보았는데,

저는 .jar 파일이 깡통파일 처럼 확인이 되어 build.gradle 파일을 따로 수정하였습니다.

 

 

vi build.gradle

/*
 * This file was generated by the Gradle 'init' task.
 *
 * This is a general purpose Gradle build.
 * Learn more about Gradle by exploring our samples at https://docs.gradle.org/7.6.1/samples
 */

plugins {
    id 'java'  // Java 프로젝트라면 이거 꼭 있어야 함
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

jar {
    enabled = true
}

 

 

 

※ 배포 진행 ※

 

이제 배포해보겠습니다.

 

이 단계에서 많이 헤맸습니다.

 

터미널에서 deploy agent.log도 보고,

S3 객체도 확인해보고,

agent를 재시작해서 상태 확인했다가,

github에 key 관련을 봤는데 터미널에서 생성해서 공유해봤다가,

git clone 했다가,

docker 이미지가 문제있나 해서 Jenkins 삭제 후 다시 설치했다가,

iam 역할이 문제있나 해서 제거 후 설정하고 재부팅했다가...

...

.....

원래 BeforeInstall 단계에서 오류 코드를 여럿 확인했습니다.

 

원래 이 폴더 안에 deployment-root ? 폴더가 보여야됐는데 확인이 안됐습니다.

 

...

..

여튼 그러다가 어느 글을 발견하였는데,

https://velog.io/@gingaminga/AwsCodeDeployCommandErrorsAccessDeniedException

비슷한 상황으로 이분이 공유한 방법으로 해봤습니다.

 

 

스크립트 배포 완료했습니다.

 

버킷 객체 확인됨

 

jar 파일이 잘 전달된것을 확인할수 있습니다.

 

agent 로그도 Success 확인이 되었습니다.

 

 

같이 확인되는걸 보고 구조를 신기하게 생각했습니다.

 

 

 

 

아래는 실패 기록들....

 

 

 

 

 

 

 

 

참고한 링크

https://devlog-wjdrbs96.tistory.com/295
https://velog.io/@bluewind8791/jenkins-with-docker-ci#jenkins-%EC%84%9C%EB%B2%84-%EC%84%A4%EC%A0%95

 

Aws::CodeDeployCommand:: Errors::AccessDeniedException
https://velog.io/@gingaminga/AwsCodeDeployCommandErrorsAccessDeniedException

도커 이미지와 컨테이너 삭제 방법
https://brunch.co.kr/@hopeless/10

GitHub action
https://m42-orion.tistory.com/139#%E2%9C%85%C2%A0deploy.sh%20%EC%9E%91%EC%84%B1-1

appspec.yml
https://yoo11052.tistory.com/113