일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- spring boot
- Naver Cloud Platform
- papago
- Database
- NooBLoL
- React
- 회고
- navercloud
- junit
- NaverCloudPlatform
- object storage
- Pinpoint
- F-Lab
- ncloud
- Scheduler
- 네이버클라우드
- Java
- Enum
- spring
- NCP
- ngrinder
- docker
- AssertJ
- Naver Cloud
- Thymeleaf
- DBDocs
- OrientalUnity
- mybatis
- 네이버 클라우드
- 에프랩
Archives
- Today
- Total
DevJong12
[Picasso] 프로젝트 CI / CD 본문
728x90
목차
해당 프로젝트의 경우 CI 와 CD를 전부 Github Actions를 활용하였다.
CI와 CD에 사용된 Github WorkFlows를 작성해 보고자 한다.
먼저 사전에 도움이 되라고, 내 프로젝트의 아키텍쳐이미지를 남겨논다.
1) CI
먼저 CI가 해당 프로젝트에서 왜 필요했을 까?부터 정의를 해보고자 한다.
필자의 프로젝트는 6명이 팀으로 있었고, 대부분이 Git에 미숙한 상황이었다. 하지만 Merge는 안전하게 진행해야 한다고 판단을 내렸으며 이에 따라, Build가 되지 않고 파일이 증발하는등의 위험한 PR을 솎아 내야 한다는 문제가 있었다.
해당 문제를 해결하고자 CI를 도입하였고, Build가 되지 않으면 CodeReview를 Approve하지 않고 Merge를 진행하지 않는 방법을 채택하였다.
CI의 작업은 단순하다. 그냥 gradlew build를 통해 build가능 여부 검증만 진행하였다.
소스코드
더보기
name: Picasso Build
# CI의 Target은 Feat, Dev브랜치로 PR이 타겟팅이 되는 경우를 생각하였다.
on:
pull_request:
branches: [ "dev", "feat" ]
types: [ opened, synchronize, reopened ]
jobs:
build:
name: Picasso Build
runs-on: ubuntu-latest
steps:
- name: Github Action Version Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
# Spring Boot3의 사용에 의한 JDK17
- name: Set up JDK 17
uses: actions/setup-java@v1
with:
java-version: 17
distribution: 'zulu'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Test with Gradle
run: ./gradlew test
- name: Build with Gradle
run: ./gradlew build
- name: Cache Gradle packages
uses: actions/cache@v1
with:
path: ~/.gradle/caches
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
restore-keys: ${{ runner.os }}-gradle
2) CD
Proxy 👉 Application Server의 설정에 소요가 많이 들었다.
기본적으로 필자의 서버는 PEM파일 (RSA)를 반드시 필요로 하였다는 점 필요하다.
SCP그리고 SSH의 과정에서는 Proxy옵션은 실제 Proxy Server에서 설정한 옵션들, Application Server들에서는 Application설정에 필요한 포트와 정보들을 변수로 기입하였다.
HOST는 IP
PORT는 SSH의 설정 포트번호
KEY는 PEM파일의 내용들 등등으로 설정하였다.
소스코드
더보기
name: Picasso CI/CD
# Target은 Dev, Main브랜치로 Push Event가 발생한 경우로 상정하였다.
on:
push:
branches: [ "dev", "main" ]
# 권한은 읽는것 이상 불필요하다고 생각했다.
permissions:
contents: read
jobs:
build:
name: Picasso CI/CD
runs-on: ubuntu-latest
steps:
- name: Github Action Version Checkout
uses: actions/checkout@v2
- name: Setup jdk-17
uses: actions/setup-java@main
with:
java-version: 17
distribution: 'zulu'
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
- name: Test with Gradle
run: ./gradlew test
- name: Build with Gradle
run: ./gradlew build
# Build를 진행한 파일을 편하게 찾기 위해 파일을 이동해줬다. cd로 이동해도 상관은 없다.
- name: Move App.jar
run : mv ./Api/build/libs/app.jar ./
# Proxy Server Connect with SSH
# scp로 proxy server에 build된 Jar 파일을 보낸다
# jar 파일을 실행한다. 이 때 storage에 대한 VM Option을 추가하여 실행한다.
- name: Transfer BuildFile Git Actions To ApplicationServer
uses: appleboy/scp-action@master
with:
proxy_host: ${{ secrets.NCP_PROXY_HOST }}
proxy_username: root
proxy_key: ${{ secrets.NCP_PEM }}
proxy_port: 2222
host: ${{ secrets.NCP_APP_HOST }}
username: root
key: ${{ secrets.NCP_PEM }}
port: 22
source: app.jar
target: /var/app
- name: Run Application
uses: appleboy/ssh-action@master
with:
proxy_host: ${{ secrets.NCP_PROXY_HOST }}
proxy_username: root
proxy_key: ${{ secrets.NCP_PEM }}
proxy_port: 2222
host: ${{ secrets.NCP_APP_HOST }}
username: root
key: ${{ secrets.NCP_PEM }}
port: 22
script: |
cd /var/app
./app_run.sh
728x90
'프로젝트 > Picasso' 카테고리의 다른 글
[Picasso][Spring] @Scheduled를 통한 경매 상태 변경 (1) | 2023.10.02 |
---|---|
[Picasso][Spring] JavaMailSender를 유틸화해 간편히 메일 사용하기 (0) | 2023.10.02 |
[Picasso][Spring] Object Storage 업로드 기능 구현 (1) | 2023.10.02 |
[Picasso] 와이어프레임 (0) | 2023.10.02 |
[Picasso] 프로젝트 개요 (1) | 2023.10.02 |
Comments