secrets 등록
공개되면 안되는 값들을 이 곳에 작성해준다. 나는 프로퍼티 파일도 여기에 등록했다.
Git actions / yml 파일 등록
name: Java CI with Gradle
on:
push:
branches: [ "ojyojy" ]
pull_request:
branches: [ "ojyojy" ]
jobs:
build:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v1
with:
java-version: 11
## create application.properties
- name: make application.properties
if: true # branch가 develop일 때
run: |
cd ./src/main/resources
touch ./application.properties
echo "${{ secrets.PROPERTIES_DEV }}" > ./application.properties
shell: bash
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
shell: bash
#build
- name: Build with Gradle
run: ./gradlew build
shell: bash
빌드 단계에서 contextLoads() FAILED 에러가 뜬다면 프로퍼티 파일이 제대로 올라가지 않은 것이다.
이 외에도 NullPointerException이 뜨면서 테스트를 통과하지 못하는 경우가 있었는데 해당코드만 주석처리하고 넘어갔다.
(로컬에서는 잘돌아간다.)
IAM 등록
사용자 추가를 해야한다.
다음 페이지에서 나온 엑세스 키 ID와 비밀번호를 꼭 저장 해두어야한다.
s3 버킷 생성
버킷은 퍼블릭 엑세스 차단이 잘되었는지만 확인 후 모두 디폴트 값으로 생성한다.
Git actions / yml 추가
env 태그가 누락되지 않게 잘 확인하자.
name: Java CI with Gradle
on:
push:
branches: [ "ojyojy" ]
pull_request:
branches: [ "ojyojy" ]
env:
PROJECT_NAME: hanghae99Homework02
BUCKET_NAME: hanghae99bucket
jobs:
build:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v1
with:
java-version: 11
## create application.properties
- name: make application.properties
if: true # branch가 develop일 때
run: |
# spring의 resources 경로로 이동
cd ./src/main/resources
touch ./application.properties
# GitHub-Actions에서 설정한 값을 application-dev.properties 파일에 쓰기
echo "${{ secrets.PROPERTIES_DEV }}" > ./application.properties
shell: bash
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
shell: bash
#build
- name: Build with Gradle
run: ./gradlew build
shell: bash
- name: Make Zip File
run: zip -qq -r ./$GITHUB_SHA.zip .
shell: bash
- 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: ap-northeast-2
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$BUCKET_NAME/$PROJECT_NAME/$GITHUB_SHA.zip
ec2용 IAM 사용자 등록
역할 만들기
ec2 서버에 IAM 사용자 등록
ec2서버가 만들어져 있다고 가정한다.
역할 수정후 인스턴스 재부팅을 해준다.
ec2 서버에 codedeploy 설치
' >>> ' 이 있는 코드를 작성하면 ' - ' 에 해당하는 메세지가 출력되어야 한다.
>>> aws s3 cp s3://aws-codedeploy-ap-northeast-2/latest/install . --region ap-northeast-2
- download: s3://aws-codedeploy-ap-northeast-2/latest/install to ./install
>>> chmod +x ./install
아래 명령어는 ruby를 2버전대로 설치해야만 제대로 동작한다.
>>> sudo ./install auto
>>> sudo service codedeploy-agent status
- The AWS CodeDeploy agent is running as PID ****
CodeDeploy용 IAM 사용자 등록
역할 만들기
CodeDeploy 생성
애플리케이션 생성 후 배포그룹 생성
서비스 역할에 바로 위에서 만든 IAM을 넣으면 된다.
일치하는 인스턴스가 있어야 한다.
Git actions / yml 추가 [최종]
name: Java CI with Gradle
on:
push:
branches: [ "ojyojy" ]
pull_request:
branches: [ "ojyojy" ]
env:
PROJECT_NAME: hanghae99Homework02
BUCKET_NAME: hanghae99bucket
CODE_DEPLOY_APP_NAME: springboot-intro
DEPLOYMENT_GROUP_NAME: dev
jobs:
build:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v1
with:
java-version: 11
## create application.properties
- name: make application.properties
if: true # branch가 develop일 때
run: |
# spring의 resources 경로로 이동
cd ./src/main/resources
touch ./application.properties
# GitHub-Actions에서 설정한 값을 application-dev.properties 파일에 쓰기
echo "${{ secrets.PROPERTIES_DEV }}" > ./application.properties
shell: bash
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
shell: bash
#build
- name: Build with Gradle
run: ./gradlew build
shell: bash
- name: Make Zip File
run: zip -qq -r ./$GITHUB_SHA.zip .
shell: bash
- 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: ap-northeast-2
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$BUCKET_NAME/$PROJECT_NAME/$GITHUB_SHA.zip
- name: Code Deploy
run: aws deploy create-deployment --application-name $CODE_DEPLOY_APP_NAME --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name $DEPLOYMENT_GROUP_NAME --s3-location bucket=$BUCKET_NAME,bundleType=zip,key=$PROJECT_NAME/$GITHUB_SHA.zip
appspec.yml / deploy.sh 생성
프로젝트 최상단에 appspec.yml을 생성한다.
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/hanghae99Homework02 # 인스턴스에서 파일이 저장될 위치
overwrite: yes
permissions:
- object: /
pattern: "**"
owner: ubuntu
group: ubuntu
hooks:
AfterInstall:
- location: deploy.sh
timeout: 60
runas: ubuntu
deploy.sh 파일도 생성해 준다.
REPOSITORY=/home/ubuntu/hanghae99Homework02
cd $REPOSITORY
APP_NAME=hanghae99Homework02 #1
JAR_NAME=$(ls $REPOSITORY/build/libs/ | grep 'SNAPSHOT.jar' | tail -n 1)
JAR_PATH=$REPOSITORY/build/libs/$JAR_NAME
CURRENT_PID=$(pgrep -f $APP_NAME)
if [ -z $CURRENT_PID ] #2
then
echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
echo "> kill -9 $CURRENT_PID"
sudo kill -15 $CURRENT_PID
sleep 5
fi
echo "> $JAR_PATH 배포" #3
nohup java -jar $JAR_PATH > /dev/null 2> /dev/null < /dev/null &
이 모든 설정을 하는데에 약 하루 반이 걸렸다..
다음 ci/cd는 더 빠르게 할 수 있기를..
출처 : https://stalker5217.netlify.app/devops/github-action-aws-ci-cd-1/
'CI CD' 카테고리의 다른 글
Gitlab CI/CD 실전예제 (1) | 2023.09.27 |
---|---|
Gitlab Runner (Docker, shell) 실전예제 (0) | 2023.09.25 |
Blue-Green 배포 전략 실전예제 (Circle CI + Docker + Nginx + Spring Boot) (0) | 2023.08.06 |
Circle CI의 Self-Hosted Runner (Docker) 실전 예제 (0) | 2023.08.06 |