더보기
name: CI CD process
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
# 테스트용 MariaDB 컨테이너 추가
services:
mariadb:
image: mariadb:latest
env:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: testdb
MYSQL_USER: testuser
MYSQL_PASSWORD: testpass
ports:
- 3306:3306
env:
DATABASE_URL: jdbc:mariadb://localhost:3306/testdb
DATABASE_USERNAME: testuser
DATABASE_PASSWORD: testpass
DATABASE_DRIVER: org.mariadb.jdbc.Driver
JWT_SECRET: ${{ secrets.JWT_SECRET }}
MAX_FILE_SIZE: ${{ secrets.MAX_FILE_SIZE }}
MAX_REQUEST_SIZE : ${{ secrets.MAX_REQUEST_SIZE }}
steps:
- uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
# Configure Gradle for optimal use in GitHub Actions, including caching of downloaded dependencies.
# See: https://github.com/gradle/actions/blob/main/setup-gradle/README.md
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4 # v4.0.0
with:
gradle-version: '8.10.2'
- name: Build with Gradle Wrapper
run: ./gradlew build
working-directory: sequence_member
# NOTE: The Gradle Wrapper is the default and recommended way to run Gradle (https://docs.gradle.org/current/userguide/gradle_wrapper.html).
# If your project does not have the Gradle Wrapper configured, you can use the following configuration to run Gradle with a specified version.
#
# - name: Setup Gradle
# uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0
# with:
# gradle-version: '8.9'
#
# - name: Build with Gradle 8.9
# run: gradle build
# 도커 로그인
- name: Docker Login
uses: docker/login-action@v3.3.0
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: List repository root
run: ls -la
- name: List sequence_member directory
run: ls -la sequence_member
# Docker 이미지 빌드
- name: Build Docker image
run: |
docker build -t ${{secrets.DOCKER_USERNAME}}/sequence:latest .
working-directory: sequence_member
# Docker 이미지 푸시
- name: Push Docker image
run: |
docker push ${{secrets.DOCKER_USERNAME}}/sequence:latest
working-directory: sequence_member
dependency-submission:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Generate and submit dependency graph
uses: gradle/actions/dependency-submission@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0
with:
build-root-directory: sequence_member
# ssh연결 및 실행
deploy:
needs: [build]
runs-on: ubuntu-latest
steps:
- name: Deploy to Server via SSH
uses: appleboy/ssh-action@v0.1.8
with:
host: ${{secrets.SERVER_HOST}}
username: ${{secrets.SERVER_USERNAME}}
key: ${{secrets.SERVER_SSH_KEY}}
port: 22
script: |
# 서버에서 최신 이미지 pull
docker pull ${{secrets.DOCKER_USERNAME}}/sequence:latest
# 기존 컨테이너 종료 및 삭제 (존재하는 경우)
docker stop sequence-spring-container || true
docker rm sequence-spring-container || true
# 새로운 컨테이너 실행 (포트 및 필요한 환경 변수 지정 가능)
docker run -d --name sequence-spring-container --network sequence -p 10101:8080 \
-e JWT_SECRET=${{secrets.JWT_SECRET}} \
-e MAX_FILE_SIZE=${{secrets.MAX_FILE_SIZE}} \
-e MAX_REQUEST_SIZE=${{secrets.MAX_REQUEST_SIZE}} \
-e DATABASE_DRIVER=org.mariadb.jdbc.Driver \
-e DATABASE_URL=${{secrets.DATABASE_URL}} \
-e DATABASE_USERNAME=${{secrets.DATABASE_USERNAME}} \
-e DATABASE_PASSWORD=${{secrets.DATABASE_PASSWORD}} \
${{secrets.DOCKER_USERNAME}}/sequence:latest
💬정리
GithubAction + Docker를 활용하여 CI/CD를 구축하였습니다.
Jenkins와는 다르게 서버가 별도로 필요없고, GithubAction의 클라우드 서버안에 도커가 미리 설치되어있는점, 다양한 action을 미리 템플릿으로 제공한다는 점, 이 세가지 때문에 Jenkins에 비해 정말 편리하게 느껴졌습니다.
혹시 Jenkins만 사용해보신분들은 한번쯤 사용해보시면 신세계이실것 같습니다. 그럼 이만 😊
'IT 서비스 > 시퀀스' 카테고리의 다른 글
프론트에서 서버로 쿠키 전달 되지 않음(SameSite 정책 문제) (1) | 2025.04.07 |
---|---|
10만개의 유저 Mock Data를 넣어보자 with 멀티 스레드 (0) | 2025.03.16 |
[시퀀스] 10명의 백엔드 개발자들은 어떻게 협업할까? (0) | 2024.12.21 |
댓글