티스토리 뷰

대략적인 그림은 이와 같다.

 

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