diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index f962a296..95f45bbd 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,4 +1,4 @@ -name: Deploy to GCP +name: Deploy to NCP on: push: @@ -9,10 +9,11 @@ jobs: runs-on: ubuntu-latest steps: + # 코드 체크아웃 - name: Checkout uses: actions/checkout@v4 - # 1. JDK 설치 및 빌드 + # JDK 21 설치 - name: Set up JDK 21 uses: actions/setup-java@v4 with: @@ -20,64 +21,46 @@ jobs: distribution: 'temurin' cache: gradle + # Gradle wrapper 실행 권한 부여 - name: Grant execute permission for gradlew run: chmod +x gradlew + # Gradle로 프로젝트 빌드 (테스트 제외) - name: Build with Gradle (skip tests) run: ./gradlew clean build -x test - # 2. GCP 인증 및 Docker 설정 - - name: Google Auth - uses: 'google-github-actions/auth@v2' - with: - credentials_json: '${{ secrets.GCP_SA_KEY }}' - - - name: 'Set up Cloud SDK' - uses: 'google-github-actions/setup-gcloud@v2' - - - name: 'Docker Auth' - run: gcloud auth configure-docker ${{ secrets.GCP_REGION }}-docker.pkg.dev + # NCR(Naver Container Registry) 로그인 + - name: Login to NCR + run: | + echo ${{ secrets.NCP_SECRET_KEY }} | docker login ${{ secrets.NCR_REGISTRY }} \ + -u ${{ secrets.NCP_ACCESS_KEY }} \ + --password-stdin - # 3. Docker 이미지 빌드 및 Artifact Registry 푸시 + # Docker 이미지 빌드 및 NCR에 푸시 - name: Build and Push Docker Image run: | - REGISTRY="${{ secrets.GCP_REGION }}-docker.pkg.dev/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_REPOSITORY }}" - IMAGE_NAME="link-it-backend" SHA=${{ github.sha }} - - docker build -t $REGISTRY/$IMAGE_NAME:$SHA -t $REGISTRY/$IMAGE_NAME:latest . - docker push $REGISTRY/$IMAGE_NAME:$SHA - docker push $REGISTRY/$IMAGE_NAME:latest + IMAGE_SHA_TAG=${{ secrets.NCR_REGISTRY }}/link-it-backend:${SHA} + IMAGE_LATEST_TAG=${{ secrets.NCR_REGISTRY }}/link-it-backend:latest - # 4. GCE 서버로 docker-compose.prod.yml 파일 전송 - - name: Copy docker-compose to GCE - uses: appleboy/scp-action@v0.1.7 - with: - host: ${{ secrets.GCP_VM_IP }} - username: ${{ secrets.GCP_SSH_USER }} - key: ${{ secrets.GCP_SSH_KEY }} - source: "docker-compose.prod.yml" - target: "/opt/link-it" - overwrite: true + docker build -t $IMAGE_SHA_TAG . + docker push $IMAGE_SHA_TAG + + docker tag $IMAGE_SHA_TAG $IMAGE_LATEST_TAG + docker push $IMAGE_LATEST_TAG - # 5. GCE 서버에서 배포 실행 - - name: Deploy on GCP Compute Engine + # 서버에서 Docker 컨테이너 배포 + - name: Deploy on NCP uses: appleboy/ssh-action@v1.2.0 with: - host: ${{ secrets.GCP_VM_IP }} - username: ${{ secrets.GCP_SSH_USER }} - key: ${{ secrets.GCP_SSH_KEY }} + host: ${{ secrets.NCP_HOST }} + username: ${{ secrets.NCP_SSH_USER }} + key: ${{ secrets.NCP_SSH_KEY }} + command_timeout: 30m script: | - # 디렉토리 생성 및 권한 설정 - sudo mkdir -p /opt/link-it - sudo chown -R ${{ secrets.GCP_SSH_USER }}:${{ secrets.GCP_SSH_USER }} /opt/link-it cd /opt/link-it - # .env 파일 생성 cat > .env << 'EOF' - GCP_REGION=${{ secrets.GCP_REGION }} - GCP_PROJECT_ID=${{ secrets.GCP_PROJECT_ID }} - GCP_REPOSITORY=${{ secrets.GCP_REPOSITORY }} DB_HOST=${{ secrets.DB_HOST }} DB_PORT=${{ secrets.DB_PORT }} DB_NAME=${{ secrets.DB_NAME }} @@ -108,13 +91,11 @@ jobs: NCP_BUCKET_NAME=${{ secrets.NCP_BUCKET_NAME }} EOF - # 서버 내부 Docker Registry 로그인 - echo '${{ secrets.GCP_SA_KEY }}' | docker login -u _json_key --password-stdin https://${{ secrets.GCP_REGION }}-docker.pkg.dev + echo ${{ secrets.NCP_SECRET_KEY }} | docker login ${{ secrets.NCR_REGISTRY }} \ + -u ${{ secrets.NCP_ACCESS_KEY }} \ + --password-stdin - # 컨테이너 갱신 및 실행 docker compose -f docker-compose.prod.yml down || true - docker pull ${{ secrets.GCP_REGION }}-docker.pkg.dev/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_REPOSITORY }}/link-it-backend:latest + docker pull ${{ secrets.NCR_REGISTRY }}/link-it-backend:latest docker compose -f docker-compose.prod.yml up -d - - # 미사용 이미지 정리 docker image prune -f \ No newline at end of file diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 90d822f6..434f69bc 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -5,8 +5,6 @@ services: image: mysql:8.0 container_name: link-it-mysql restart: always - ports: - - "3306:3306" environment: MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} MYSQL_DATABASE: ${DB_NAME} @@ -47,7 +45,7 @@ services: max-file: "3" app: - image: ${GCP_REGION}-docker.pkg.dev/${GCP_PROJECT_ID}/${GCP_REPOSITORY}/link-it-backend:latest + image: link-it-registry.kr.ncr.ntruss.com/link-it-backend:latest container_name: link-it-backend restart: always ports: