name: Build and Deploy (.NET) on: push: tags: - 'v*' env: IMAGE_NAME: my-project DEPLOY_PATH: /home/${{ secrets.SSH_USERNAME }}/deployments/my-project jobs: build-push: runs-on: ubuntu-latest steps: - name: Checkout Code uses: actions/checkout@v4 - name: Login to Private Registry uses: docker/login-action@v3 with: registry: ${{ secrets.DOCKER_REGISTRY }} username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Build and Push uses: docker/build-push-action@v5 with: context: . push: true tags: | ${{ secrets.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ gitea.ref_name }} ${{ secrets.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:latest deploy: needs: build-push runs-on: ubuntu-latest steps: - name: Checkout Code uses: actions/checkout@v4 # فقط فایل docker-compose.yml را آپدیت می‌کنیم (فایل .env روی سرور دست نمی‌خورد) - name: Copy docker-compose to Server uses: appleboy/scp-action@v0.1.7 with: host: ${{ secrets.SSH_HOST }} username: ${{ secrets.SSH_USERNAME }} key: ${{ secrets.SSH_KEY }} port: 22 source: "docker-compose.yml" target: ${{ env.DEPLOY_PATH }} # اجرا روی سرور - name: Remote SSH Commands uses: appleboy/ssh-action@v1.0.3 env: # تعریف متغیرهایی که می‌خواهیم به سرور پاس دهیم DOCKER_REGISTRY: ${{ secrets.DOCKER_REGISTRY }} DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} APP_VERSION: ${{ gitea.ref_name }} # ورژن تگ شده APP_PORT: ${{ secrets.APP_PORT }} IMAGE_NAME: ${{ env.IMAGE_NAME }} with: host: ${{ secrets.SSH_HOST }} username: ${{ secrets.SSH_USERNAME }} key: ${{ secrets.SSH_KEY }} port: 22 # لیست متغیرهایی که باید به نشست SSH منتقل شوند envs: DOCKER_REGISTRY,DOCKER_USERNAME,DOCKER_PASSWORD,APP_VERSION,APP_PORT,IMAGE_NAME script: | cd ${{ env.DEPLOY_PATH }} # لاگین داکر echo "$DOCKER_PASSWORD" | docker login $DOCKER_REGISTRY -u $DOCKER_USERNAME --password-stdin # نکته مهم: # الان متغیرهای APP_VERSION و ... در حافظه این Session موجود هستند. # وقتی دستور docker compose اجرا شود، مقادیر ${APP_VERSION} در فایل yml # را با مقادیر موجود در حافظه جایگزین می‌کند. # و فایل .env موجود روی دیسک را هم برای سایر متغیرها می‌خواند. echo "Deploying version: $APP_VERSION" # پول کردن با استفاده از متغیرهای حافظه docker compose pull # اجرای کانتینر docker compose up -d --remove-orphans docker image prune -f