[INFRA] Github Action을 이용한 CI/CD 구축 feat Docker !

반달곰수·2024년 6월 4일

Infra

목록 보기
2/2

기본적인 배포 및 GitHub 연동은 아래를 참고해주세요 !

[GCP] GCP를 통한 서버 배포 및 Git Hub 연동

1. Docker File and Docker-Compose.yml 작성

프로젝트 루트 디렉토리에 아래 처럼 도커파일을 작성

1. Docker-Compose.yml 작성

version: '3'
services:
  mysql-server:
    image: mysql:latest
    container_name: mysql-container
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
      MYSQL_DATABASE: crewing
      MYSQL_USER: ${DB_USERNAME}
      MYSQL_PASSWORD: ${DB_PASSWORD}
    env_file:
      - .env
    ports:
      - "3305:3306"
  redis-server:
    image: redis
    command: redis-server --port 6379
    hostname: redis
    ports:
      - "6378:6379"
    restart: always
  crewing-server:
    image: crewing-server
    build: .
    ports:
      - "8081:8080"
    env_file:
      - .env
    depends_on:
      - mysql-server
      - redis-server
  • 필요한 환경변수는 .env에 작성하고 주입 받아서 관리
  • ports → “6378:6379” 외부포트:내부포트
  • 호스트는 service 이름입니다
    • ex
    • DB_URL=jdbc:mysql://mysql-server:3306/crewing?useSSL=false&allowPublicKeyRetrieval=true

2. 실행 테스트

docker-compose up 

2. VM 인스턴스에서 Docker 설치

1. 도커 설치

# 1. 프로그램 설치 전 우분투 시스템 패키지 업데이트
$ sudo apt-get update
 
# 2. 필요한 패키지 설치
$ sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
 
# 3. Docker의 공식 GPG 키 추가
 
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
 
# 4. Docker의 공식 apt 저장소 추가
 
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

 
# 5. 시스템 패키지 업데이트
$ sudo apt-get update
 
# 6. Docker 설치
 
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

# 7. 설치 확인
$ docker -v

2. Docker - Compose 설치

# Docker Compose 설치
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 다운로드 한 파일에 권한 설정
$ sudo chmod +x /usr/local/bin/docker-compose

# 설치 확인
$ docker-compose -v

3. Vm 인스턴스에서 Docker Run

1. 프로젝트 경로로 이동

2. 환경변수 작성

vi .env

3. docker-compose up

$ sudo docker-compose up

3. Ci.yml , CD.yml 작성

프로젝트 루트 경로에 .github/workflows에 작성

Untitled

1. CI

name: Java CI with Gradle

on:
  pull_request:
    branches: [ "main" ]
  workflow_dispatch:

permissions: write-all

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Set up JDK 17
      uses: actions/setup-java@v3
      with:
        java-version: '17'
        distribution: 'temurin'

    - name: Gradle Caching
      uses: actions/cache@v3
      with:
        path: |
          ~/.gradle/caches
          ~/.gradle/wrapper
        key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
        restore-keys: |
          ${{ runner.os }}-gradle-
      
  
    - name: Grant Execute Permission For Gradlew
      run: chmod +x gradlew
    
  
    - name: Build With Gradle
      run: ./gradlew build -x test

2. CD

name: CD

on:
  workflow_dispatch:
  push: 
    branches:
      - main

permissions: write-all #테스트 결과 작성을 위해 쓰기권한 추가

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    
      - uses: actions/checkout@v3
      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'

      
      - name: Gradle Caching
        uses: actions/cache@v3
        with:
          path: |
            ~/.gradle/caches
            ~/.gradle/wrapper
          key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
          restore-keys: |
            ${{ runner.os }}-gradle-
     
      - name: Build With Gradle
        run: ./gradlew build -x test

      - name: Docker build & Push
        run: |
          docker login -u ${{ secrets.DOCKER_ID }} -p ${{ secrets.DOCKER_PASSWORD }}
          docker build -f Dockerfile -t ${{ secrets.DOCKER_REPO }}/crewing-server .
          docker push ${{ secrets.DOCKER_REPO }}/crewing-server
      - name: Deploy to Prod
        uses: appleboy/ssh-action@master
        id: deploy-prod
        with:
          host: ${{ secrets.GCP_HOST }}
          username: ${{ secrets.GCP_USERNAME }}
          key: ${{ secrets.GCP_PRIVATE_KEY }}
          envs: GITHUB_SHA
          script: |
             cd ./project
             sudo docker stop crewing-server
             sudo docker rm crewing-server
             sudo docker pull ${{ secrets.DOCKER_REPO }}/crewing-server
             sudo docker image tag ${{ secrets.DOCKER_REPO }}/crewing-server:latest crewing-server:latest
             sudo docker-compose up -d

4. GCP SSH 접속 키 생성

5. GitHub Secret 등록

Repository → settings → Secrets and Variables → action

→ new Repository Secret

Secret 명

  • DOCKER_ID - 도커 허브 아이디
  • DOCKER_PASSWORD - 도커 허브 비밀번호
  • DOCKER_REPO - 도커 허브 레포 이름
  • GCP_HOST - 외부 IP 주소
  • GCP_PRIVATE_KEY - 비밀키
  • GCP_USERNAME - 구글 계정 (~~@gmail.com 에서 ~~)

이제 수동으로 액션을 실행하거나 , Main 브런치에 Push가 발생하면 자동으로 배포가 완료됩니다 !

0개의 댓글