HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
♥️
2기 최종 프로젝트 팀별 공간
/
💸
10원모아10조❗️
/
🏝️
Back End
/
🧨
CI / CD
🧨

CI / CD

 
CI - Github Actions 사용CD처리 과정1. main, develop 브랜치에 push 또는 pull request 요청시 CI 수행2. appspec.yml을 해석하여 배포수행3. hooks에 위치한 스크립트 수행4. 결과 확인외부 설정 관리깃 모듈 적용 방법submodule 에 push하기 전 write권한이 필요합니다 !
 

CI - Github Actions 사용


  • checkstyle
  • gradle build
  • Jacoco
 

CD


notion image
 

처리 과정


1. main, develop 브랜치에 push 또는 pull request 요청시 CI 수행

tenwonmoa-ci.yml
name: Tenwonmoa CI-CD with Gradle on: push: branches: [ "main", "develop" ] pull_request: branches: [ "main", "develop" ] # 변수 설정 env: S3_BUCKET_NAME: tenwonmoa-cd CODE_DEPLOY_APPLICATION_NAME: tenwonmoa-app CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: tenwonmoa-deploy-group DEPLOY_ZIP_FILE: tenwonmoa-boot-service.zip permissions: contents: read jobs: tenwonmoa-ci-cd: runs-on: ubuntu-latest #[1] steps: - name: Checkout repository and submodules uses: actions/checkout@v2 with: token: ${{ secrets.CI_ACCESS_TOKEN }} submodules: true - uses: actions/checkout@v3 - name: Set up JDK 11 uses: actions/setup-java@v3 with: java-version: '11' distribution: 'temurin' - name: build docker-compose run: docker-compose up -d #[2] - name: Build with Gradle uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1 with: arguments: build #[3] - name: Make zip file run: | mkdir -p before-deploy/ cp appspec.yml before-deploy/ cp scripts/*.sh before-deploy/ cp build/libs/*.jar before-deploy/ cd before-deploy && zip -r before-deploy * cd ../ && mkdir -p deploy mv before-deploy/before-deploy.zip deploy/$DEPLOY_ZIP_FILE - 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_ID }} aws-region: ${{ secrets.AWS_REGION }} #[4] - name: Upload to S3 run: aws s3 cp --region ${{ secrets.AWS_REGION }} ./deploy/$DEPLOY_ZIP_FILE s3://$S3_BUCKET_NAME/$DEPLOY_ZIP_FILE #[5] - name: Code Deploy run: | aws deploy create-deployment \ --deployment-config-name CodeDeployDefault.AllAtOnce \ --application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \ --deployment-group-name ${{ env.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }} \ --s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=$DEPLOY_ZIP_FILE
  • [1] submodue사용을 위한 설정
  • [2] build (with Gradle)
  • [3] 프로젝트를 zip파일 만들기
  • [4] zip파일을 S3 업로드
  • [5] CodeDeploy 배포 생성
 

2. appspec.yml을 해석하여 배포수행

appspec.yml
version: 0.0 os: linux files: - source: / destination: /home/ubuntu/app/zip overwrite: yes permissions: - object: / pattern: "**" owner: ubuntu group: ubuntu hooks: ApplicationStart: - location: deploy.sh timeout: 60 runas: ubuntu
 

3. hooks에 위치한 스크립트 수행

deploy.sh
#!/bin/bash REPOSITORY="/home/ubuntu/app" PROJECT_NAME="tenwonmoa" echo "> Build 파일 복사" cp $REPOSITORY/zip/*.jar $REPOSITORY/ echo "> 현재 구동 중인 애플리케이션 pid 확인" CURRENT_PID=$(pgrep -fl $PROJECT_NAME | grep java | awk '{print $1}') 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" echo "> $JAR_NAME 실행권한 추가" sudo chmod +x $JAR_NAME echo "> $JAR_NAME 실행" ## docker 실행해야 함. nohup java -jar -Dspring.profiles.active=dev $JAR_NAME --server.port=8080 \ $JAR_NAME > $REPOSITORY/nohup.out 2>&1 &
  • Jar파일을 수행시킨다.
 

4. 결과 확인

  • CI
    • github의 Actions 탭에서 확인한다.
    • CodeDeploy의 실패, 성공 결과는 CI Workflow에 영향을 주지 않는다.
      • CD가 실패해도 CI는 성공할 수 있다.
  • CD
    • AWS → CodeDeploy → 배포
      • 애플리케이션: tenwonmoa-app
      • 배포 그룹: tenwonmoa-deploy-group
 
 

외부 설정 관리

  • github 서브모듈 사용
    • 참조
  • private repository에 저장 후, 메인 Repository 서브로 두어 참조하도록 함.
  • 서브모듈 ci적용 방식
    • private 서브모듈 체크아웃 방식
      • 개인계정으로 token발급 후, 레파지토리 secret에 key 설정 함.
 

깃 모듈 적용 방법

# main project에서 # 명령 전후로 'git config --list --local'를 확인해 보자 # 서브모듈 시작 git submodule init # 이 과정에서 private repository의 경우 github ID, password를 물어볼 수 있습니다. # clone submodules git submodule update # 모든 서브모듈에서 main으로 checkout 한다 (당신은 master branch일지도) git submodule foreach git checkout main ## 업데이트 할 때 # 메인프로젝트 루트에서 git submodule update --remote --merge # --remote 뒤에 특정 레포지토이름을 인자로 주어 특정 submodule만 적용할 수 있다. # --init 옵션을 준다면 현재 메인 프로젝트 커밋이 바라보고 있는 내용을 clone한다. --remote는 서브모듈 레포지토리의 최신 커밋을 가져온다. # --merge
 
※ 주의
서브모듈에서 먼저 push 후 프로젝트 폴더로 돌아와서 커밋 작업
 

submodule 에 push하기 전 write권한이 필요합니다 !

git remote set-url origin https://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@github.com/prgrms-web-devcourse/10wonmoa-BE-Security .git