최근 Devops에 관심이 생겨서 이것저것 해보다 보니 깃허브에서 Action을 사용하면 Workflow로 파이프라인 처리가 가능하다는것을 알게 되었다.
테스트도 해보고 진짜 되나 싶어서 실험용 개인 웹 서버인 OCI를 사용해서 파이프라인 처리를 해보았다.
참고사항
웹을 프론트와 백엔드 2가지로 구분해서 빌드하도록 했다.
또한, 원래 Devops는 배포용 서버와 Build를 위한 서버 총 2개가 필요하다.
보통 CI/CD 플랫폼의 에이전트에서 빌드한 산출물을 배포용 서버에 보내 실행하는 방식이다.
하지만, 이렇게 되면 서버 비용이 2배이기 때문에, Build와 배포를 동시에 진행하는 방향으로 설계했다.
이 경우에 서버의 부담이 심하다는 단점이 있기 때문에, 다른 방안을 찾아보니 Github에서 build를 위한 가상 환경을 제공한다 해서 해당 방법을 사용했다.
추후 Docker를 사용해 빌드 작업을 컨테이너에서 진행하는 방향으로 진행해볼 의향이 있다.
우선 이번 글에서는 Github의 Action을 사용하며 자동 배포 과정까지를 기록하겠다.
과정
우선 Github의 리포지토리의 설정에 들어가서 Action의 Runners에 들어간뒤 New self-hosted runner 버튼을 클릭하면 Github Action Workflow를 실행할 수 있는 실행기 탭이 열리게 된다.
여기서 운영체제와 아키텍쳐를 선택하고 (필자는 Linux와 X64를 선택했다.) Devops로 사용할 서버에서 Download 부분의 명령어를 그대로 입력해서 실행한다.
운영체제와 아키텍쳐를 선택하고 아래 명령어를 실행하기 전에 java와 node, npm이 설치되어 있어야 하기 때문에 따로 설치를 진행해줘야 한다.
추가로, 필자는 nginx를 사용해 프론트 처리를 할 예정이기 때문에 추가로 설치를 진행해줬다.
이후 Configure의 토큰 처리까지 명령어를 실행 한 뒤 ./run.sh로 수동 실행하기보다는 파이프라인으로 자동 처리를 위해서 서비스로 등록을 해줘야 하기 때문에, systemd 와 같은 명령어로 서비스 처리를 해줬다.
Workflow 처리를 위해 .github/workflows 폴더를 만들어서 main.yml 파일을 생성했다.
name: VSong CI/CD to OCI
on:
push:
branches:
- main
jobs:
build:
# 1단계: GitHub 호스팅 환경에서 빌드
runs-on: ubuntu-latest
steps:
- name: Checkout source code
uses: actions/checkout@v3
- name: Set up JDK 11 and Node.js 18
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
- uses: actions/setup-node@v3
with:
node-version: '18'
- name: Build Frontend
working-directory: ./src/front
run: |
npm install
npm run build
- name: Make gradlew executable
run: chmod +x ./gradlew
- name: Build Backend with Gradle (Skip Tests)
run: ./gradlew build -x test
- name: Package Artifacts
run: |
mkdir -p artifacts/frontend artifacts/backend
# Copy Frontend files to artifact directory
cp -r ./src/front/build/* artifacts/frontend/
# Find and copy the executable Backend JAR file
find ./build/libs/ -name "*.jar" ! -name "*-plain.jar" -exec cp {} artifacts/backend/ \;
- name: Upload Build Artifact
uses: actions/upload-artifact@v4
with:
name: v-song-build
path: artifacts/
deploy:
needs: build
# 2단계: OCI 서버에 설치된 Self-hosted runner 사용
runs-on: self-hosted
steps:
- name: Download Build Artifact
uses: actions/download-artifact@v4
with:
name: v-song-build
path: ./v-song-build
- name: Deploy Application and Restart Service
# 이 변수들은 GitHub Secrets에 등록된 DB 인증 정보, API 키 등을 의미
env:
DB_URL: ${{ secrets.PROD_DB_URL }}
DB_USERNAME: ${{ secrets.DB_USER }}
DB_PASSWORD: ${{ secrets.DB_PASS }}
API_KEY: ${{ secrets.YOUTUBE_API_KEYS }}
OAUTH_CLIENT_ID: ${{ secrets.GOOGLE_CLIENT_ID }}
run: |
echo "Starting deployment on Self-hosted Runner..."
# --- 1. 프론트엔드 배포 ---
FRONTEND_DEPLOY_PATH="/path/to/webserver/frontend/root"
echo "Deploying Frontend files to $FRONTEND_DEPLOY_PATH..."
sudo rm -rf $FRONTEND_DEPLOY_PATH/*
sudo cp -R ./v-song-build/frontend/* $FRONTEND_DEPLOY_PATH/
# --- 2. 환경 설정 파일 생성 ---
# 이 단계는 DB, API Key, OAuth 등 런타임에 필요한 설정을 application.properties 파일에 작성
PROPERTIES_FILE="/home/opc/vsong/application.properties"
echo "Creating runtime configuration file ($PROPERTIES_FILE)..."
# --- 3. 백엔드 JAR 파일 배포 ---
JAR_SOURCE_FILE=$(find ./v-song-build/backend/ -name "*.jar")
JAR_DEST_PATH="/home/opc/vsong/VSong.jar"
echo "Deploying $JAR_SOURCE_FILE to $JAR_DEST_PATH..."
cp $JAR_SOURCE_FILE $JAR_DEST_PATH
# --- 4. systemd 서비스 재시작 ---
echo "Restarting VSong application service..."
sudo systemctl daemon-reload
sudo systemctl restart vsong
echo "Deployment finished successfully."
위 main.yml의 env에 사용되는 값들은 리포지토리의 설정에 Secrets and variables에 Action 탭에 들어가면 Repository secrets 부분에서 설정할 수 있다.
'Git' 카테고리의 다른 글
| [Git] branch 이해하기 (0) | 2025.03.07 |
|---|---|
| [Git] Git, Github 차이점 (0) | 2025.03.05 |
| [GitHub] Repository를 Private / Public으로 변경하는 방법 (0) | 2024.10.02 |
| [Git] 자주 사용하는 Git 코드들 (0) | 2023.12.03 |