name: Dev Deploy to Staging on: push: branches: - dev workflow_dispatch: workflow_call: # برای استفاده در ریپوهای دیگر env: REGISTRY: 192.168.1.8:8084 jobs: build-and-deploy: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 with: fetch-depth: 0 - name: Determine service metadata id: meta run: | REPO_NAME=$(basename ${{ github.repository }}) 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 "REPO_NAME=$REPO_NAME" >> $GITHUB_OUTPUT echo "IMAGE=${{ env.REGISTRY }}/$REPO_NAME" >> $GITHUB_OUTPUT - name: Generate version id: version run: | VERSION="1.0.0-dev.${{ github.run_number }}" echo "VERSION=$VERSION" >> $GITHUB_OUTPUT - name: Build Docker image env: DOCKER_BUILDKIT: 1 run: | IMAGE=${{ steps.meta.outputs.IMAGE }} VERSION=${{ steps.version.outputs.VERSION }} export DOCKER_BUILDKIT=1 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 - name: Push to Nexus run: | IMAGE=${{ steps.meta.outputs.IMAGE }} VERSION=${{ steps.version.outputs.VERSION }} docker push "$IMAGE:$VERSION" docker push "$IMAGE:1.0.0-latest" - name: Deploy to staging (Host-level) run: | SERVICE=${{ steps.meta.outputs.SERVICE }} VERSION=${{ steps.version.outputs.VERSION }} TAG_VAR=${{ steps.meta.outputs.TAG_VAR }} echo "Deploying $SERVICE:$VERSION" # آپدیت فایل .env در مسیر صحیح سرور docker run --rm -v /srv/staging/narng-platform:/srv/staging/narng-platform alpine sh -c "sed -i 's|^${TAG_VAR}=.*|${TAG_VAR}=${VERSION}|' /srv/staging/narng-platform/compose/.env" # ری‌استارت کانتینر با استفاده از فایل .env صحیح docker run --rm \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /srv/staging/narng-platform:/srv/staging/narng-platform:ro \ -w /srv/staging/narng-platform/compose \ docker:24-cli \ sh -c "docker compose --env-file .env up -d --no-deps $SERVICE" - name: Verify run: | SERVICE=${{ steps.meta.outputs.SERVICE }} CONTAINER="staging-narng-${SERVICE}" sleep 10 STATUS=$(docker inspect --format='{{.State.Status}}' "$CONTAINER" 2>/dev/null || echo "not found") echo "Container: $CONTAINER - Status: $STATUS"