Github에서 지원하는 CI/CD를 간편하게 설정할 수 있는 기능
→ yml 파일 설정을 통해 손쉽게 CI/CD 환경 구축 가능
→ Github에서 제공하는 템플릿을 사용하거나, 직접 작성
# Workflow 이름을 지정합니다.
name: CI/CD
# 트리거 설정을 지정합니다. 여기서는 push 이벤트가 발생하면 main 또는 develop 브랜치에 대해 워크플로우가 실행됩니다.
on:
push:
branches: [ "main", "develop" ]
# Job을 정의합니다.
jobs:
# Job 이름을 지정합니다.
CI-CD:
# 실행 환경을 지정합니다. 여기서는 ubuntu-latest를 사용합니다.
runs-on: ubuntu-latest
# Job의 단계를 정의합니다.
steps:
# 1. JDK 17을 설정합니다.
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
# 2. gradlew에 실행 권한을 부여
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
# 3. application.properties 파일을 생성합니다.
# gitignore에 포함되어 있으므로, actions의 secret으로 관리
# 만약, github에 resources 폴더가 없다면, mkdir도 추가해주자
- name: make application.properties
if: |
contains(github.ref, 'main') ||
contains(github.ref, 'develop')
run: |
cd ./src/main/resources
touch ./application.properties
echo "${{ secrets.APPLICATION_PROPERTIES }}" > ./application.properties
shell: bash
# 4. Gradle을 사용하여 빌드합니다.
- name: Build with Gradle
run: ./gradlew build -x test
# 5. 현재 시간을 가져옵니다.
- name: Get current time
uses: josStorer/get-current-time@v2.0.2
id: current-time
with:
format: YYYY-MM-DDTHH-mm-ss
utcOffset: "+09:00"
# 6. Docker 이미지를 빌드하고 dev로 푸시합니다.
- name: Docker build & push to dev
if: |
contains(github.ref, 'main') ||
contains(github.ref, 'develop')
run: |
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
docker build -t ${{ secrets.DOCKER_USERNAME }}/testing .
docker push ${{ secrets.DOCKER_USERNAME }}/testing
# 7. dev로 풀합니다.
- name: Pull to dev
uses: appleboy/ssh-action@master
id: pull-dev
if: |
contains(github.ref, 'main') ||
contains(github.ref, 'develop')
with:
host: ${{ secrets.HOST_DEV }} # EC2 퍼블릭 IPv4 DNS
username: ubuntu # ubuntu -> AWS에서 ubuntu를 사용하기 때문에
port: 22
key: ${{ secrets.PRIVATE_KEY }}
envs: GITHUB_SHA
script: |
sudo docker ps
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
sudo docker pull ${{ secrets.DOCKER_USERNAME }}/testing
sudo docker run -d -p 8080:8080 ${{ secrets.DOCKER_USERNAME }}/testing
sudo docker image prune -f
APPLICATION_PROPERTIES: .gitignore에 포함된 경우, 해당 파일을 전부 복사해서 넣어두자!
❗ 주의: DB는 배포시 연결될 RDS의 엔드포인트HOST_DEV: EC2 퍼블릭 IPv4 DNS
DOCKER_USERNAME: Docker name
→ 기타 등등의 필요한 정보들을 넣어두자!
# Java 설치
sudo apt-get update
sudo apt-get install openjdk-17-jdk
# 도커 설치
sudo apt update
sudo apt install docker.io
# Docker 그룹에 추가
sudo usermod -aG docker ubuntu
jar {
enabled = false
}
FROM openjdk:17-alpine
COPY env.properties /env.properties
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=prod", "/app.jar"]