name: Release on: push: branches: [main] jobs: build: runs-on: ubuntu-builder strategy: fail-fast: false matrix: target: - name: linux-amd64 toolchain: "" cmake_extra: "" - name: linux-arm64 toolchain: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-linux-arm64.cmake cmake_extra: "" - name: linux-armhf toolchain: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-linux-armhf.cmake cmake_extra: "" - name: windows-amd64 toolchain: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-windows-amd64.cmake cmake_extra: -DBUILD_EXAMPLES=OFF -DBUILD_TESTING=OFF - name: baremetal-arm32 toolchain: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-baremetal-arm32.cmake cmake_extra: -DBUILD_EXAMPLES=OFF -DBUILD_TESTING=OFF -DBUILD_SHARED=OFF steps: - uses: actions/checkout@v4 - name: Install cross-compilers run: | sudo apt-get update sudo apt-get install -y \ gcc-arm-linux-gnueabihf \ gcc-aarch64-linux-gnu \ gcc-mingw-w64-x86-64 \ gcc-arm-none-eabi - name: Configure run: cmake -S . -B build -DBUILD_TESTING=OFF ${{ matrix.target.toolchain }} ${{ matrix.target.cmake_extra }} - name: Build run: cmake --build build - name: Run tests if: matrix.target.name == 'linux-amd64' run: ctest --test-dir build - name: Package run: | PKG="datarouter-${{ matrix.target.name }}" mkdir -p "dist/$PKG" cp datarouter.h datarouter_config_template.h LICENSE README.md "dist/$PKG/" cp build/libDataRouter.a "dist/$PKG/" 2>/dev/null || true cp build/libDataRouter.so "dist/$PKG/" 2>/dev/null || true cp build/libDataRouter.dll "dist/$PKG/" 2>/dev/null || true cp build/libDataRouter.dll.a "dist/$PKG/" 2>/dev/null || true cp build/example "dist/$PKG/" 2>/dev/null || true cp build/example.exe "dist/$PKG/" 2>/dev/null || true - uses: actions/upload-artifact@v4 with: name: datarouter-${{ matrix.target.name }} path: dist/datarouter-${{ matrix.target.name }} release: needs: build runs-on: ubuntu-latest permissions: contents: write steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Verify merge commit run: | PARENTS=$(git log --format="%P" -1 | wc -w) if [ "$PARENTS" -lt 2 ]; then echo "Not a merge commit. Skipping release." exit 78 fi - name: Read tag from HEAD id: tag run: | TAG=$(git tag --points-at HEAD | grep '^v' | head -n1) if [ -z "$TAG" ]; then echo "No v* tag on HEAD. Create a tag manually, then merge." exit 78 fi echo "tag=$TAG" >> "$GITHUB_OUTPUT" - uses: actions/download-artifact@v4 with: path: artifacts - name: Create release & upload assets via Gitea API env: GITEA_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | TAG="${{ steps.tag.outputs.tag }}" SERVER="${GITHUB_SERVER_URL:-https://git.7iwind.cn}" GITEA_API="${SERVER}/api/v1/repos/${GITHUB_REPOSITORY}/releases" echo "=== Create release for tag ${TAG} ===" RESP=$(curl -s -X POST \ -H "Authorization: token ${GITEA_TOKEN}" \ -H "Content-Type: application/json" \ -d "{\"tag_name\":\"${TAG}\",\"name\":\"DataRouter ${TAG}\",\"body\":\"## DataRouter ${TAG}\\n\\n合并 develop → main 后自动构建发布。\"}" \ "${GITEA_API}") ID=$(echo "$RESP" | python3 -c "import sys,json;print(json.load(sys.stdin)['id'])") echo "Release ID: ${ID}" for dir in artifacts/*/; do name="$(basename "$dir").tar.gz" tar czf "/tmp/${name}" -C "$dir" . echo "Uploading ${name} ..." curl -s -X POST \ -H "Authorization: token ${GITEA_TOKEN}" \ -H "Content-Type: application/octet-stream" \ --data-binary @"/tmp/${name}" \ "${GITEA_API}/${ID}/assets?name=${name}" done