name: Build & Push Docker Image on: push: tags: - "*" workflow_dispatch: jobs: build: runs-on: ubuntu-latest steps: - name: Start time run: echo "BUILD_STARTED=$(date +%s)" >> "$GITHUB_ENV" - name: Free disk space id: prune run: | df -h / /workspace /var/lib/containerd 2>/dev/null || df -h / docker builder prune -af || true docker image prune -af || true docker system prune -af --volumes || true df -h / /workspace /var/lib/containerd 2>/dev/null || df -h / - name: Checkout code id: checkout uses: actions/checkout@v4 - name: Resolve image tag id: meta run: | if [ "${GITHUB_REF_TYPE}" = "tag" ]; then TAG="${GITHUB_REF_NAME}" else TAG="$(git rev-parse --short HEAD)" fi echo "tag=${TAG}" >> "$GITHUB_OUTPUT" echo "registry=dock.monsys.ir" >> "$GITHUB_OUTPUT" - name: Build Docker images id: build run: | set -eu tag="${{ steps.meta.outputs.tag }}" reg="${{ steps.meta.outputs.registry }}" docker build -f Dockerfile.api -t "$reg/montact-api:$tag" -t "$reg/montact-api:latest" . docker build -f Dockerfile.web -t "$reg/montact-web:$tag" -t "$reg/montact-web:latest" . docker build -f Dockerfile.stt -t "$reg/montact-stt:$tag" -t "$reg/montact-stt:latest" . # Registry login is unsolved. These two steps stay off so a tag run # only proves the three images build. Remove `if: false` on both when # dock.monsys.ir accepts the runner. - name: Login to registry id: login env: REGISTRY_USERNAME: ${{ secrets.REGISTRY_USERNAME }} REGISTRY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }} run: | USER_NAME="${REGISTRY_USERNAME:-admin}" printf '%s\n' "$REGISTRY_PASSWORD" | docker login "dock.monsys.ir" -u "$USER_NAME" --password-stdin - name: Push Docker images id: push run: | set -eu tag="${{ steps.meta.outputs.tag }}" reg="${{ steps.meta.outputs.registry }}" for name in montact-api montact-web montact-stt; do docker push "$reg/$name:$tag" docker push "$reg/$name:latest" done - name: Notify Bale if: always() continue-on-error: true env: BALE_TOKEN: ${{ secrets.BALE_BOT_TOKEN || vars.BALE_BOT_TOKEN }} BALE_CHAT_ID: ${{ vars.BALE_CHAT_ID }} TAG: ${{ steps.meta.outputs.tag }} REG: ${{ steps.meta.outputs.registry }} RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_number }} STEP_OUTCOMES: | Checkout code=${{ steps.checkout.outcome }} Resolve image tag=${{ steps.meta.outcome }} Build Docker images=${{ steps.build.outcome }} Login to registry=${{ steps.login.outcome }} Push Docker images=${{ steps.push.outcome }} run: | if [ -z "$BALE_TOKEN" ] || [ -z "$BALE_CHAT_ID" ]; then echo "BALE_BOT_TOKEN / BALE_CHAT_ID not set in Gitea — skipping notification" exit 0 fi failed_step=$(printf '%s\n' "$STEP_OUTCOMES" | grep -E '=(failure|cancelled)$' | head -n1 | cut -d= -f1) if [ -n "$failed_step" ]; then title="❌ بیلد ناموفق" elif printf '%s\n' "$STEP_OUTCOMES" | grep -q '^Push Docker images=success$'; then title="✅ بیلد موفق" elif printf '%s\n' "$STEP_OUTCOMES" | grep -q '^Build Docker images=success$'; then title="✅ بیلد موفق؛ پوش رجیستری هنوز خاموش است" else title="⚠️ بیلد کامل نشد" fi commit=$(git log -1 --pretty='%h — %s' 2>/dev/null || echo "${GITHUB_SHA:0:7}") elapsed=$(( $(date +%s) - ${BUILD_STARTED:-$(date +%s)} )) text="${title} پروژه: ${GITHUB_REPOSITORY} تگ: ${TAG:-${GITHUB_REF_NAME}}" if [ -z "$failed_step" ] && [ -n "$TAG" ]; then text="${text} image: ${REG}/montact-api:${TAG} image: ${REG}/montact-web:${TAG} image: ${REG}/montact-stt:${TAG}" fi [ -n "$failed_step" ] && text="${text} مرحلهٔ خطا: ${failed_step}" text="${text} کامیت: ${commit} توسط: ${GITHUB_ACTOR} مدت: $((elapsed / 60))m$((elapsed % 60))s لاگ: ${RUN_URL}" msg_file=$(mktemp) printf '%s\n' "$text" | sed 's/^[[:space:]]*//' > "$msg_file" curl -sS -m 20 -X POST "https://tapi.bale.ai/bot${BALE_TOKEN}/sendMessage" \ --data-urlencode "chat_id=${BALE_CHAT_ID}" \ --data-urlencode "text@${msg_file}"