EC2 인스턴스 생성
IAM 사용자 생성
3. 권한 추가
AmazonS3FullAccess, AWSCodeDeployFullAccess 2가지를 추가
(안 될 경우 정책에 AmazonEC2FullAccess, AmazonS3FullAccess, AWSCodeDeployFullAccess 3가지를 추가)
4. s3 생성
5. Amazon S3 권한 해제
6. CodeDeploy 애플리케이션 생성
7. 이름을 입력, 컴퓨터 플랫폼에 EC2/온프레미스를 입력 후 생성
8. Git -> Actions -> JAVA with Gradle Configure 클릭
name: clone instar CI/CD
on:
pull_request:
branches: [ main ]
types: [closed]
env:
S3_BUCKET_NAME: mysparta00
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
# gradle caching
- name: Gradle Caching
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
# create application-dev.properties
- name: make application.properties
run: |
cd ./src/main/resources
touch ./application.properties
echo "${{ secrets.PROPERTIES }}" > ./application.properties
shell: bash
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew build -x test
# 디렉토리 생성
- name: Make Directory
run: mkdir -p deploy
# Jar 파일 복사
- name: Copy Jar
run: cp ./build/libs/*.jar ./deploy
# appspec.yml 파일 복사
- name: Copy appspec.yml
run: cp appspec.yml ./deploy
# script files 복사
- name: Copy script
run: cp ./scripts/*.sh ./deploy
- name: Make zip file
run: zip -r ./planit.zip ./deploy
shell: bash
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.IAMACCESSKEY }}
aws-secret-access-key: ${{ secrets.IAMSECRETKEY }}
aws-region: ap-northeast-2
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 ./planit.zip s3://$S3_BUCKET_NAME/
# Deploy
- name: Deploy
env:
AWS_ACCESS_KEY_ID: ${{ secrets.IAMACCESSKEY }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.IAMSECRETKEY }}
run:
aws deploy create-deployment
--application-name planit
--deployment-group-name planit
--file-exists-behavior OVERWRITE
--s3-location bucket=springbucketss,bundleType=zip,key=planit.zip
--region ap-northeast-2
10. Settiongs -> Actions -> New repository secret 클릭
11. Name에 아까 JAVA with Gradle파일에 넣을 이름을 입력(accesskey, secretkey, properties), Secret에 키내용 및 properties내용을 입력, add를 클릭
(S3
12. add를 클릭하면 생성이 되는데 필요한 것만 생성하면 된다.
(현재 프로젝트에 3가지가 필요하여 3가지만 입력 : 1번과 2번은 S3의 키, 3번은 보안을 위해 깃에 올리지 않는 properties이다.)
한 번 생성하면 다시 들어가서 볼 수 없다.
13. 2번으로 생성한 부분이 .github/workflows이고 scripts와 appspec.yml, main에 resources/static을 생성
#!/usr/bin/env bash
REPOSITORY=/home/ubuntu/app
echo "> 현재 구동 중인 애플리케이션 pid 확인"
JAR_NAME=$(ls -tr $REPOSITORY/*SNAPSHOT.jar | tail -n 1)
CURRENT_PID=$(pgrep -f $JAR_NAME)
echo "현재 구동 중인 애플리케이션 pid: $CURRENT_PID"
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/*SNAPSHOT.jar | tail -n 1)
echo "> JAR NAME: $JAR_NAME"
echo "> $JAR_NAME 에 실행권한 추가"
chmod +x $JAR_NAME
echo "> $JAR_NAME 실행"
#-Duser.timezone=Asia/Seoul
nohup java -jar $JAR_NAME >> $REPOSITORY/nohup.out 2>&1 &
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/app/
overwrite: yes
permissions:
- object: /
pattern: "**"
owner: ubuntu
group: ubuntu
hooks:
ApplicationStart:
- location: deploy.sh
timeout: 60
runas: ubuntu
sudo apt update
sudo apt install ruby-full
sudo apt install wget
cd /home/ubuntu
sudo apt install awscli
aws s3 cp s3://aws-codedeploy-ap-northeast-2/latest/install . --region ap-northeast-2
chmod +x ./install
sudo ./install auto
아래 코드로 설치 확인
sudo service codedeploy-agent status
https://aws.amazon.com/ko/premiumsupport/knowledge-center/s3-locate-credentials-error/
17. 중간에 오류가 발생했을 경우 위의 자료를 참고하여 입력
(aws configure list 입력하고 access_key, secret_key, region을 입력하고 마지막은 넘긴다.)
18. 설치가 잘 된 경우 위와 같은 내용이 뜬다.
19. 메인에 Pull requests를 하면 Actions에서 build가 되며 배포가 된다.
(시간은 1분 내외 정도 걸린다.)
내용이 뒤죽박죽이고 딱 순서가 정해진 거 같지 않아 아직 머리 속에서 정리가 되지 않았다.
중간 중간 EC2, IAM, S3 등 생성을 자세히 넣으면 엄청나게 길어져 뺏다.
무중단 배포를 원할 경우 AWS 로드밸런서를 활용하여 할 수 있다.
이 때, 서버를 2개 이상 사용하여 하나가 빌드 중일 때 다른 서버를 이용하는 방식이다.
참고 자료 :
https://zzang9ha.tistory.com/404?category=954133
https://be-developer.tistory.com/51?category=1062619
https://gist.github.com/ninanung/9d63304cb0d070642e89f9b94b6fe24b