From c445761f97a0242e0cd374c2ad15df47c70e1b2d Mon Sep 17 00:00:00 2001 From: parseh negar Date: Mon, 21 Sep 2026 16:54:41 +0330 Subject: [PATCH] feat: centralized workflow_dispatch deploy with dynamic checkout --- .gitea/workflows/dev-deploy.yml | 116 ++++++++++++++++++-------------- 1 file changed, 66 insertions(+), 50 deletions(-) diff --git a/.gitea/workflows/dev-deploy.yml b/.gitea/workflows/dev-deploy.yml index 78d36f0..d1d7fc8 100644 --- a/.gitea/workflows/dev-deploy.yml +++ b/.gitea/workflows/dev-deploy.yml @@ -1,83 +1,99 @@ -name: Dev Deploy to Staging +name: Central Deploy on: - workflow_call: + workflow_dispatch: + inputs: + repo_name: + description: 'Repository to build and deploy (e.g., narng-api)' + required: true + type: string + branch: + description: 'Branch to deploy' + required: true + default: 'dev' + type: string env: REGISTRY: 192.168.1.8:8084 + COMPOSE_PATH: /srv/staging/narng-platform/compose + ORG: narng-platform jobs: build-and-deploy: runs-on: ubuntu-latest steps: - - name: Checkout code + - name: Checkout service code (dynamic repo) uses: actions/checkout@v4 with: + repository: ${{ env.ORG }}/${{ inputs.repo_name }} + ref: ${{ inputs.branch }} + token: ${{ secrets.NARNG_GIT_TOKEN }} fetch-depth: 0 - - name: Determine service metadata + - name: Detect service metadata id: meta run: | - REPO_NAME=$(basename ${{ github.repository }}) + REPO_NAME="${{ inputs.repo_name }}" case "$REPO_NAME" in - narng-api-laravel) SERVICE="laravel"; TAG_VAR="LARAVEL_TAG" ;; - narng-api | narng-api-gateway) SERVICE="api"; TAG_VAR="API_TAG" ;; - narng-web-app) SERVICE="web"; TAG_VAR="WEB_TAG" ;; - *) SERVICE=$(echo "$REPO_NAME" | sed 's/^narng-//'); TAG_VAR=$(echo "$SERVICE" | tr '[:lower:]' '[:upper:]')_TAG ;; + narng-api-laravel) SERVICE="laravel"; TAG_VAR="LARAVEL_TAG" ;; + narng-api|narng-api-gateway) SERVICE="api"; TAG_VAR="API_TAG" ;; + narng-web-app) SERVICE="web"; TAG_VAR="WEB_TAG" ;; + *) + SERVICE=$(echo "$REPO_NAME" | sed 's/^narng-//') + TAG_VAR=$(echo "$SERVICE" | tr '[:lower:]' '[:upper:]')_TAG + ;; esac - echo "SERVICE=$SERVICE" >> $GITHUB_OUTPUT - echo "TAG_VAR=$TAG_VAR" >> $GITHUB_OUTPUT - echo "IMAGE=${{ env.REGISTRY }}/$REPO_NAME" >> $GITHUB_OUTPUT + echo "service=$SERVICE" >> $GITHUB_OUTPUT + echo "tag_var=$TAG_VAR" >> $GITHUB_OUTPUT + echo "image=${{ env.REGISTRY }}/${{ env.ORG }}/$REPO_NAME" >> $GITHUB_OUTPUT + echo "version=1.0.0-dev.${{ github.run_number }}" >> $GITHUB_OUTPUT - - name: Generate version - id: version - run: echo "VERSION=1.0.0-dev.${{ github.run_number }}" >> $GITHUB_OUTPUT + - name: Prepare SSH key + env: + STAGING_SSH_KEY: ${{ secrets.STAGING_SSH_KEY }} + run: | + # نوشتن کلید در فایل + echo "$STAGING_SSH_KEY" > /tmp/deploy_key_raw + + # بررسی اینکه آیا base64 است یا مستقیم + if head -1 /tmp/deploy_key_raw | grep -q "BEGIN OPENSSH PRIVATE KEY"; then + # کلید مستقیم است (multi-line) + cp /tmp/deploy_key_raw /tmp/deploy_key + else + # کلید base64 است (single-line) + base64 -d /tmp/deploy_key_raw > /tmp/deploy_key + fi + + chmod 600 /tmp/deploy_key + + # بررسی صحت کلید + ssh-keygen -l -f /tmp/deploy_key || { echo "ERROR: Invalid SSH key"; exit 1; } + + - name: Login to Nexus + run: echo "${{ secrets.NEXUS_PASS }}" | docker login ${{ env.REGISTRY }} -u "${{ secrets.NEXUS_USER }}" --password-stdin - name: Build Docker image env: DOCKER_BUILDKIT: 1 run: | - IMAGE=${{ steps.meta.outputs.IMAGE }} - VERSION=${{ steps.version.outputs.VERSION }} - docker buildx build --builder default --tag "$IMAGE:$VERSION" --tag "$IMAGE:1.0.0-latest" --load . 2>&1 | tail -20 - - - name: Login to Nexus - env: - NEXUS_USER: ${{ secrets.NEXUS_USER }} - NEXUS_PASS: ${{ secrets.NEXUS_PASS }} - run: echo "$NEXUS_PASS" | docker login ${{ env.REGISTRY }} -u "$NEXUS_USER" --password-stdin + IMAGE=${{ steps.meta.outputs.image }} + VERSION=${{ steps.meta.outputs.version }} + docker buildx build \ + --builder default \ + --tag "$IMAGE:$VERSION" \ + --tag "$IMAGE:1.0.0-latest" \ + --load . 2>&1 | tail -30 - name: Push to Nexus run: | - IMAGE=${{ steps.meta.outputs.IMAGE }} - VERSION=${{ steps.version.outputs.VERSION }} + IMAGE=${{ steps.meta.outputs.image }} + VERSION=${{ steps.meta.outputs.version }} docker push "$IMAGE:$VERSION" docker push "$IMAGE:1.0.0-latest" - name: Deploy to staging via SSH uses: appleboy/ssh-action@v1.0.3 - with: - host: ${{ secrets.STAGING_HOST }} - username: ${{ secrets.STAGING_USER }} - key: ${{ secrets.STAGING_SSH_KEY }} - port: 2222 - envs: NEXUS_USER, NEXUS_PASS - debug: true # <--- این خط اضافه شود - script: | - set -ex # <--- این خط اضافه شود تا خطاها مشخص شوند - SERVICE=${{ steps.meta.outputs.SERVICE }} - VERSION=${{ steps.version.outputs.VERSION }} - TAG_VAR=${{ steps.meta.outputs.TAG_VAR }} - echo "Deploying $SERVICE:$VERSION" - - # لاگین به نکسوس برای یوزر deployer - echo "$NEXUS_PASS" | sudo docker login ${{ env.REGISTRY }} -u "$NEXUS_USER" --password-stdin - - sudo sed -i "s|^${TAG_VAR}=.*|${TAG_VAR}=${VERSION}|" /srv/staging/narng-platform/compose/.env - - cd /srv/staging/narng-platform/compose - sudo docker compose pull $SERVICE - sudo docker compose up -d --force-recreate --no-deps $SERVICE - sudo docker image prune -f env: NEXUS_USER: ${{ secrets.NEXUS_USER }} - NEXUS_PASS: ${{ secrets.NEXUS_PASS }} \ No newline at end of file + NEXUS_PASS: ${{ secrets.NEXUS_PASS }} + SERVICE: ${{ steps.meta.outputs.service }} + VERSION: ${{ steps.meta.outputs \ No newline at end of file