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 "IMAGE=${{ env.REGISTRY }}/$REPO_NAME" >> $GITHUB_OUTPUT - name: Generate version id: version run: echo "VERSION=1.0.0-dev.${{ github.run_number }}" >> $GITHUB_OUTPUT - 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 - 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 via SSH uses: appleboy/ssh-action@v1.0.3 with: host: ${{ secrets.STAGING_HOST }} username: ${{ secrets.STAGING_USER }} key: ${{ secrets.STAGING_SSH_KEY }} script: | SERVICE=${{ steps.meta.outputs.SERVICE }} VERSION=${{ steps.version.outputs.VERSION }} TAG_VAR=${{ steps.meta.outputs.TAG_VAR }} echo "Deploying $SERVICE:$VERSION" sed -i "s|^${TAG_VAR}=.*|${TAG_VAR}=${VERSION}|" /srv/staging/narng-platform/compose/.env cd /srv/staging/narng-platform/compose docker compose pull $SERVICE docker compose up -d --force-recreate --no-deps $SERVICE docker image prune -f # 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"