You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
name: CICD Test
run-name: Running
on:
push:
branches:
- production
- 'releases/**'
name은 깃허브액션 단계에서 단계를 나눠주는 네이밍적 요소로, 코드의 개념이 아닌 주석의 개념으로 바라봐야 한다. 해당 코드에서는 releases 브랜치에 코드가 배포되는 시점을 기준으로 , 깃허브 액션이 발생한다. aws-region: ${{ env.AWS_REGION }} 해당 지역을 나타내는 코드에 env에서 설정해둔 지역값을 가져도도록 변수로 사용했다. env.AWS_REGION -> ap-northeast-2
jobs에서는 실행할 명령어들의 집합이 나온다 여기에서 주목해야할 점은 ubuntu-20.04 이다 . 해당 환경은 리눅수 우분투이므로 우리는 결국 리눅스 셀스크립트를 사용하여서 배포 명령어들을 입력할 것이다. 즉 해당 스크립트를 이해하려면 해당 명령어들을 리눅스 명령어로 보고서 하나하나 구글링이나 gpt해보면 된다.
이는 리눅스의 표준 입출력 명령어이다. echo는 자바의 system.out.println과 같다. echo 명령어의 자세한 설명은 해당 블로그를 참고하자. 리눅스 echo 명령어
해당 소스코드는 깃허브 시크릿에 저장되 AWS_YML_CONTENT의 내용을 출력하여서 ./src/main/resources/application.yml 해당 파일에다가 이어쓰기로 저장된다,
(중요한 점은 >> 두개는 이어쓰기로 저장하는 리다이렉션 명령어 이고. > 한개는 덮어쓰기로 저장하는 리다이렉션 명령어 라는 점이다. 반드시 >> 두개를 쓰도록 하자.)
이후에 cat ./src/main/resources/application.yml
CAT 명령어를 통해서 해당 파일이 제대로 수정되었는지 체크하는 디버깅 명령어를 하나 추가해두었다. (이 명령어는 지워도 정상 작동한다.)
해당 명령어를 통해서 s3에 업로드, ec2에 배포가 진행된다.
하지만 해당과정을 통해서 s3에 압축 업로드된 jar파일 ec2 서버에 옮겨지는 과정일뿐. 해당 jar파일을 실행시켜서 스프링부트를 ec2 리눅스 서버에 띄우지는 않는다. (해당 명령어는 굉장히 복잡한 옵션과 변수들로 이루어졌다. 해당 명령어를 복붙하여서 gpt로 돌려보면 각 옵션들과 변수들이 어떤 의미인지 구체적으로 알 수 있다>)
즉. 해당 코드에 따르면 설치가 끝난후에는 , stop.sh(기존에 실행중이던 스프링 부트 애플리케이션 종료하기)
#!/bin/bash
ROOT_PATH="/home/ubuntu/spring-github-action"
JAR="$ROOT_PATH/application.jar"
STOP_LOG="$ROOT_PATH/stop.log"
SERVICE_PID=$(pgrep -f $JAR) # 실행중인 Spring 서버의 PID
NOW=$(date +%c)
if [ -z "$SERVICE_PID" ]; then
echo " [$NOW] 서비스 NouFound" >> $STOP_LOG
else
echo " [$NOW] [$SERVICE_PID] 서비스 종료 " >> $STOP_LOG
kill "$SERVICE_PID"
# kill -9 $SERVICE_PID # 강제 종료를 하고 싶다면 이 명령어 사용
fi
스타트 이후에는 , start.sh(새롭게 옮겨온 jar 파일 실행시켜서 업데이트 된 서버 띄우기)로 스프링 부트 애플리케이션을 시작한다.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
-
깃허브 액션 자동배포 설정
해당 게시글을 통해서 파트1을 통해서 자동배포 인프라의 기본설정까지 마치게 되면은 이제부터는 우분투 스크립트를 마주하게 된다.
우선 배포 스크립트이다.
name: CICD Test run-name: Running on: push: branches: - production - 'releases/**' env: AWS_REGION: ap-northeast-2 AWS_S3_BUCKET: app-release-files AWS_CODE_DEPLOY_APPLICATION: cicid-test-CD AWS_CODE_DEPLOY_GROUP: cicd-test-CD-group jobs: build-with-gradle: runs-on: ubuntu-20.04 steps: - name: production 브랜치로 이동 uses: actions/checkout@v3 with: ref: production - name: JDK 17 설치 uses: actions/setup-java@v3 with: java-version: '17' distribution: 'corretto' - name: gradlew에 실행 권한 부여 run: chmod +x ./gradlew - name: 프로젝트 빌드 run: ./gradlew clean build -x test - name: AWS credential 설정 uses: aws-actions/configure-aws-credentials@v1 with: aws-region: ${{ env.AWS_REGION }} aws-access-key-id: ${{ secrets.CICD_ACCESS_KEY }} aws-secret-access-key: ${{ secrets.CICD_SECRET_KEY }} - name: S3에 업로드 run: aws deploy push --application-name ${{ env.AWS_CODE_DEPLOY_APPLICATION }} --ignore-hidden-files --s3-location s3://$AWS_S3_BUCKET/cicdtest/$GITHUB_SHA.zip --source . - name: EC2에 배포 run: aws deploy create-deployment --application-name ${{ env.AWS_CODE_DEPLOY_APPLICATION }} --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name ${{ env.AWS_CODE_DEPLOY_GROUP }} --s3-location bucket=$AWS_S3_BUCKET,key=cicdtest/$GITHUB_SHA.zip,bundleType=zipname은 깃허브액션 단계에서 단계를 나눠주는 네이밍적 요소로, 코드의 개념이 아닌 주석의 개념으로 바라봐야 한다. 해당 코드에서는 releases 브랜치에 코드가 배포되는 시점을 기준으로 , 깃허브 액션이 발생한다. aws-region: ${{ env.AWS_REGION }} 해당 지역을 나타내는 코드에 env에서 설정해둔 지역값을 가져도도록 변수로 사용했다. env.AWS_REGION -> ap-northeast-2
환경
codedeploy 환경을 설정해둔다. env는 환경변수를 매핑해두는 곳이기도 하다. 즉 이후에 스크립트 상에서 환경변수를 오른쪽에 있는 value값을 대신하여 환경변수 이름값으로 사용하게 된다. 대표적으로 밑의 스크립트상에서
jobs에서는 실행할 명령어들의 집합이 나온다 여기에서 주목해야할 점은 ubuntu-20.04 이다 . 해당 환경은 리눅수 우분투이므로 우리는 결국 리눅스 셀스크립트를 사용하여서 배포 명령어들을 입력할 것이다. 즉 해당 스크립트를 이해하려면 해당 명령어들을 리눅스 명령어로 보고서 하나하나 구글링이나 gpt해보면 된다.
해당 부분에서는 깃허브에 시크릿에 미리 설정해둔 키값을 가져와서 주입한다.
우리는 여기서에서 이 yml 파일을 실행시키는 주체가 깃허브이고, 깃허브 시크릿값에 접근이 가능함을 알 수 있다, 그러므로 만약 applicaton 프로퍼티의 값이 암호화 되어있다면 해당 복호화 키를 여기에서 주입할 수 있을것이다.
시크릿 키를 주입하는 명령어를 작성해보자 >
이는 리눅스의 표준 입출력 명령어이다. echo는 자바의 system.out.println과 같다. echo 명령어의 자세한 설명은 해당 블로그를 참고하자. 리눅스 echo 명령어
해당 소스코드는 깃허브 시크릿에 저장되 AWS_YML_CONTENT의 내용을 출력하여서 ./src/main/resources/application.yml 해당 파일에다가 이어쓰기로 저장된다,
(중요한 점은 >> 두개는 이어쓰기로 저장하는 리다이렉션 명령어 이고. > 한개는 덮어쓰기로 저장하는 리다이렉션 명령어 라는 점이다. 반드시 >> 두개를 쓰도록 하자.)
이후에 cat ./src/main/resources/application.yml
CAT 명령어를 통해서 해당 파일이 제대로 수정되었는지 체크하는 디버깅 명령어를 하나 추가해두었다. (이 명령어는 지워도 정상 작동한다.)
해당 코드를 적절한 위치에 깃허브 액션 YML 스크립트에 추가하면 된다.
해당 명령어를 통해서 s3에 업로드, ec2에 배포가 진행된다.
하지만 해당과정을 통해서 s3에 압축 업로드된 jar파일 ec2 서버에 옮겨지는 과정일뿐. 해당 jar파일을 실행시켜서 스프링부트를 ec2 리눅스 서버에 띄우지는 않는다. (해당 명령어는 굉장히 복잡한 옵션과 변수들로 이루어졌다. 해당 명령어를 복붙하여서 gpt로 돌려보면 각 옵션들과 변수들이 어떤 의미인지 구체적으로 알 수 있다>)
이제 마지막 단계로 3개의 스크립트가 등장한다.
첫번째로, CODE DEPLOY의 역할을 나타내는 스크립트이다.
해당 스크립트는 destination: /home/ubuntu/spring-github-action
해당 폴더로 압축파일화된 JAR파일을 옮겨줌과 동시에
해당 코드를 통해서 설치(DEPLOY 작업상에서 하게되는 작업을 나타낸다.)
즉. 해당 코드에 따르면 설치가 끝난후에는 , stop.sh(기존에 실행중이던 스프링 부트 애플리케이션 종료하기)
스타트 이후에는 , start.sh(새롭게 옮겨온 jar 파일 실행시켜서 업데이트 된 서버 띄우기)로 스프링 부트 애플리케이션을 시작한다.
이제 본인이 설정해둔 브랜치에 새롭게 커밋을 하고 액션과정을 지켜보자.
서버가 제대로 종료되고 새로운 서버가 업데이트 되는지 확인하려면
해당 스크립트에서 해당 로그들을 종료시에는
stop.log에 저장하고,
새로운 서버의 시작은
start.log에 저장하므로 ec2 서버에서 해당 명령어로
cat start.log , cat stop.log
로 로그를 보면된다,
결국 서버배포는 대부분 리눅스 기반의 환경에서 이루어진다. 리눅스 셀스크립트 명령어들을 이해하게 되면 깃허브 액션을 통한 자동배포 과정이 쉽게 이해될것이다.
Beta Was this translation helpful? Give feedback.
All reactions