Github에 공식적으로 내장된 기능으로
빌드, 테스트 및 배포 파이프라인을 자동화할 수 있는 CI/CD 플랫폼
[ public repository 면 제한 없이 사용 가능 ]
* CI/CD란?
지속적 통합(Continuous Integration) 및 지속적 제공/배포(Continuous Delivery/Deployment)
수동배포만 해오던 나에게는 아주 기적같은 기능이다
AWS EC2
GitHub Actions
Docker
루트 밑에 Dockerfile
생성
FROM openjdk:{자신에게 맞는 JDK 버전}
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
Actions
를 누르고 Gradle
템플릿 선택 후 /.github/workflows/main.yml
추가
name: CI/CD using GitHub Actions & Docker
on:
push:
branches: [ "master" ]
jobs:
CI-CD:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v2
with:
java-version: '17'
distribution: 'temurin'
## git ignore에 등록된 application.properties 파일 생성해주기
- name: Create directory and file if not exist
run: |
mkdir -p ./src/main/resources
echo "${{ secrets.APPLICATION }}" > ./src/main/resources/application.properties
## 스프링 프로젝트 jar 파일 빌드
- name: Set executable permission
run: chmod +x ./gradlew
- name: Build with Gradle
run: ./gradlew bootJar
## Docker Hub에 이미지 push 하기
- name: Docker build & push to prod
run: |
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
docker build -f Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/keep:0.0.1-SNAPSHOT .
docker push ${{ secrets.DOCKER_USERNAME }}/keep:0.0.1-SNAPSHOT
## Docker Hub에 Push한 이미지를 우분투 서버에 받아와서 run
- name: Deploy to prod
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST_PROD }}
username: ubuntu
key: ${{ secrets.PRIVATE_KEY }}
envs: GITHUB_SHA
script: |
docker stop keep
docker rm keep
docker rmi ${{ secrets.DOCKER_USERNAME }}/keep:0.0.1-SNAPSHOT
docker pull ${{ secrets.DOCKER_USERNAME }}/keep:0.0.1-SNAPSHOT
docker run -d -p 8080:8080 --name keep ${{ secrets.DOCKER_USERNAME }}/keep:0.0.1-SNAPSHOT
Settings - Security - Actions
위치에서
DOCKER_USERNAME
DOCKER_PASSWORD
에는 각각 docker username과 password,
HOST_PROD
에는 EC2 서버 퍼블릭 주소를 넣어주었다.
application.properties
또한 APPLICATION
을 만들어 환경변수로 사용할 것이다.
본인 EC2에 접속한 후 아래 명령어 입력
sudo apt install docker.io
이제 master
에 push
만 하면 Github Action이 자동으로 CI/CD를 진행 해준다!
EC2하나에 서버를 두면 고가용성이 좋지 못해서 EC2 2개의 서버를 alb로 묶어서 고가용성을 높여보시면 좋으실 것 같습니다 :)