name: Central Deploy on: 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 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: Detect service metadata id: meta run: | 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 ;; esac 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: 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.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.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 env: NEXUS_USER: ${{ secrets.NEXUS_USER }} NEXUS_PASS: ${{ secrets.NEXUS_PASS }} SERVICE: ${{ steps.meta.outputs.service }} VERSION: ${{ steps.meta.outputs