feat: centralized workflow_dispatch deploy with dynamic checkout
This commit is contained in:
@@ -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
|
||||||
Reference in New Issue
Block a user