프로젝트에서 Github actions 을 활용해 main 브랜치로 새로운 코드가 push 되거나 병합될 때
설정한 Aws ec2 로 빌드된 jar 파일과 Dockerfile 을 통해 해당 인스턴스에서 도커가 실행되고
Spring 이 실행된다.
// jdk 버전에 맞게 설치
sudo yum install java-11-openjdk -y
// docker 설치
sudo yum install docker -y
sudo service docker start
// docker 권한 설정
sudo usermod -a -G docker ec2-user
name: Build and Deploy to AWS EC2
on:
push:
branches:
- main # main 브랜치로 푸시될 때만 실행
jobs:
build:
runs-on: ubuntu-latest
steps:
# 1. 리포지토리 체크아웃
- name: Checkout repository
uses: actions/checkout@v2
# 2. JDK 설정
- name: Set up JDK 17
uses: actions/setup-java@v2
with:
java-version: '17'
distribution: 'zulu'
# 3. Gradle 빌드 실행 (테스트와 함께)
- name: Build with Gradle
run: ./gradlew build -x test --no-daemon
# 4. SSH 키 설정
- name: Setup SSH Key
run: |
echo "${{ secrets.EC2_SSH_KEY }}" > ec2-key.pem # SSH 개인 키를 파일로 저장
chmod 600 ec2-key.pem # SSH 키에 적절한 권한 설정
# 5. EC2로 SSH 접속 후 빌드 및 배포
- name: Deploy to EC2
run: |
ssh -i ec2-key.pem -t -o StrictHostKeyChecking=no ubuntu@${{ secrets.EC2_HOST }} << 'EOF'
cd docker-CICD-test/ # 프로젝트 경로로 이동
git pull origin main # 최신 코드 가져오기
docker build -t my-java-app . # EC2에서 Docker 빌드
docker stop my-app || true # 기존 컨테이너 종료
docker rm my-app || true # 기존 컨테이너 제거
docker run -d -p 8080:8080 \
--name my-java-app \
-e "SPRING_PROFILES_ACTIVE=prod" \ # prod 프로파일로 실행
my-java-app
EOF
# 6. SSH 키 파일 삭제 (보안)
- name: Cleanup SSH Key
run: rm ec2-key.pem
spring:
profiles:
active: local
---
spring:
application:
name: fm-delivery
jpa:
hibernate:
ddl-auto: update
properties:
hibernate:
show_sql: true
format_sql: true
use_sql_comments: true
jwt:
secret:
key:
---
# local
spring:
config:
activate:
on-profile: local
datasource:
url: jdbc:mysql://localhost:3306/fm_server
username: root
password: 1234
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
---
# prod
spring:
config:
activate:
on-profile: prod
datasource:
url: jdbc:mysql://{RDS_END_POINT}/fm_server # RDS
username: admin
password: fm_server
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
properties:
hibernate:
dialect: org.hibernate.dialect.MySQLDialect # MySQL? Dialect
FROM openjdk:17-jdk-alpine
# JAR 파일을 이미지에 복사
COPY fm-delivery-0.0.1-SNAPSHOT.jar /app/fm-delivery-0.0.1-SNAPSHOT.jar
# 작업 디렉터리 설정
WORKDIR /app
# 애플리케이션 실행 시 prod 프로필 활성화
ENTRYPOINT ["java", "-jar", "fm-delivery-0.0.1-SNAPSHOT.jar", "--spring.profiles.active=prod"]