| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 자동화구현만세
- aws책은읽다말았는데
- 저것도꾸준히읽어야지ㅠㅠ
- 정신력승리함
- 해낼수있어
- 윽짜증
- 테라폼만세
- 은우쌤
- 합격률15.18%
- 청년내일채움공제
- 해내자
- 청내공만기
- 청년내일채움공제 끝
- 화이팅
- 몸이고되고머리가힘들다
- 청내공만기오긴오냐
- 만기오긴오냐
- 너무어려워...
- 2025년 1회차
- 이놈의기사또해내야돼
- 나름신중하게할거다하고있음
- 무탈히가길
- 청내공화이팅
- 정신력승리
- 어렵다
- 청내공해내자
- IaC코드자동화
- Provider AWS
- 존버존버
- 청내공
- Today
- Total
시나브로
Jenkins, Codedeploy, S3, git으로 CI/CD 구현하기 본문

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