❔ 다루지 않는 내용
1. EC2 설치 및 연결
2. AWS S3 셋팅
🔷 진행 순서
1. IAM 사용자 추가 및 GitHub 프로젝트에 Action Secret키 설정
2. EC2에 Code Deploy Agent 설치 + IAM 역할 부여
3. Code Deploy 생성 및 IAM 역할 부여
4. gitignore에 없는 파일 관리 (외부에 공개되지 않아야 하는 정보 관리)
5. GitHub Action yml 파일 등록
6. [배포] appspec.yml 및 deploy.sh 작성
7. Github Action 실행
1. S3와 CodeDeploy 권한을 부여받은 IAM 사용자 추가
- 가장 먼저 S3와 CodeDeploy 권한을 부여받은 사용자를 생성합니다.
- 사용자를 추가합니다. 이 때 사용자 이름은 자유롭게 적어줍니다.
- 'AmazonS3FullAccess', 'AWSCodeDeployFullAccess' 를 선택합니다.
- 검토내용 확인 후 추가합니다.
- 추가가 완료되었으면 Access Key와 Secret Key를 받게 됩니다. 해당 키를 복사합니다.
- 복사한 키는 Github Action을 적용할 Repository의 Settings에서 적용이 가능합니다
- Settings -> Secrets 에서 아래와 같이 2개를 추가해줍니다.
- 해당 정보를 이용해서 S3에 업로드 하고 Deploy를 할 예정입니다.
2. EC2에 Code Deploy Agent 설치 + IAM 역할
- EC2는 기존에 셋팅되었다는 상태에서 진행하겠습니다.
- 가장 먼저 EC2에 CodeDeploy Agent를 설치합니다.
# java11을 사용할 것이므로 11을 설치합니다.
sudo apt install openjdk-11-jdk
# Time zone을 설정합니다.
sudo rm /etc/localtime
sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime
# CodeDeploy Agent 설치
sudo apt-get install -y ruby
sudo apt-get install -y wget
# AWS S3 버킷 identifier 받아오기
cd ~
wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto
sudo service codedeploy-agent status # 정상적으로 실행되는지 확인
- 다음으로 EC2에 대해서도 S3, CodeDeploy 역할을 부여합니다.
- IAM 사용자 만들 때 처럼 두 정책을 검색해서 적용합니다.
- 태그를 추가합니다.
- 역할 이름을 지정하고 나머지 항목 검토 후 이상이 없으면 역할을 생성합니다.
- EC2에 IAM 역할을 부여해보겠습니다.
- EC2 인스턴스에서 마우스 우측클릭 -> 보안 -> IAM 역할 수정 클릭
- 방금 만들어두었던 IAM 역할을 적용시킵니다.
3. Code Deploy 생성 및 IAM 역할 부여
- Code Deploy에도 지정할 IAM 역할을 먼저 만듭니다.
- CodeDeploy를 선택합니다.
- AWSCodeDeployRole 역할이 있는 것을 확인합니다.
- 태그를 생성합니다.
- 역할 이름 지정 후 이상이 없는지 검토 후 생성합니다.
- 이렇게 하면 CodeDeploy에 적용할 IAM 역할이 생성됩니다.
- CodeDeploy를 생성해보겠습니다.
- 애플리케이션 이름 설정 후 EC2로 설정합니다.
- 생성 후 '배포 그룹 생성'으로 진행합니다.
- '서비스 역할'에서 방금 생성한 IAM 역할을 부여합니다.
- EC2에 적용한 태그 key값을 CodeDeploy에서 선택합니다.
- 그 외 설정은 이미지를 참고해주세요.
이렇게 해서 Code Deploy까지 생성하였습니다.
환경은 다 갖추었으니 이제는 Github Action을 써 볼 차례입니다.
[번외] 4. gitignore에 없는 파일 관리 (외부에 공개되지 않아야 하는 정보 관리)
- spring boot의 경우 DB 접속정보, 키값 등등 .gitignore에 등록되어 있는 설정파일(yml)들이 있습니다.
- 설정파일들이 업로드되지 않고 github action을 진행하게 되면 설정정보가 없기 때문에 fail 합니다.
- 따라서 gpg를 이용해서 암호화 후에 git에 업로드를 합니다.
- 만일 gitignore에 등록된 필수 설정파일들이 없는 경우라면 해당 과정은 건너뛰어도 좋습니다.
# application-prod.yml 파일을 업로드한다고 가정하겠습니다.
# 1) 설정파일을 압축합니다.
tar cvf application.tar application-prod.yml
# 2) application.tar 파일을 .gitignore에 등록합니다.
# 3) 압축파일을 암호화합니다.
gpg -c application.tar
# 4) git에 업로드합니다.
git add -A
git commit -m "[commit comment]"
git push origin [branch name]
# 5) 3번 암호화 단계에서 사용한 비밀번호를 github Secret Key로 등록합니다.
# 6) 이후 CI workflow 과정에서 압축해제하는 스크립트를 집어넣으면 됩니다.
5. Github Action을 위한 파일 작성 ( workflow yml파일, appspec.yml, deploy.sh )
- Github Action을 설정할 Repository에서 Actions -> New workflow 를 선택합니다.
- 해당 방식도 가능하며, 아래 방식처럼 '.github/workflows/' 에서 만드셔도 됩니다.
- workflow 파일을 아래를 참고하여 작성합니다.
- .github/workflows/test-1.0.0.yml
name: deploy-test-1.0.0 # workflow 이름 (필수 아님)
# test-1.0.0 브랜치에 push 이벤트가 발생한다면 실행
on:
push:
branches: [ test-1.0.0 ]
# 환경변수 설정
env:
S3_BUCKET_NAME: [버킷 이름]
PROJECT_NAME: [github 프로젝트 이름]
RESOURCE_PATH: /home/runner/work/$PROJECT_NAME/$PROJECT_NAME/src/main/resources
jobs:
build:
runs-on: ubuntu-18.04 # 해당 job은 ubuntu 18.04에서 실행
steps:
- name: Checkout # github에서 파일들을 가져옴
uses: actions/checkout@v2
- name: Decrypt application yml # (4번 참고) 암호화 했던 설정파일 복호화
run: gpg --quiet --batch --yes --always-trust --decrypt --passphrase=${{ secrets.APPLICATION_YML }} --output $RESOURCE_PATH/application.tar $RESOURCE_PATH/application.tar.gpg
shell: bash
- name: Unzip application yml # 설정파일 압축 해제
run: tar xvf $RESOURCE_PATH/application.tar
shell: bash
- name: Set up JDK 11 # java 11 설정
uses: actions/setup-java@v1
with:
java-version: 11
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
shell: bash
- name: Clean with Gradle
run: ./gradlew clean
shell: bash
- name: Build with Gradle
run: ./gradlew build
shell: bash
- name: Test with Gradle
run: ./gradlew test
shell: bash
- name: Make zip file #1 # build한 파일 모두 압축
run: zip -qq -r ./$GITHUB_SHA.zip .
shell: bash
- name: Configure AWS credentials #2 # AWS IAM 사용자 정보 설정
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: ${{ secrets.AWS_REGION }}
- name: Upload to S3 #3 # S3에 업로드
run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$S3_BUCKET_NAME/$PROJECT_NAME/$GITHUB_SHA.zip
- name: Code Deploy #4 # Code Deploy
run: aws deploy create-deployment --application-name chabak-map-deploy --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name chabak-map-deploy-group --s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=$PROJECT_NAME/$GITHUB_SHA.zip
- workflow 파일 작성 후 프로젝트 최상단에 appspec.yml, deploy.sh 파일을 생성합니다.
- appspec.yml은 CodeDeploy 설정파일로써 배포 할 때 특정 쉘을 실행시킬 수 있습니다.
- 그 특정 쉘을 deploy.sh로 지정하겠습니다.
- appspec.yml
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/git-action-test # 인스턴스에서 파일이 저장될 위치
overwrite: yes
permissions:
- object: /home/ubuntu/git-action-test
# pattern: "**"
owner: ubuntu
group: ubuntu
mode: 755
hooks:
AfterInstall:
- location: deploy.sh # locaiton 기준 => project root 디렉토리
timeout: 60
runas: root
- deploy.sh 예시
#!/bin/bash
REPOSITORY=/home/ubuntu/git-action-test
cd $REPOSITORY
APP_NAME=demo
JAR_NAME=$(ls $REPOSITORY/build/libs/ | grep '.jar' | tail -n 1)
JAR_PATH=$REPOSITORY/build/libs/$JAR_NAME
# =====================================
# 현재 구동 중인 application pid 확인
# =====================================
CURRENT_PID=$(pgrep -fl demo | grep java | awk '{print $1}')
if [ -z "$CURRENT_PID" ]; then
echo "NOT RUNNING"
else
echo "> kill -9 $CURRENT_PID"
kill -15 $CURRENT_PID
sleep 5
fi
echo "> $JAR_PATH 배포"
nohup java -jar $JAR_PATH > /dev/null 2> /dev/null < /dev/null &
6. 결과
- repository에 push하여 빌드가 잘 되는지 확인합니다.
- 빌드에 성공했다면 code deploy에 의해 자동으로 배포까지 되는 것을 볼 수 있습니다.
길고 긴 여정이 끝났습니다.
코드는 아래 git을 통해 확인하실 수 있습니다.
https://github.com/hjun-park/git-action-test
😂😂😂
참고
[1] https://wbluke.tistory.com/39?category=418851
[2] https://sys09270883.github.io/ci/cd/78/
'Git' 카테고리의 다른 글
[CI/CD 구축 1/2] Git Action 문법 정리 (0) | 2021.11.18 |
---|