대략적인 그림은 이와 같다.
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콘솔에서 새로운 인스턴스를 생성한다.
↓이 블로그 참고
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 }}
출처
'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 |