feat: centralized workflow_dispatch deploy with dynamic checkout

This commit is contained in:
2026-09-21 16:54:41 +03:30
parent 22d26b2ea0
commit c445761f97
+66 -50
View File
@@ -1,83 +1,99 @@
name: Dev Deploy to Staging name: Central Deploy
on: 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: env:
REGISTRY: 192.168.1.8:8084 REGISTRY: 192.168.1.8:8084
COMPOSE_PATH: /srv/staging/narng-platform/compose
ORG: narng-platform
jobs: jobs:
build-and-deploy: build-and-deploy:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout code - name: Checkout service code (dynamic repo)
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
repository: ${{ env.ORG }}/${{ inputs.repo_name }}
ref: ${{ inputs.branch }}
token: ${{ secrets.NARNG_GIT_TOKEN }}
fetch-depth: 0 fetch-depth: 0
- name: Determine service metadata - name: Detect service metadata
id: meta id: meta
run: | run: |
REPO_NAME=$(basename ${{ github.repository }}) REPO_NAME="${{ inputs.repo_name }}"
case "$REPO_NAME" in case "$REPO_NAME" in
narng-api-laravel) SERVICE="laravel"; TAG_VAR="LARAVEL_TAG" ;; narng-api-laravel) SERVICE="laravel"; TAG_VAR="LARAVEL_TAG" ;;
narng-api | narng-api-gateway) SERVICE="api"; TAG_VAR="API_TAG" ;; narng-api|narng-api-gateway) SERVICE="api"; TAG_VAR="API_TAG" ;;
narng-web-app) SERVICE="web"; TAG_VAR="WEB_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 ;; *)
SERVICE=$(echo "$REPO_NAME" | sed 's/^narng-//')
TAG_VAR=$(echo "$SERVICE" | tr '[:lower:]' '[:upper:]')_TAG
;;
esac esac
echo "SERVICE=$SERVICE" >> $GITHUB_OUTPUT echo "service=$SERVICE" >> $GITHUB_OUTPUT
echo "TAG_VAR=$TAG_VAR" >> $GITHUB_OUTPUT echo "tag_var=$TAG_VAR" >> $GITHUB_OUTPUT
echo "IMAGE=${{ env.REGISTRY }}/$REPO_NAME" >> $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 - name: Prepare SSH key
id: version env:
run: echo "VERSION=1.0.0-dev.${{ github.run_number }}" >> $GITHUB_OUTPUT 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 - name: Build Docker image
env: env:
DOCKER_BUILDKIT: 1 DOCKER_BUILDKIT: 1
run: | run: |
IMAGE=${{ steps.meta.outputs.IMAGE }} IMAGE=${{ steps.meta.outputs.image }}
VERSION=${{ steps.version.outputs.VERSION }} VERSION=${{ steps.meta.outputs.version }}
docker buildx build --builder default --tag "$IMAGE:$VERSION" --tag "$IMAGE:1.0.0-latest" --load . 2>&1 | tail -20 docker buildx build \
--builder default \
- name: Login to Nexus --tag "$IMAGE:$VERSION" \
env: --tag "$IMAGE:1.0.0-latest" \
NEXUS_USER: ${{ secrets.NEXUS_USER }} --load . 2>&1 | tail -30
NEXUS_PASS: ${{ secrets.NEXUS_PASS }}
run: echo "$NEXUS_PASS" | docker login ${{ env.REGISTRY }} -u "$NEXUS_USER" --password-stdin
- name: Push to Nexus - name: Push to Nexus
run: | run: |
IMAGE=${{ steps.meta.outputs.IMAGE }} IMAGE=${{ steps.meta.outputs.image }}
VERSION=${{ steps.version.outputs.VERSION }} VERSION=${{ steps.meta.outputs.version }}
docker push "$IMAGE:$VERSION" docker push "$IMAGE:$VERSION"
docker push "$IMAGE:1.0.0-latest" docker push "$IMAGE:1.0.0-latest"
- name: Deploy to staging via SSH - name: Deploy to staging via SSH
uses: appleboy/ssh-action@v1.0.3 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: env:
NEXUS_USER: ${{ secrets.NEXUS_USER }} NEXUS_USER: ${{ secrets.NEXUS_USER }}
NEXUS_PASS: ${{ secrets.NEXUS_PASS }} NEXUS_PASS: ${{ secrets.NEXUS_PASS }}
SERVICE: ${{ steps.meta.outputs.service }}
VERSION: ${{ steps.meta.outputs