📌 정리 이유 

CI/CD 하면서 상태 확인해 볼려면 봐야할게 많아서 이 부분 기억하려고 정리

 

 

📌 사용한 기술 및 인프라 

Github Actions, Code Deploy, S3, EC2

 

 

📌 체크! 

 

📍Github

상세하게
더 상세하게

 

 

📍 AWS S3 > bucket

프로젝트 파일 알집파일이 복사 되었는지 확인!

 

 

📍AWS CodeDeploy

 

📍로그들

1) 배포주기 이벤트 발생시 사용하는 sh로 생성한 커스텀 로그들

2) EC2 인스턴스 로그

- 위치 : ../../var/log/aws/codedeploy-agent/codedeploy-agent.log

 

 

 


➕ CI/CD 레포지토리

 

GitHub - littlezero48/CICD_githubActions: CI/CD GithubAction을 연습

CI/CD GithubAction을 연습. Contribute to littlezero48/CICD_githubActions development by creating an account on GitHub.

github.com

 

'DevOps > CI & CD' 카테고리의 다른 글

CI/CD] Properties 관리  (1) 2023.01.26
CI/CD] CodeDeploy - 적용 과정  (1) 2023.01.24
CI/CD] CodeDeploy - AWS 환경 설정  (2) 2023.01.20
CI/CD] Github Actions CI  (0) 2023.01.20

 

 

📌 사용 계기 

깃헙에 올리지 못하는 계정 정보가 담긴 properties 를 자동 배포할 때 어떻게 적용할 수 있는지 실습

 

📌 나의 상황 

기본 application.properties는 두고 별도의 application-secret.properties를 두어 공개되지 말아야하는 정보를 넣어 사용하고 있다. 그리고 application.properties에 아래처럼 넣어서 application-secret.properties를 끌어오는 방식.

(아래처럼 인식해서 가져오기 때문에 끌어오는 파일 명은 application-[원하는이름].properties 로)

spring.profiles.include=secret

 

이 형식을 그대로 사용하기 위해서 기본 application.properties는 깃헙에 올라가게 두고, application-secret.properties는 .gitignore에 추가해 깃헙에 올라가지 않게 설정했다. 그리고 github의 secrets에는 application-secret의 내용을 넣을 예정

 

 

📌 실습 

📍Github Secrets 설정 

Github > Settings > Secrets and variables > Actions > New repository secret 클릭

 

📍gradle.yml 수정 (메인이되는 yml 파일)

yml 파일에서 jobs > steps 부분에서 아래 코드를 추가해야하는 데 반드시 build과정 전에! 이 코드가 있어야한다. 

깃헙 프로젝트 배포 과정에서 application-secret.properties를 포함시켜준 뒤 빌드를 하고 그 jar를 복사해 EC2에서 실행해야 하기 때문. 빌드 뒤에 들어가버리면 jar파일에서 빠져버려 정상 작동하지 않는다.

 

      # 중요 키 정보 있는 properties 따로 관리
    - name: make application-secret.properties
      run: |
        cd ./src/main/resources
        touch ./application-secret.properties                                      
        echo "${{ secrets.PROPERTIES_SECRET }}" > ./application-secret.properties
      shell: bash

 

1) name : 작업의 이름

2) run : 실행할 명령어 나열

cd 경로 : 경로로 이동
touch 경로와 파일명 : 해당 경로와 파일명으로 파일 생성
echo "${{ secrets.PROPERTIES_SECRET }}" > ./application-secret.properties
변수명에 해당하는 값을 출력해 현재위치 폴더에 있는 application-secret.properties에 쓴다

- echo : 출력

- ${{ secrets.PROPERTIES_SECRET }} : 윗단계에서 우리가 깃헙 settings에 저장한 변수명을 이런 형태로 적어주면 그 변수 값을 가져온다 
- > : 왼쪽 내용을 오른쪽에 씀 (> : write and overwrite , >> : append) 

 3) shell : 사용할 쉘 

 


이러면 지켜야하는 정보를 일반저긴 깃헙파일로 올리지 않고 다른 루트로 자동배포에 포함시킬수 있게 된다. 간단! 

 

 

 

 


실습한 레포지토리

 

GitHub - littlezero48/CICD_githubActions: CI/CD GithubAction을 연습

CI/CD GithubAction을 연습. Contribute to littlezero48/CICD_githubActions development by creating an account on GitHub.

github.com

 

'DevOps > CI & CD' 카테고리의 다른 글

CI/CD] 자동 배포 관련 다양한 상태 확인 방법  (0) 2023.01.26
CI/CD] CodeDeploy - 적용 과정  (1) 2023.01.24
CI/CD] CodeDeploy - AWS 환경 설정  (2) 2023.01.20
CI/CD] Github Actions CI  (0) 2023.01.20

📌 CI와 AWS 환경설정을 먼저 해야한다.

 

CI/CD] Github Actions CD - AWS 환경 설정

필요 요소 구성 📌 1. EC2 인스턴스 - ubuntu로 아키텍쳐 64비트, t2.micero 프리티어 서버가 하나 있어서 그걸 사용 (아래 포스팅 때 만들걸 사용) 000 - 웹개발 종합반 5주차 (AWS) 5-1 / 5주차 오늘 배울것

littlezero48.tistory.com

 

CI/CD] Github Actions CI

📌 Workflow 선택 깃헙에서 Actions > gradle 검색 > java with Gradle 의 Cofigure 클릭 📌 Workflow 선택 📍 yml이 뭔 파일이지? Yet another Markup Language의 약자로 yml 또는 yaml 확장자로 사용된다. 여러 configuration을

littlezero48.tistory.com

 

 

📌 깃헙  > Actions

 

 

📌 Actions secrets 생성 

 

📍Setting > Secrets and variables > Actions > New repository secret 클릭

 

📍2개 생성 각각 ( AWS 환경설정글 4번에서 다운받은 CSV파일에서 키ID 값과 액세스키를 가져와 각각 적용)

- CSV는 ,로 값을 나눈다. 

 

 

 

📌  AppSpec 파일 생성

********* AppSpec 파일명은 appspec으로 모두 소문자로 해야함!!!!!!! 아래처럼 했다가 255 Error봄 

root 폴더 즉, builda.gradle 이나 gradlew 등이 있는 경로에 생성. 이 파일은 CodeDeploy가 배포를 위해 참조하는 파일!

여기서 파일을 EC2 어느 경로에 복사할건지, 배포 이후에 어떤 행동을 하게 할 건지 할 수 있어 서버 배포에 대한 설정을 할 수 있다.

version: 0.0                                        # 버젼
os: linux                                           # OS

files:                                              # 배포 파일 설정
  - source:  /                                      # 인스턴스에 복사할 디렉터리 경로
    destination: /home/ubuntu/app                   # 인스턴스에서 파일이 복사될 목적지
    overwrite: yes                                  # 덮어쓰기 허용

permissions:                                        # 파일에 관한 권한 설정
  - object: /                                       # 권한 지정되는 파일 또는 경로
    pattern: "**"                                   # 매칭되는 패턴에만 권한부여
    owner: ubuntu                                   # Object 소유자
    group: ubuntu                                   # Object 그룹 이름

hooks:                                              # 배포 이후 수행할 스크립트 부분
  AfterInstall:                                     # 파일 설치 후 실행되는 스크립트
    - location: scripts/stop.sh                     # 실행되는 스크립트 경로, 위치
      timeout: 60                                   # 스크립트 실행 허용 시간, 넘으면 배포 실패
      runas: ubuntu                                 # 스크립트 실행 사용자
  ApplicationStart:                                 # 애플리케이션 실행 스크립트
    - location: scripts/start.sh
      timeout: 60
      runas: ubuntu

📍 Code Deploy 흐름 생각해서 hook 작성

 

 

 

 

📌  실행 스크립트 작성

root폴더에 scripts 폴더 생성

appspec 파일에서 실행 시킬 실행 스크립트 또한 작성한다.

 

뱀귤님 코드를 그대로 써서 공부했습니다! 7-1과 7-2번 코드!

 

Github Actions CD: AWS EC2 에 Spring Boot 배포하기

Overview 애플리케이션을 개발하면 외부에서도 접근 가능하도록 클라우드 환경에 배포합니다. 이전에 포스팅 했던 AWS 1편에서는 마지막에 scp 명령어로 로컬에 존재하는 빌드 파일을 EC2 인스턴스

bcp0109.tistory.com

📍 stop.sh (기존에 실행 중이던 파일을 종료)

#!/usr/bin/env bash

PROJECT_ROOT="/home/ubuntu/app"
JAR_FILE="$PROJECT_ROOT/CICD_githubActions-0.0.1-SNAPSHOT.jar"

APP_LOG="$PROJECT_ROOT/application.log"
ERROR_LOG="$PROJECT_ROOT/error.log"
DEPLOY_LOG="$PROJECT_ROOT/deploy.log"

TIME_NOW=$(date +%c)

# build 파일 복사
echo "$TIME_NOW > $JAR_FILE 파일 복사" >> $DEPLOY_LOG
cp $PROJECT_ROOT/build/libs/*.jar $JAR_FILE

# jar 파일 실행
echo "$TIME_NOW > $JAR_FILE 파일 실행" >> $DEPLOY_LOG
nohup java -jar $JAR_FILE > $APP_LOG 2> $ERROR_LOG &                          # 계속 실행되게 nohup으로 실행

CURRENT_PID=$(pgrep -f $JAR_FILE)                                             # nohup으로 실행 후 프로세스 아이디를 얻음
echo "$TIME_NOW > 실행된 프로세스 아이디 : $CURRENT_PID" >> $DEPLOY_LOG

📍 start.sh (새로운 jar파일을 실행)

#!/usr/bin/env bash
# #!은 명령어 집합표시, 뒤는 이 명령어들을 해석할 프로그램 위치와 프로그램

#-------------------------------------------------- 변수 선언 START
PROJECT_ROOT="/home/ubuntu/app"                                             # 종료할 jar파일 위치
JAR_FILE="$PROJECT_ROOT/CICD_githubActions-0.0.1-SNAPSHOT.jar"                                  # 종료할 jar파일 이름

DEPLOY_LOG="$PROJECT_ROOT/deploy.log"                                       # 로그파일 생성

TIME_NOW=$(date +%c)                                                        # 현재시간

# 현재 구동 중인 애플리케이션 pid 확인
CURRENT_PID=$(pgrep -f $JAR_FILE)
#-------------------------------------------------- 변수 선언 END

#-------------------------------------------------- 명령어 START
# 프로세스가 켜져 있으면 종료
if [ -z $CURRENT_PID ]; then
  # 리눅스에서 > 와 >> 의 차이 : > (뒤에 나오는 파일에 write or overwrite), >> (뒤에 나오는 파일에 추가 append)
  echo "$TIME_NOW > 현재 실행중인 애플리케이션이 없습니다" >> $DEPLOY_LOG         # 리눅스 터미널 출력 명령어
else
  echo "$TIME_NOW > 실행중인 $CURRENT_PID 애플리케이션 종료 " >> $DEPLOY_LOG
  kill -15 $CURRENT_PID                                                     # -15 프로세스를 안전하게 종료
fi

 

📌  plain.jar 생성되지 않게 build.gradle 설정

빌드시 일반 jar파일 말고도 plain.jar파일이 하나 더 생성되는 데 이를 방지, 아래 코드를 추가하면 된다.

* plain.jar는 plain archive라고 해서 dependency를 모두 제외한 순수한 소스코드와 리소스만을 가지고 있는 파일 

jar {
    enabled = false
}

 

 

📌  gradle.yml 수정

📍 수정 전

name: Java CI with Gradle

on:                                                               # 워크플로우를 실행할 이벤트 종류와 특정 브랜치 설정
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

permissions:                                                      # 권한 설정
  contents: read

jobs:                                                             # 수행할 워크플로우 
  build:                                                          # 빌드
    runs-on: ubuntu-latest                                        # 빌드가 실행할 OS

    steps:                                                        # 단계 설정
    
    - uses: actions/checkout@v3                                   # 워크플로우 실행전 체크아웃

    - name: Set up JDK 11                                         # JDK 11 버전 설치
      uses: actions/setup-java@v3
      with:
        java-version: '11'
        distribution: 'temurin'

    - name: Grant execute permission for gradlew
      run: chmod +x ./gradlew
      # Build

    - name: Build with Gradle                                     # gradle로 빌드 실행
      uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
      with:
        arguments: build

 

📍 수정 후

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle

name: Java CI/CD with Gradle

on:                                                               # 워크플로우를 실행할 이벤트 종류와 특정 브랜치 설정
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

env:                                                              # 환경 설정
  AWS_REGION: ap-northeast-2
  S3_BUCKET_NAME: littlezerobucket
  CODE_DEPLOY_APPLICATION_NAME: cicd_Test
  CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: cicd_group        # IAM의 CodeDeploy용 역할

permissions:                                                      # 권한 설정
  contents: read

jobs:                                                             # 수행할 워크플로우 
  deploy:                                                         # Deploy
    name: Deploy
    runs-on: ubuntu-latest                                        # 빌드가 실행할 OS
    environment: production

    steps:                                                        # 단계 설정

    # 체크아웃
    - name: Checkout
      uses: actions/checkout@v3                                   # 워크플로우 실행전 체크아웃

    # JDK 11 세팅
    - name: Set up JDK 11                                         # JDK 11 버전 설치
      uses: actions/setup-java@v3
      with:
        java-version: '11'
        distribution: 'temurin'

    # BUILD 권한 부여
    - name: Grant execute permission for gradlew
      run: chmod +x ./gradlew
      # Build

    # BUILD
    - name: Build with Gradle                                     # gradle로 빌드 실행
      uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
      with:
        arguments: clean build

    # AWS 인증
    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ${{ env.AWS_REGION }}

      # 빌드한 파일 S3 버킷에 업로드
    - name: Upload to AWS S3
      run: |
        aws deploy push \
          --application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
          --ignore-hidden-files \
          --s3-location s3://$S3_BUCKET_NAME/$GITHUB_SHA.zip \
          --source .

      # S3 버킷에 올린 파일로 CodeDeploy 실행
    - name: Deploy to AWS EC2 from S3
      run: | 
        aws deploy create-deployment \
          --application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
          --deployment-config-name CodeDeployDefault.AllAtOnce \
          --deployment-group-name ${{ env.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }} \
          --s3-location bucket=$S3_BUCKET_NAME,key=$GITHUB_SHA.zip,bundleType=zip

 

 

 

📌 그리고 아래 발생한 다양한 트러블... 들을 해결하고 나서 드디어 자동 배포 성공! 

 

 트러블 슈팅들 ****  

더보기

*** 1)

Error: The security token included in the request invalid.

 

문제: credential 검증에서 오류

원인: Code Deploy Application Name 값과 Code Deploy Application Group Name을 잘못넣어서 발생

해결: AWS CodeDeploy에서 생성한 애플리케이션 이름과 그 안의 배포 그룹 이름으로 설정해주니 해결

 

📍 둘다 AWS환경 설정 글에서 9번에서 만든 것을 yml에 넣어줘야 한다.  

위에 애플리케이션에서 해당 이름 누르면 있는 배포 그룹

 


 *** 2)

Error: Process completed with exit code 255.

appspec.yml was not found.

 

문제: appspec.yml을 찾지 못해 실행 못함

원인: appspec 파일명을 AppSpec으로 해서 찾지 못함

해결: 파일명을 모두 소문자로 해줬더니 해결

 

 


*** 3)

Error: Process completed with exit code 127.

command not found

 

문제: 요구하는 arguments를 못불러옴

원인: 해당 arguments 앞에 맞지 않는 arguments가 붙어 뒤를 읽지 못함

해결: 불필요한 arguments 삭제로 해결

 

 


*** 4) 

CodeDeploy agent was not able to receive the lifecycle event. Check the CodeDeploy agent logs on your host and make sure the agent is running and can connect to the CodeDeploy server.

- CodeDeploy agent가 라이프사이클 이벤트를 받을 수 없으니 host의 로그를 살펴보라는 내용

 

EC2 로그는 처음 우분투 접속 기준

../../var/log/aws/codedeploy-agent/codedeploy-agent.log 

에 위치하고 있다. 그곳에 써있는 로그를 보면

 

ERROR [codedeploy-agent(1163)]: InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller: Missing credentials - please check if this instance was started with an IAM instance profile

 

문제: github actions에서 Deploy가 성공했음에도 불구하고 실제로 AWS Deploy결과를 봤을 때 ApplicationStop에서 바로 실패한 케이스

원인: IAM 역할을 지정하지 않은 인스턴스에 CodeDeployAgent를 먼저 설치해 버려 CodeDeploy에 해당 역할을 실행할 수 있는 자격 증명이 없어서 생긴 문제

해결: CodeDeploy Agent를 EC2에서 다시 실행 시키면 된다.

 

- 1) 다시 실행

- 2) 상태 확인

sudo service codedeploy-agent restart
sudo service codedeploy-agent status

 

 

 

📌 위에 성공 로그 보다가 든 의문점

이 로그를 보면 현재 실행중인 애플리케이션이 없다고 한다. 하지만 아래처럼 쉘 스크립트를 넣어줬고, 기존 nohup을 죽이고 새로운 빌드 파일로도 변경이되서 nohup으로 돌아가는 상황. 근데 프로세스가 켜져있어서 stop.sh가 kill해줬다면 실행중인 프로세스 아이디와 애플리케이션 종료에 대한 로그도 찍혔어야하는 데 없다. 이미 stop전에 프로세스가 kill이 된 것으로 보인다.

# 프로세스가 켜져 있으면 종료
if [ -z $CURRENT_PID ]; then
  # 리눅스에서 > 와 >> 의 차이 : > (뒤에 나오는 파일에 write or overwrite), >> (뒤에 나오는 파일에 추가 append)
  echo "$TIME_NOW > 현재 실행중인 애플리케이션이 없습니다" >> $DEPLOY_LOG         # 리눅스 터미널 출력 명령어
else
  echo "$TIME_NOW > 실행중인 $CURRENT_PID 애플리케이션 종료 " >> $DEPLOY_LOG
  kill -15 $CURRENT_PID                                                     # -15 프로세스를 안전하게 종료
fi

직접 kill하지 않아도 application을 stop해 주는 로직이 있는 걸까 싶어 이벤트를 보니 ApplicationStop이 마음에 걸린다.

 

혹시 정말 앞에서 해주고 있는 거 아닐까 싶어서

AfterInstall과정에서 stop.sh을 실행할 수 있도록 설정한 yml 파일 부분을 아예 주석처리 해버리고 테스트를 했는데

띠용 잘된다. 앞서 찍힌 로그와 달리 마지막 로그엔 stop.sh에 있는 현재 실행중인 애플리케이션이 없습니다 로그도 없다.  그럼 stop.sh가 없는 버젼으로 잘 실행됬다는 이야기..

 

찾아보니 배포 라이프사이클 이벤트 중에 ApplicationStop은 마지막으로 성공 배포한 버젼에서 appspec file과 스크립트를 가져와서 사용한다고 한다. 이 말은 즉 새로 배포한 파일에서의 applicationStop관련은 이번 배포가 아닌 다음 배포를 위해 적용된다는 뜻이기도 하다. 하지만 나는 전에도 후에도 applicationStop에 kill하는 걸 설정해준 적이 없는데? 아니면 전에 파일을 다시 역행하는 방식? 은.. 아닌거 같고 왜 kill처리를 주석해줬음에도 kill하는게 되는 걸까 궁금해!!

 

이에 대한 내용은 좀 더 조사해봐야할 거 같다. 

 

 

 


 

➕ CI/CD 연습한 깃헙 레포지토리

 

GitHub - littlezero48/CICD_githubActions: CI/CD GithubAction을 연습

CI/CD GithubAction을 연습. Contribute to littlezero48/CICD_githubActions development by creating an account on GitHub.

github.com

 

➕ 공부자료 

 

AWS 1편: EC2 생성 후 Spring Boot 띄우기

Overview AWS EC2 인스턴스를 생성하고 Spring Boot 서버를 띄워보는 것까지 진행합니다. 주 목표는 서버를 외부에 제공하는 거라서 따로 배포 시스템을 구축하지 않고 단순히 빌드 파일을 복사해서 수

bcp0109.tistory.com

 

[SpringBoot] Github Action으로 AWS EC2 자동 빌드/배포하기(CI/CD)

[SpringBoot] Github Action으로 AWS EC2 자동 빌드/배포하기(CI/CD) 빗썸테크아카데미의 강의가 끝나고 팀프로젝트가 시작되었는데, 개발에 앞서 우선 aws에 배포해서 Hello world를 먼저 찍어보고 개발을 하

be-developer.tistory.com

 

'DevOps > CI & CD' 카테고리의 다른 글

CI/CD] 자동 배포 관련 다양한 상태 확인 방법  (0) 2023.01.26
CI/CD] Properties 관리  (1) 2023.01.26
CI/CD] CodeDeploy - AWS 환경 설정  (2) 2023.01.20
CI/CD] Github Actions CI  (0) 2023.01.20

 

필요 요소 구성

 📌  1. EC2  인스턴스 

- ubuntu로 아키텍쳐 64비트, t2.micero 프리티어 서버가 하나 있어서 그걸 사용

(아래 포스팅 때 만들걸 사용)

 

000 - 웹개발 종합반 5주차 (AWS)

5-1 / 5주차 오늘 배울것 버킷리스트 프로젝트로 복습 팬명록을 클라우드 환경에 배포해보기 파일질라 설치하기 : 클라우드 환경에 파일을 올릴 수 있는 프로그램 가비아에서 도메인 구입 5-2 / [

littlezero48.tistory.com

📍 다만, EC2에 태그 설정이 되어있지 않다면 추가적으로 태그 설정 처리

 

 

 📌  2. 키 페어 

- EC2 생성할때 만든거 가지고 있어서 그걸 사용

 

 

📌  3. IAM 사용자 생성 

AWS에서 IAM를 검색

검색 아래에 작은 이모티콘은 검색에서 즐겨찾기 해놓은 것. 없다면 검색해서 찾자.

권한 정책에서

  • AmazonEC2FullAccess
  • AmazonS3FullAccess
  • AWSCodeDeployFullAccess

세개를 조회해 체크하고 다음을 누른다 

 

추가한 3가지 확인한 다음 사용자 생성 클릭

 

 

📌  4. IAM 액세스 키 생성 

 

************* 액세스 키는 생성하면 그 순간에만 볼 수 있고 다운받을 수 있다. 다운받아 잘 보관해두자.

 

 

📌  5. IAM 역할 생성 - EC2 용 

📍 1단계

📍 2단계

  • AmazoneS3FullAccess
  • AWSCodeDeployFullAccess

검색해서 체크

📍3단계 

역할 이름 설정과 추가한 권한만 체크하고 역할 생성

 

📍 EC2 인스턴스 가서 IAM 설정

작업 > 보안 > IAM 역할 수정

 

 

📌  6. IAM 역할 생성 - Code Deploy 용

역할을 한개 더 생성해야 한다.

사용사례와 이름만 설정하고 역할 생성 클릭

 

 

 📌  7. EC2  셋팅

EC2 접속!

📍 home/ubuntu/ 위치에 app폴더 생성

 

📍 apt 업데이트하고 패키지들 설치

- 1) apt 업데이트 apt은 ubuntu 패키지 관리 툴

- 2) ruby-full 설치 : 프로그래밍 언어인 ruby를 설치 (중간에 설치를 계속할껀지 물음 / 중간에 보라색화면 나오면 선택사항이 하나인 화면은 Enter 넘어가고 뒤에 뭔가 여러가지 사항이 나오는 화면은 tap을 이용해 ok로 이동해서 enter누르면 이미 자동으로 선택된 사항에 대해서 적용해 재시작한다.) 

- 3) wget 설치 : HTTP/FTP를 사용해서 서버에서 파일을 내려받기 위한 오픈소스

sudo apt update
sudo apt install ruby-full
sudo apt install wget

 

**** 참고: 이후 작업이 apt으로 안되서 dpkg(데비안 패키지)로 설치

📍 Code Deploy Agent 다운

- 1) wget 사용해 Codedeloy서버 URL에서 codedeploy-agent_1.3.2-1902_all.deb 을 다운

(dep은 우분투에서 파일 패키지 프로그램으로 설치가 가능한 파일, 저 Url은 각자 주소 아니고 설치 파일받는 공통주소인데 아시아 태평양(서울) 지역 기준 )

- 2) 폴더 하나를 생성

- 3) dpkg-deb은 deb파일을 명시한 폴더에 파일시스템 트리 그대로 풀어둔다.

(-R 옵션은 --recursive 옵션과 동일한 것으로 단어 뜻은 재귀를 의미한다. 이 옵션은 앞의 명령어를 해당 디렉토리 뿐만 아니라 그 디렉토리에 포함된 하위 디렉토리에도 모두 적용시키는 옵션이다)

wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/releases/codedeploy-agent_1.3.2-1902_all.deb
mkdir codedeploy-agent_1.3.2-1902_ubuntu22
dpkg-deb -R codedeploy-agent_1.3.2-1902_all.deb codedeploy-agent_1.3.2-1902_ubuntu22

 

📍 루비 3.0으로 사용할 수 있게 dep파일 dependency 수정해서 빌드하고 설치

- 1) sed : Stream Editor의 약자로 명령어로 원본 텍스트 파일을 편집하는 명령어. 맨 뒤에 지정한 파일을 가져와 앞에 ''(작은따옴표) 안의 내용으로 수정하여 -i 옵션을 통해 수정을 반영한다. (디펜던시를 수정해 ruby 3.0으로 적용)

- 2)  -b는 --build와 똑같은 옵션으로 지정한 폴더를 deb 패키지로 빌드한다.

- 3) 지정한 deb파일을 설치 (-i 옵션은 인스톨 옵션)

sed 's/Depends:.*/Depends:ruby3.0/' -i ./codedeploy-agent_1.3.2-1902_ubuntu22/DEBIAN/control
dpkg-deb -b codedeploy-agent_1.3.2-1902_ubuntu22/
sudo dpkg -i codedeploy-agent_1.3.2-1902_ubuntu22.deb

 

📍 확인

- 1) 서비스 목록 중 타입이 service이면서 codedeploy가 포함된 목록을 조회

( systemctl는 systemd(system daemon)을 관리하는 명령어 

list-units은 서비스 목록 보는 명령어로 뒤에 붙는 옵션으로 필터링해서 조회가 가능하다 )

- 2) codedeploy-agent의 상태를 조회한다.

(service 명령어는 등록된 서비스를 관리하는 명령어로 service [서비스명] 에 start / stop / restart / status 등의 옵션을 더해 시작, 중지, 재시작, 상태조회를 할 수 있다.)

systemctl list-units --type=service | grep codedeploy
sudo service codedeploy-agent status

위와 같이 상태를 확인 할 수 있게 됬다면 성공!

 

트러블슈팅 : apt으로 하는 방법이 아래와 같은 문제가 생겨 apt으로 진행하다가 문제가 생겨 dpkg로 진행. 아래 더보기글 내용은 이런일이 있었다~ 참고만 하세요-

더보기

📍 code deploy 설치 파일을 해당 url에서 다운 받음

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

 

📍install 폴더에서

- 1) install 폴더의 권한을 변경

- 2) 해당 폴더를 자동을 실행시켜 설치 진행

chmod +x ./install
sudo ./install auto

에러.... 

앗, Ruby version이 지금 3.0.2인데 필요한건 2.x 이라고 ㅠ

해결하는 방법은 EC2 인스턴스 자체를 낮추거나, 파일을 수정해서 Ruby 3.0을 쓸 수 있게 하는 방법 이 있는데

나는 후자를 선택

 

📌  8. 올릴 프로젝트에 맞는 환경 설정

프로젝트가 JDK 11버전을 사용하므로 11버젼 설치 및 확인

sudo apt-get install openjdk-11-jdk
java -version

 

 

📌  9.  CodeDeploy 

AWS에서 CodeDeploy를 검색 

AWS 서비스를 사용할 때는 항상 서버가 서울인지 확인!! 안그럼 일 2번해야 

 

📍 배포 > 애플리케이션 > 애플리케이션 생성

 

📍 배포 그룹 생성

 +  마지막에 로드 밸런서에 대한 선택할 수 있는 요소가 없어서 활성화 체크를 해제. 나중에 문제가 생기면 다시 수정

 

배포 그룹 생성 클릭하여 생성!

 

 


AWS에서 CD에 필요한 환경 설정은 여기까지고 다음 글 부터 github에 적용하는 방법과 프로젝트에 추가할 파일에 대해 정리.  

 

 


참조 자료 (아영님 고마워요): 

 

Github Actions CD: AWS EC2 에 Spring Boot 배포하기

Overview 애플리케이션을 개발하면 외부에서도 접근 가능하도록 클라우드 환경에 배포합니다. 이전에 포스팅 했던 AWS 1편에서는 마지막에 scp 명령어로 로컬에 존재하는 빌드 파일을 EC2 인스턴스

bcp0109.tistory.com

 

[SpringBoot] Github Action으로 AWS EC2 자동 빌드/배포하기(CI/CD)

[SpringBoot] Github Action으로 AWS EC2 자동 빌드/배포하기(CI/CD) 빗썸테크아카데미의 강의가 끝나고 팀프로젝트가 시작되었는데, 개발에 앞서 우선 aws에 배포해서 Hello world를 먼저 찍어보고 개발을 하

be-developer.tistory.com

 

CodeDeploy agent is not supporting ruby v3.0.1 · Issue #301 · aws/aws-codedeploy-agent

When I tried to install codedeploy agent on my server: $ bundle install Fetching gem metadata from http://rubygems.org/........... Resolving dependencies... Bundler found conflicting requirements f...

github.com

 

'DevOps > CI & CD' 카테고리의 다른 글

CI/CD] 자동 배포 관련 다양한 상태 확인 방법  (0) 2023.01.26
CI/CD] Properties 관리  (1) 2023.01.26
CI/CD] CodeDeploy - 적용 과정  (1) 2023.01.24
CI/CD] Github Actions CI  (0) 2023.01.20

 

📌 Workflow 선택

깃헙에서 Actions > gradle 검색 > java with Gradle 의 Cofigure 클릭

 

📌 Workflow 선택

📍 yml이 뭔 파일이지?

Yet another Markup Language의 약자로 yml 또는 yaml 확장자로 사용된다. 여러 configuration을 한 파일에서 관리하기 위한 파일로 yaml문법을 사용하여 구성한다. 기본적으로 key-value로 구성되어 있고 json과 상위 호환되어 시퀀스(배열,리스트), 매핑이 가능하다.

 

아래 gradle.yml 구성을 보면

  • on : 이 워크플로우가 수행될 깃헙 이벤트를 결정 
  • permissions : 권한 설정
  • jobs : 수행할 워크플로우들을 차례대로 입력

 

📌 PR test

브랜치를 하나 새로 만들어 워크플로우 이벤트에 반응하게 main에 PR을 해봤다 그런데 앗, 트러블 발생!

 

Detail를 보니 gradle에서 예외발생. 빌드시 권한이 없어서 발생하는 문제라고..

 

gradle.yml 파일에 Build with Gradle 이전에  gradlew 권한을 부여하는 워크플로우를 추가한다.

    - name: Grant execute permission for gradlew
      run: chmod +x ./gradlew

 

그럼 스무스하게 성공~ 

'DevOps > CI & CD' 카테고리의 다른 글

CI/CD] 자동 배포 관련 다양한 상태 확인 방법  (0) 2023.01.26
CI/CD] Properties 관리  (1) 2023.01.26
CI/CD] CodeDeploy - 적용 과정  (1) 2023.01.24
CI/CD] CodeDeploy - AWS 환경 설정  (2) 2023.01.20

+ Recent posts