docs: README.md 수정 #276
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI/CD Backend | |
| on: | |
| push: | |
| branches: | |
| - main | |
| - develop | |
| pull_request: | |
| branches: | |
| - main | |
| - develop | |
| jobs: | |
| deploy: | |
| runs-on: self-hosted | |
| # develop 브랜치에 푸시된 경우에만 이 잡을 실행합니다. | |
| if: github.ref == 'refs/heads/develop' | |
| env: | |
| SERVICE_NAME: api | |
| REGISTRY: ${{ secrets.KCR_REGISTRY_URL }} | |
| IMAGE_NAME: ${{ secrets.KCR_DEV_IMAGE_NAME }} | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| - name: Login to Kakao Cloud Registry | |
| # 카카오클라우드 레지스트리에 로그인합니다. | |
| run: | | |
| echo "${{ secrets.KCR_PASSWORD }}" | docker login ${{ secrets.KCR_REGISTRY_URL }} -u "${{ secrets.KCR_USER }}" --password-stdin | |
| - name: Build and push Docker image | |
| # 이미지를 빌드하고 KCR에 푸시합니다. | |
| # date + github.sha 조합으로 태그를 생성하고 빌드 캐시를 활용합니다. | |
| run: | | |
| IMAGE_TAG=$(date +%Y%m%d%H%M%S)-${{ github.sha }} | |
| echo "IMAGE_TAG=$IMAGE_TAG" >> $GITHUB_ENV | |
| docker build -t ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:$IMAGE_TAG . | |
| docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:$IMAGE_TAG | |
| docker tag ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:$IMAGE_TAG ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest | |
| docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest | |
| - name: Run tests (if any) | |
| # 이 부분에 테스트 명령어를 추가하여 이미지를 컨테이너로 실행하고 테스트합니다. | |
| run: echo "No tests defined yet. Add your test commands here." | |
| # 예시: docker run --rm ${{ secrets.KCR_REGISTRY_URL }}/${{ secrets.KCR_DEV_IMAGE_NAME }}:${{ env.IMAGE_TAG }} pytest | |
| - name: Set up SSH Agent | |
| # SSH 프라이빗 키를 설정하여 서버에 접속할 수 있도록 합니다. | |
| uses: webfactory/[email protected] | |
| with: | |
| ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} | |
| - name: Deploy to server via Bastion | |
| env: | |
| SSH_HOST: ${{ secrets.SSH_HOST }} # 베스천 호스트의 퍼블릭 IP | |
| SSH_USERNAME: ${{ secrets.SSH_USERNAME }} # 베스천 호스트 사용자 이름 | |
| SSH_PORT: ${{ secrets.SSH_PORT }} # 베스천 SSH 포트 | |
| run: | | |
| # 셸 명령어 실행 과정을 출력하여 디버깅을 돕습니다. | |
| set -x | |
| # SSH 접속 시 호스트 키 확인을 위한 디렉터리를 생성합니다. | |
| mkdir -p ~/.ssh | |
| # 베스천 호스트 키를 known_hosts에 추가합니다. | |
| ssh-keyscan -v -H "$SSH_HOST" >> ~/.ssh/known_hosts 2>&1 | |
| # 베스천을 통해 백엔드 서버에 접속하여 배포 명령을 실행합니다. | |
| # StrictHostKeyChecking=no로 호스트 키 검증 우회 (CI/CD 환경용) | |
| # 배포 서버에서도 Docker 로그인 수행 | |
| ssh -v -o StrictHostKeyChecking=no \ | |
| -p $SSH_PORT \ | |
| "$SSH_USERNAME@$SSH_HOST" \ | |
| "echo '${{ secrets.KCR_PASSWORD }}' | docker login ${{ secrets.KCR_REGISTRY_URL }} -u '${{ secrets.KCR_USER }}' --password-stdin && \ | |
| docker stop scratcha_server || true && docker rm scratcha_server || true && \ | |
| docker stop scratcha_worker || true && docker rm scratcha_worker || true && \ | |
| docker stop scratcha_celery_beat || true && docker rm scratcha_celery_beat || true && \ | |
| docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }} && \ | |
| docker run -d --name scratcha_server --network=host --env-file /home/ubuntu/.env -p 8001:8001 ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }} && \ | |
| docker run -d --name scratcha_worker --network=host --env-file /home/ubuntu/.env ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }} celery -A app.celery_app worker -l info && \ | |
| docker run -d --name scratcha_celery_beat --network=host --env-file /home/ubuntu/.env ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }} celery -A app.celery_app beat -l info" 2>&1 | |
| # 메인 브랜치에 푸시될 때 ArgoCD로 배포하는 새로운 잡 | |
| deploy-to-argocd: | |
| runs-on: self-hosted | |
| if: github.ref == 'refs/heads/main' | |
| env: | |
| SERVICE_NAME: api | |
| REGISTRY: ${{ secrets.KCR_REGISTRY_URL }} | |
| IMAGE_NAME: ${{ secrets.KCR_IMAGE_NAME }} | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| - name: Login to Kakao Cloud Registry | |
| run: | | |
| echo "${{ secrets.KCR_PASSWORD }}" | docker login ${{ secrets.KCR_REGISTRY_URL }} -u "${{ secrets.KCR_USER }}" --password-stdin | |
| - name: Build & Push Docker Image | |
| # 이미지를 빌드하고 KCR에 푸시합니다. | |
| # 빌드 캐시를 활용하여 빌드 시간을 단축합니다. | |
| run: | | |
| IMAGE_TAG=$(date +%Y%m%d%H%M%S)-${{ github.sha }} | |
| echo "IMAGE_TAG=$IMAGE_TAG" >> $GITHUB_ENV | |
| docker build -t ${{ secrets.KCR_REGISTRY_URL }}/${{ secrets.KCR_IMAGE_NAME }}:$IMAGE_TAG . | |
| docker push ${{ secrets.KCR_REGISTRY_URL }}/${{ secrets.KCR_IMAGE_NAME }}:$IMAGE_TAG | |
| docker tag ${{ secrets.KCR_REGISTRY_URL }}/${{ secrets.KCR_IMAGE_NAME }}:$IMAGE_TAG ${{ secrets.KCR_REGISTRY_URL }}/${{ secrets.KCR_IMAGE_NAME }}:latest | |
| docker push ${{ secrets.KCR_REGISTRY_URL }}/${{ secrets.KCR_IMAGE_NAME }}:latest | |
| - name: Checkout test Repo | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: ${{ secrets.REPO_NAME }} | |
| token: ${{ secrets.REPO_TOKEN }} | |
| path: ${{ secrets.REPO_PATH }} | |
| - name: Update values.yaml files | |
| run: | | |
| # api-chart values.yaml 업데이트 | |
| sed -i "s|tag:.*|tag: \"${{ env.IMAGE_TAG }}\"|" ${{ secrets.REPO_PATH }}/${{ secrets.HELM_CHART_PATH }}/values.yaml | |
| # celery-chart values.yaml 업데이트 | |
| sed -i "s|tag:.*|tag: \"${{ env.IMAGE_TAG }}\"|" ${{ secrets.REPO_PATH }}/helm-chart/celery-chart/values.yaml | |
| - name: Commit & Push changes | |
| run: | | |
| cd ${{ secrets.REPO_PATH }} | |
| git config user.name "github-actions" | |
| git config user.email "[email protected]" | |
| git add ${{ secrets.HELM_CHART_PATH }}/values.yaml | |
| git add helm-chart/celery-chart/values.yaml | |
| git commit -m "Update backend image tag to ${{ env.IMAGE_TAG }} for both api-chart and celery-chart" | |
| git push origin main |