Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
8de1c80
fix: yml 들여쓰기 수정 (#555)
Gyuhyeok99 Nov 5, 2025
6b9fb2b
refactor: 멘토 및 채팅 관련 API 응답 수정 (#537)
whqtker Nov 13, 2025
4dbc07e
refactor: CD 성능 개선 (#552)
Hexeong Nov 15, 2025
0f00f52
fix: Github App이 발행한 임시 토큰에 대해 읽기 권한 명시 (#565)
Hexeong Nov 15, 2025
26490f5
fix: GitHub app token permission 문제 해결 (#566)
Hexeong Nov 15, 2025
57576ed
fix: GitHub app token permission 문제 오류 해결 (#567)
Hexeong Nov 15, 2025
66e2255
fix: GitHub app token permission이 repo 레벨에서 부여되는 문제 해결 (#568)
Hexeong Nov 15, 2025
76b25da
fix: GitHub app token permission 권한 오류 해결 (#569)
Hexeong Nov 17, 2025
3134f76
feat: claude.md 파일 추가 (#560)
Gyuhyeok99 Nov 17, 2025
f5c4034
fix : 동일 멘토 멘티 중복 신청 불가능하도록 수정 (#563)
lsy1307 Nov 20, 2025
f3fb02d
fix: GitHub app token permission 권한 오류 해결 (#570)
Hexeong Nov 20, 2025
4da854b
fix: GHCR 정리 권한 PAT로 해결 (#573)
Hexeong Nov 20, 2025
0e9d476
feat: 지원서가 APPROVED 인 유저의 멘토 생성 기능 추가 (#562)
sukangpunch Nov 22, 2025
d052325
feat: 어드민 멘토 승격 요청 페이징 조회 기능 추가 (#576)
sukangpunch Nov 24, 2025
3c342a8
feat: 어드민 멘토 승격 지원서 승인/거절 기능, 상태 별 지원서 개수 조회 기능 추가 (#577)
sukangpunch Dec 19, 2025
e673bb2
feat: region 관련 관리 기능 추가 (#561)
Gyuhyeok99 Dec 21, 2025
48ebb9e
fix: config.alloy 파일 경로 불일치 문제 해결 (#586)
Hexeong Dec 21, 2025
6ec2ab1
feat: 소셜 로그인 사용자는 비밀번호 변경을 할 수 없다. (#582)
whqtker Dec 21, 2025
1f12fea
fix: Upgrade 헤더 유무에 따라 Connection 헤더의 값을 동적으로 설정하도록 (#581)
whqtker Dec 21, 2025
2cf03ee
feat: 멘토 지원서 대학교 매핑 기능, 대학 선택 상태 페이징 조건 추가 (#583)
sukangpunch Dec 27, 2025
c30edc7
refactor: 스프링 부트 앱 외의 사이드 인프라 배포 과정을 분리 (#592)
Hexeong Dec 27, 2025
5788b2b
fix: S3 이름 불일치 문제 해결 (#594)
Hexeong Dec 27, 2025
513b59e
refactor: 분리한 사이드 인프라에 대해서 필요없는 파일 정리 (#596)
Hexeong Dec 28, 2025
d1cc8c3
test: flyway 스크립트를 검증하는 테스트 코드 작성 (#588)
whqtker Dec 29, 2025
7b79071
refactor: 게시글 조회 응답에 댓글 deprecated 여부 포함하도록 (#599)
whqtker Jan 5, 2026
b3a94da
feat: 유저의 멘토 지원서 신청 이력 조회 기능 추가 (#603)
sukangpunch Jan 11, 2026
48d0f48
fix: 탈퇴한 사용자가 물리적 삭제가 되지 않았던 문제를 해결한다 (#574)
whqtker Jan 12, 2026
ddf29e2
feat: 어드민 유저 차단 기능 추가 (#604)
JAEHEE25 Jan 16, 2026
f102528
feat: API 성능 로깅, 쿼리 별 메트릭 전송 추가 (#602)
sukangpunch Jan 16, 2026
1e12904
fix: docker-compose 충돌 해결 (#610)
whqtker Jan 19, 2026
5129221
chore: 서브모듈 해시 업데이트 (#611)
whqtker Jan 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
166 changes: 109 additions & 57 deletions .github/workflows/dev-cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,15 @@ on:
workflow_dispatch:

jobs:
build-gradle:
# --- Job 1: 빌드 및 이미지 푸시 (쓰기 권한 필요) ---
build-and-push:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write

outputs:
image_tag: ${{ steps.image_meta.outputs.image_tag }}

steps:
- name: Checkout the code
Expand All @@ -18,81 +23,128 @@ jobs:
token: ${{ secrets.SUBMODULE_ACCESS_TOKEN }}
submodules: true

# --- Java, Gradle 설정 ---
- 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@417ae3ccd767c252f5661f1ace9f835f9654f2b5 # v3.1.0

- name: Grant execute permission for Gradle wrapper(gradlew)
uses: gradle/actions/setup-gradle@v3
- name: Grant execute permission for Gradle wrapper
run: chmod +x ./gradlew

- name: Build with Gradle
run: ./gradlew bootJar

- name: Copy jar file to remote
uses: appleboy/scp-action@master
# --- Docker 설정 ---
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
with:
host: ${{ secrets.DEV_HOST }}
username: ${{ secrets.DEV_USERNAME }}
key: ${{ secrets.DEV_PRIVATE_KEY }}
source: "./build/libs/*.jar"
target: "/home/${{ secrets.DEV_USERNAME }}/solid-connection-dev/"
platforms: linux/arm64

- name: Copy docker file to remote
uses: appleboy/scp-action@master
- name: Log in to GitHub Container Registry (GHCR)
uses: docker/login-action@v3
with:
host: ${{ secrets.DEV_HOST }}
username: ${{ secrets.DEV_USERNAME }}
key: ${{ secrets.DEV_PRIVATE_KEY }}
source: "./Dockerfile"
target: "/home/${{ secrets.DEV_USERNAME }}/solid-connection-dev/"
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Copy docker compose file to remote
uses: appleboy/scp-action@master
with:
host: ${{ secrets.DEV_HOST }}
username: ${{ secrets.DEV_USERNAME }}
key: ${{ secrets.DEV_PRIVATE_KEY }}
source: "./docker-compose.dev.yml"
target: "/home/${{ secrets.DEV_USERNAME }}/solid-connection-dev/"
# --- 이미지 메타데이터 정의 ---
- name: Define image name and tag
id: image_meta
run: |
OWNER_LOWERCASE=$(echo "${{ github.repository_owner }}" | tr '[:upper:]' '[:lower:]')
IMAGE_TAG=$(date +'%Y%m%d-%H%M%S')
echo "image_name=ghcr.io/${OWNER_LOWERCASE}/solid-connection-dev" >> $GITHUB_OUTPUT
echo "image_tag=${IMAGE_TAG}" >> $GITHUB_OUTPUT

- name: Copy alloy config file to remote
uses: appleboy/scp-action@master
# --- Docker 빌드 및 푸시 ---
- name: Build, push, and cache Docker image
uses: docker/build-push-action@v5
with:
host: ${{ secrets.DEV_HOST }}
username: ${{ secrets.DEV_USERNAME }}
key: ${{ secrets.DEV_PRIVATE_KEY }}
source: "./docs/infra-config/config.alloy"
target: "/home/${{ secrets.DEV_USERNAME }}/solid-connection-dev/"
context: .
platforms: linux/arm64
push: true
tags: ${{ format('{0}:{1}', steps.image_meta.outputs.image_name, steps.image_meta.outputs.image_tag) }}
cache-from: type=registry,ref=${{ steps.image_meta.outputs.image_name }}:buildcache
cache-to: type=registry,ref=${{ steps.image_meta.outputs.image_name }}:buildcache,mode=max

- name: Copy nginx config to remote
uses: appleboy/scp-action@master
# --- 이미지 정리 (이전 Job에 있던 것) ---
- name: Clean up old image versions from GHCR
uses: snok/container-retention-policy@v2
with:
host: ${{ secrets.DEV_HOST }}
username: ${{ secrets.DEV_USERNAME }}
key: ${{ secrets.DEV_PRIVATE_KEY }}
source: "./docs/infra-config/nginx.dev.conf"
target: "/home/${{ secrets.DEV_USERNAME }}/solid-connection-dev/nginx"
rename: "default.conf"
token: ${{ secrets.PACKAGE_DELETE_TOKEN }}
image-names: solid-connection-dev
delete-untagged: true
keep-n-tags: 5
account-type: org
org-name: ${{ github.repository_owner }}
cut-off: '7 days ago UTC'

# --- Job 2: 배포 (읽기 권한만 필요) ---
deploy:
needs: build-and-push
runs-on: ubuntu-latest
permissions:
contents: read
packages: read

- name: Run docker compose and apply nginx config
uses: appleboy/ssh-action@master
steps:
# 설정 파일 전송을 위해 코드 체크아웃 (서브모듈 불필요)
- name: Checkout config files
uses: actions/checkout@v4
with:
host: ${{ secrets.DEV_HOST }}
username: ${{ secrets.DEV_USERNAME }}
key: ${{ secrets.DEV_PRIVATE_KEY }}
script_stop: true
script: |
sudo cp /home/${{ secrets.DEV_USERNAME }}/solid-connection-dev/nginx/default.conf /etc/nginx/conf.d/default.conf
sudo nginx -t
sudo nginx -s reload
sparse-checkout: |
docker-compose.dev.yml
docs/infra-config
sparse-checkout-cone-mode: false

# --- 설정 파일 전송 ---
- name: Copy config files to remote
run: |
echo "${{ secrets.DEV_PRIVATE_KEY }}" > deploy_key.pem
chmod 600 deploy_key.pem

scp -i deploy_key.pem \
-o StrictHostKeyChecking=no \
./docker-compose.dev.yml \
${{ secrets.DEV_USERNAME }}@${{ secrets.DEV_HOST }}:/home/${{ secrets.DEV_USERNAME }}/solid-connection-dev/

# --- 서버에서 Docker Pull 및 재시작 ---
- name: Run deployment on server
run: |
ssh -i deploy_key.pem \
-o StrictHostKeyChecking=no \
${{ secrets.DEV_USERNAME }}@${{ secrets.DEV_HOST }} \
'
set -e

# 1. 환경 변수 설정 (이전 Job의 Output 사용)
export OWNER_LOWERCASE=$(echo "${{ github.repository_owner }}" | tr "[:upper:]" "[:lower:]")
export IMAGE_TAG_ONLY="${{ needs.build-and-push.outputs.image_tag }}"
export FULL_IMAGE_NAME="ghcr.io/${OWNER_LOWERCASE}/solid-connection-dev:${IMAGE_TAG_ONLY}"

# 2. GHCR 로그인 & Pull
echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
echo "Pulling new image: $FULL_IMAGE_NAME"
docker pull $FULL_IMAGE_NAME

# 3. Spring Boot 앱 재시작
echo "Restarting Docker Compose with tag: $IMAGE_TAG_ONLY"
cd /home/${{ secrets.DEV_USERNAME }}/solid-connection-dev
docker compose -f docker-compose.dev.yml down
docker compose -f docker-compose.dev.yml up -d --build
docker compose -f docker-compose.dev.yml down || true
OWNER_LOWERCASE=$OWNER_LOWERCASE IMAGE_TAG=$IMAGE_TAG_ONLY docker compose -f docker-compose.dev.yml up -d

# 4. 정리 작업
echo "Pruning dangling images..."
docker image prune -f

echo "Cleaning up old tagged images (keeping last 5)..."
IMAGE_NAME_BASE="ghcr.io/${OWNER_LOWERCASE}/solid-connection-dev"
docker images "${IMAGE_NAME_BASE}" --format "{{.Tag}}" | \
sort -r | \
tail -n +6 | \
xargs -I {} docker rmi "${IMAGE_NAME_BASE}:{}" || true

echo "Deployment finished successfully."
'
Loading
Loading