[CI/CD] GithubActions + Docker 환경 구축

Dyong_Song·2024년 3월 31일
0
post-thumbnail

💻 GithubActions와 Docker로 CI/CD 환경 구축하기

❓ 개발 환경

  • Java 17 / SpringBoot 3.2.4
  • SpringDataJPA
  • MySQL

✔ Github Actions 간단하게 알아보기

Github에서 지원하는 CI/CD를 간편하게 설정할 수 있는 기능
→ yml 파일 설정을 통해 손쉽게 CI/CD 환경 구축 가능
→ Github에서 제공하는 템플릿을 사용하거나, 직접 작성

✔ .yml 파일 작성하기

# 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

✔ Github에서 Actions에 사용할 Secrets 설정하기

  • APPLICATION_PROPERTIES: .gitignore에 포함된 경우, 해당 파일을 전부 복사해서 넣어두자!

    ❗ 주의: DB는 배포시 연결될 RDS의 엔드포인트
  • HOST_DEV: EC2 퍼블릭 IPv4 DNS

  • DOCKER_USERNAME: Docker name

    → 기타 등등의 필요한 정보들을 넣어두자!

✔ EC2 서버에 도커 설치해두기

# 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

✔ build.grade에 plain jar 빼기 설정

jar {
    enabled = false
}

✔ Dockerfile 작성하기

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"]

✔ 상황에 맞추어 yml 파일을 추가하도록 합시다 :)

profile
꾸준한 개발자가 되자! Do steady yong

0개의 댓글

관련 채용 정보