name: Release on: push: tags: - "v*" branches: - dev jobs: build: strategy: fail-fast: true matrix: goos: [linux, windows] goarch: [amd64] include: - goos: linux goarch: s390x - goos: linux goarch: arm64 name: Build artifacts runs-on: ubuntu-latest container: image: goreleaser/goreleaser-cross:v1.23 steps: - run: git config --global --add safe.directory /__w/nezha/nezha - uses: actions/checkout@v4 - uses: robinraju/release-downloader@v1 with: repository: nezhahq/admin-frontend tag: v1.0.9 fileName: dist.zip latest: true extract: true - name: prepare admin-frontend dists run: | rm -rf cmd/dashboard/admin-dist mv dist cmd/dashboard/admin-dist - uses: robinraju/release-downloader@v1 with: repository: nezhahq/user-frontend tag: v1.0.4 fileName: dist.zip latest: true extract: true - name: prepare admin-frontend dists run: | rm -rf cmd/dashboard/user-dist mv dist cmd/dashboard/user-dist - name: Fetch IPInfo GeoIP Database env: IPINFO_TOKEN: ${{ secrets.IPINFO_TOKEN }} run: | rm pkg/geoip/geoip.db wget -qO pkg/geoip/geoip.db https://ipinfo.io/data/free/country.mmdb?token=${IPINFO_TOKEN} - name: Set up Go uses: actions/setup-go@v5 with: go-version: "1.23.x" - name: generate swagger docs run: | go install github.com/swaggo/swag/cmd/swag@latest swag init --pd -d . -g ./cmd/dashboard/main.go -o ./cmd/dashboard/docs --parseGoList=false - name: Build with tag if: contains(github.ref, 'refs/tags/') uses: goreleaser/goreleaser-action@v6 env: GOOS: ${{ matrix.goos }} GOARCH: ${{ matrix.goarch }} GOARM: ${{ matrix.goarm }} with: distribution: goreleaser version: "~> v2" args: build --single-target --clean --skip=validate - name: Build snapshot if: contains(github.ref, 'refs/tags/') == false uses: goreleaser/goreleaser-action@v6 env: GOOS: ${{ matrix.goos }} GOARCH: ${{ matrix.goarch }} GOARM: ${{ matrix.goarm }} with: distribution: goreleaser version: "~> v2" args: build --single-target --clean --skip=validate --snapshot - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: dashboard-${{ matrix.goos }}-${{ matrix.goarch }} path: | ./dist/*/* release: runs-on: ubuntu-latest if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') needs: build name: Release steps: - name: Download artifacts uses: actions/download-artifact@v4 with: path: ./assets - name: Archive and compress binaries run: | find assets/*/*/* -type f | while read -r file; do dir=$(dirname "$file") filename=$(basename "$file") fileWithoutExt="${filename%.*}" zip -jr "$dir/$fileWithoutExt.zip" "$file" done - name: Release uses: ncipollo/release-action@v1 with: artifacts: "assets/*/*/*.zip" generateReleaseNotes: true - name: Purge jsdelivr cache run: | curl -s https://purge.jsdelivr.net/gh/${{ github.repository_owner }}/nezha@master/script/install.sh curl -s https://purge.jsdelivr.net/gh/${{ github.repository_owner }}/nezha@master/script/nezha-agent.service curl -s https://purge.jsdelivr.net/gh/${{ github.repository_owner }}/nezha@master/script/docker-compose.yaml curl -s https://purge.jsdelivr.net/gh/${{ github.repository_owner }}/nezha@master/script/config.yaml LOWER_USERNAME=$(echo "${{ github.repository_owner }}" | tr '[:upper:]' '[:lower:]') curl -s https://purge.jsdelivr.net/gh/$LOWER_USERNAME/nezha@master/script/install.sh curl -s https://purge.jsdelivr.net/gh/$LOWER_USERNAME/nezha@master/script/nezha-agent.service curl -s https://purge.jsdelivr.net/gh/$LOWER_USERNAME/nezha@master/script/docker-compose.yaml curl -s https://purge.jsdelivr.net/gh/$LOWER_USERNAME/nezha@master/script/config.yaml - name: Trigger sync env: GH_REPO: ${{ github.repository }} GH_TOKEN: ${{ github.token }} GH_DEBUG: api run: | gh workflow run sync-release.yml release-docker: runs-on: ubuntu-latest if: github.event_name == 'push' needs: build name: Release Docker images steps: - uses: actions/checkout@v4 - name: Download artifacts uses: actions/download-artifact@v4 with: path: ./assets - name: Fix permissions run: | chmod -R +x ./assets/* mkdir dist mv ./assets/*/*/* ./dist - name: Extract branch name in tag run: | if [[ $GITHUB_REF == refs/heads/* ]]; then export TAG_NAME=$(echo ${GITHUB_REF#refs/heads/}) else export TAG_NAME=$(echo ${GITHUB_REF#refs/tags/}) fi echo "tag=$TAG_NAME" >> $GITHUB_OUTPUT id: extract_branch - name: Log into GHCR uses: docker/login-action@master with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ github.token }} - name: Log in to the AliyunCS if: contains(github.ref, 'refs/tags/') uses: docker/login-action@master with: registry: registry.cn-shanghai.aliyuncs.com username: ${{ secrets.ALI_USER }} password: ${{ secrets.ALI_PAT }} - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Set up image name run: | GHCR_IMAGE_NAME=$(echo "ghcr.io/${{ github.repository_owner }}/nezha" | tr '[:upper:]' '[:lower:]') if [ ${{ github.repository_owner }} = "nezhahq" ] then ALI_IMAGE_NAME=$(echo "registry.cn-shanghai.aliyuncs.com/naibahq/nezha-dashboard") else ALI_IMAGE_NAME=$(echo "registry.cn-shanghai.aliyuncs.com/${{ github.repository_owner }}/nezha-dashboard" | tr '[:upper:]' '[:lower:]') fi echo "GHCR_IMAGE_NAME=$GHCR_IMAGE_NAME" >> $GITHUB_OUTPUT echo "ALI_IMAGE_NAME=$ALI_IMAGE_NAME" >> $GITHUB_OUTPUT id: image-name - name: Build dasbboard image And Push with tag if: contains(github.ref, 'refs/tags/') uses: docker/build-push-action@v5 with: context: . file: ./Dockerfile platforms: linux/amd64,linux/arm64,linux/s390x push: true tags: | ${{ steps.image-name.outputs.GHCR_IMAGE_NAME }}:latest ${{ steps.image-name.outputs.GHCR_IMAGE_NAME }}:${{ steps.extract_branch.outputs.tag }} ${{ steps.image-name.outputs.ALI_IMAGE_NAME }}:latest ${{ steps.image-name.outputs.ALI_IMAGE_NAME }}:${{ steps.extract_branch.outputs.tag }} - name: Build dasbboard image And Push snapshot if: contains(github.ref, 'refs/tags/') == false uses: docker/build-push-action@v5 with: context: . file: ./Dockerfile platforms: linux/amd64,linux/arm64,linux/s390x push: true tags: | ${{ steps.image-name.outputs.GHCR_IMAGE_NAME }}:${{ steps.extract_branch.outputs.tag }}