대략적인 그림은 이와 같다.
1. Dockerfile 작성
먼저, Dockerfile을 작성한다. Dockerfile은 Docker이미지를 빌드하기 위한 지시문을 포함한다.
FROM openjdk:11-jdk
ARG JAR_FILE=./build/libs/dashboardback-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
2. AWS EC2 인스턴스 생성
AWS EC2콘솔에서 새로운 인스턴스를 생성한다.
↓이 블로그 참고
AWS EC2 인스턴스 생성하기
• 안녕하세요~ 이전에 운영하던 블로그 및 GitHub, 공부 내용을 정리하는 Study-GitHub 가 있습니다! • 네이버 블로그 • GitHub • Study-GitHub • 🐔 ✔ AWS EC2(Elastic Compute Cloud) 인스턴스 생성하기 안녕
zzang9ha.tistory.com
3. 보안 그룹 설정
보안 그룹을 생성하고 인바운드 규칙을 설정한다. HTTP및 HTTPS 포트를 허용해야 한다.
4. EC2 Linux에 Docker 설치하기
Putty를 이용해서 ec2 서버에 접속한 후...
# yum으로 Docker 설치
sudo yum install docker -y
# Docker 실행
sudo service docker start
# Docker 그룹에 sudo 추가 (인스턴스 접속 후 도커 바로 제어할 수 있도록)
sudo usermod -aG docker ec2-user
# 인스턴스 재접속(putty 껐다 킴) 후 Docker 명령어 실행해보기
docker run hello-world
이때, docker run하기 전에 인스턴스를 재접속, 즉 putty를 껐다 켜야 한다. 안 그러면 계속 permission 에러가 뜬다.
5. Github 저장소에 워크플로우 파일 추가하기
Github 저장소에 .github/workflow티렉토리를 만들고 *.yml파일을 추가한다. 그런데 github repository에서 상단부의 Actions를 클릭해서 생성하면 자동으로 디렉토리 및 파일을 추가해준다.
그 전에, 우선 Github 저장소에 Secret을 추가해주어야 한다.
5.1 Secrets 추가
Settings > secrets and variables > Actions
에서 New repository secret을 클릭한다!
Secrets 전부 ↓
APPLICATION | application.yml 파일 |
DOCKER_HUB_REPO | 도커 허브 계정 id/project name |
DOCKER_PASSWORD | 도커 허브 계정 비번 |
DOCKER_USERNAME | 도커 허브 계정 id |
EC2_SERVER_HOST | AWS 인스턴스 (EC2) 퍼블릭 IP |
PRIVATE_KEY | AWS 인스턴스 Key(.ppm형태) |
PROJECT_NAME | 프로젝트 이름(이건 별로 안중요) |
- 도커 허브 계정 id는 ?
Docker hub들어가면 지문 아이콘 옆에 있는 id! 나는 syt07100이다.
- AWS 인스턴스 Key는?
인스턴스 생성할 때 발급받은 .ppm형태의 key이다. 이때, 이 키 형태는 다음과 같다.
-----BEGIN RSA PRIVATE KEY-----
여기에 키가 있다.
-----END RSA PRIVATE KEY-----
그런데 가운데에 키만 넣는게 아니라 위와 아래까지 모두 합쳐서 넣어줘야 한다. (즉 ctrl+A하면 된다 ^^)
5.2 actions.yml파일 작성
전체적인 flow는 다음과 같다.
1. main 브랜치를 기준으로
2. 작업할 것들 서버에 빌드
- 우분투로요.
- 작업경로는 여기요.
- 자바는 이걸로요.
- 빌드 Gradle이요.
2-1. 저기에 파일 하나 application.yml을 생성
2-2. 경로는 여기
2-3. 이거 파일에 업로드
3. Gradle로 빌드해주세요
4. 도커 로그인 하고, jar파일을 빌드(이미지화)하고, 도커허브에 푸쉬 부탁
5. EC2 연결할게요
- 도커 허브에서 푸쉬된 걸 pull
- 기존 실행중이던거 stop
- 기존거 삭제
- 새로 받은거 실행
name: Java CI with Gradle
on:
push:
branches: [ "master" ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
env :
working-directory: ./
APPLICATION: ${{ secrets.APPLICATION }}
steps:
- uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: '11'
distribution: 'adopt'
- name: Cache Gradle packages
uses: actions/cache@v2
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- uses: actions/checkout@v2
- run: |
mkdir ./src/main/resources
cd ./src/main/resources
touch ./application.yml
echo "${{env.APPLICATION}}" > ./application.yml
- uses: actions/upload-artifact@v2
with:
name: application.yml
path: ./src/main/resources/application.yml
- name: Grant execute permission for gradlew
run: chmod +x gradlew
working-directory: ${{ env.working-directory }}
- name: Build with Gradle
run: ./gradlew build
working-directory: ${{ env.working-directory }}
- name: Cleanup Gradle Cache
if: ${{ always() }}
run: |
rm -f ~/.gradle/caches/modules-2/modules-2.lock
rm -f ~/.gradle/caches/modules-2/gc.properties
- name: Docker build
run: |
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
docker build -t ${{ secrets.PROJECT_NAME }} .
docker tag ${{ secrets.PROJECT_NAME }} ${{ secrets.DOCKER_HUB_REPO }}:${GITHUB_SHA::7}
docker push ${{ secrets.DOCKER_HUB_REPO }}:${GITHUB_SHA::7}
- name: Deploy
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_SERVER_HOST }}
username: ec2-user
key: ${{ secrets.PRIVATE_KEY }}
envs: GITHUB_SHA
script: |
docker rmi $(docker images -q)
docker pull ${{ secrets.DOCKER_HUB_REPO }}:${GITHUB_SHA::7}
docker tag ${{ secrets.DOCKER_HUB_REPO }}:${GITHUB_SHA::7} ${{ secrets.PROJECT_NAME }}
docker stop ${{ secrets.PROJECT_NAME }}
docker rm ${{ secrets.PROJECT_NAME }}
docker run -d --name ${{ secrets.PROJECT_NAME }} -p 80:8080 ${{ secrets.PROJECT_NAME }}
출처
GitHub Actions와 Docker를 사용한 스프링부트 애플리케이션 배포 자동화
배경 이전 달록 프로젝트에서는 Jenkins를 사용하여 배포 자동화 파이프라인을 구축했었다. Jenkins에서 직접 jar 파일을 빌드하고, 빌드 결과물을 리눅스 scp 명령을 통해 배포 대상 서버로 보낸 다
hudi.blog
[TFAE] 스프링부트 프로젝트 GitHub Action CI&CD연대기 - 2
[TFAE] 스프링부트 프로젝트 GitHub Action CI&CD연대기 - 1 현재의 상황 아일랜드에 거주하는 한국인 유학생들을 대상으로 한 거래 플랫폼을 제작중이다. 일명 아-거 . 열심히 코드를 작성하고, 이것 저
supreme-ys.tistory.com
'Infra > CI&CD' 카테고리의 다른 글
[CI/CD] github actions, nginx, docker이용해서 blue-green 무중단 배포하기 (0) | 2023.05.01 |
---|---|
[CI/CD] Github-Actions 할 때 Secrets에 Application 및 Key 파일 넣을 때 주의할 점 (2) | 2023.04.20 |