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

처리 과정
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