Merge pull request #140 from stepfunc/dev #610
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: CI | |
on: | |
push: | |
branches: | |
- main | |
tags: | |
- "*" | |
pull_request: | |
jobs: | |
# Check formatting and run clippy lints | |
linting: | |
strategy: | |
fail-fast: false | |
matrix: | |
rust: | |
- stable | |
- beta | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Install Rust ${{ matrix.rust }} | |
uses: dtolnay/rust-toolchain@master | |
with: | |
toolchain: ${{ matrix.rust }} | |
components: rustfmt, clippy | |
- name: Format | |
run: cargo fmt --all -- --check | |
- name: Clippy | |
run: cargo clippy -- -D warnings | |
# Build the workspace with the feature permutations not built by default | |
features: | |
strategy: | |
fail-fast: false | |
matrix: | |
feature-args: | |
- "--no-default-features" | |
- "--no-default-features --features serial" | |
- "--no-default-features --features tls" | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Install Rust ${{ matrix.rust }} | |
uses: dtolnay/rust-toolchain@stable | |
- name: Build the workspace with the features | |
run: cargo build --release ${{ matrix.feature-args }} | |
# Run the unit tests on Windows and Linux | |
test: | |
strategy: | |
fail-fast: false | |
matrix: | |
os: | |
- ubuntu-latest | |
- windows-latest | |
rust: | |
- stable | |
- beta | |
runs-on: ${{ matrix.os }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Install Rust ${{ matrix.rust }} | |
uses: dtolnay/rust-toolchain@master | |
with: | |
toolchain: ${{ matrix.rust }} | |
- name: Run Rust unit tests | |
run: cargo test | |
# Build API documentation packages | |
documentation: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Install Rust | |
uses: dtolnay/rust-toolchain@stable | |
- name: Install doxygen 1.9.5 | |
run: wget -q https://github.com/stepfunc/ci-files/raw/main/doxygen/doxygen-1.9.5.linux.bin.tar.gz -O- | sudo tar --strip-components=1 -C /usr -xz doxygen-1.9.5 | |
- name: Build FFI and JNI | |
run: cargo build --release -p rodbus-ffi -p rodbus-ffi-java | |
- name: Build Rustdoc | |
run: cargo doc -p rodbus --no-deps | |
- name: C bindings | |
run: cargo run --bin rodbus-bindings -- --c --doxygen --no-tests | |
- name: .NET bindings | |
run: cargo run --bin rodbus-bindings -- --dotnet --doxygen --no-tests | |
- name: Java bindings | |
run: cargo run --bin rodbus-bindings -- --java | |
- name: Extract documentation | |
run: | | |
mkdir -p ~/doc | |
cp -a target/doc ~/doc/rust | |
cp -a ffi/bindings/c/generated/doc/c ~/doc/c | |
cp -a ffi/bindings/c/generated/doc/cpp ~/doc/cpp | |
cp -a ffi/bindings/dotnet/rodbus/doc ~/doc/dotnet | |
cp -a ffi/bindings/java/rodbus/target/apidocs ~/doc/java | |
rm ffi/bindings/c/generated/logo.png ffi/bindings/c/generated/doxygen-awesome.css | |
- name: Upload documentation | |
uses: actions/upload-artifact@v3 | |
with: | |
name: doc | |
path: ~/doc | |
# Build bindings on Windows x64 [64-bit MSVC (Windows 7+) (x86_64-pc-windows-msvc)] and x86 [32-bit MSVC (Windows 7+) (i686-pc-windows-msvc)] | |
bindings-windows: | |
runs-on: windows-latest | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- target: x86_64-pc-windows-msvc # 64-bit MSVC (Windows 7+) | |
test: true | |
- target: i686-pc-windows-msvc # 32-bit MSVC (Windows 7+) | |
test: false | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Install Rust | |
uses: dtolnay/rust-toolchain@stable | |
- name: Create the FFI modules dir | |
run: mkdir ffi-modules\${{ matrix.target }} | |
- name: Build FFI | |
run: cargo build -p rodbus-ffi --release --target ${{ matrix.target }} | |
- name: Build JNI | |
run: cargo build -p rodbus-ffi-java --release --target ${{ matrix.target }} | |
- name: Copy the FFI and JNI libs | |
shell: pwsh | |
run: | | |
Copy-Item -Path ./target/${{ matrix.target }}/release/rodbus_ffi.dll -Destination ffi-modules/${{ matrix.target }} | |
Copy-Item -Path ./target/${{ matrix.target }}/release/rodbus_ffi.dll.lib -Destination ffi-modules/${{ matrix.target }} | |
Copy-Item -Path ./target/${{ matrix.target }}/release/rodbus_ffi_java.dll -Destination ffi-modules/${{ matrix.target }} | |
- name: Upload compiled FFI modules | |
uses: actions/upload-artifact@v3 | |
with: | |
name: ffi-modules | |
path: ffi-modules | |
- name: C Bindings Tests | |
if: ${{ matrix.test }} | |
run: cargo run --bin rodbus-bindings -- --c -r ${{ matrix.target }} -a ./target/${{ matrix.target }}/release | |
- name: Test .NET Bindings | |
if: ${{ matrix.test }} | |
run: cargo run --bin rodbus-bindings -- --dotnet -r ${{ matrix.target }} -a ./target/${{ matrix.target }}/release | |
- name: Test Java Bindings | |
if: ${{ matrix.test }} | |
run: cargo run --bin rodbus-bindings -- --java -r ${{ matrix.target }} -a ./target/${{ matrix.target }}/release | |
# Build bindings on MacOS [64-bit macOS (10.7+, Lion+) (x86_64-apple-darwin)] | |
bindings-macos: | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- runner: macos-14 | |
target: aarch64-apple-darwin | |
- runner: macos-13 | |
target: x86_64-apple-darwin | |
runs-on: ${{ matrix.runner }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Install Rust | |
uses: dtolnay/rust-toolchain@stable | |
- name: Create FFI modules dir | |
run: mkdir -p ffi-modules/${{ matrix.target }} | |
- name: Build FFI | |
run: cargo build -p rodbus-ffi --release | |
- name: Build JNI | |
run: cargo build -p rodbus-ffi-java --release | |
- name: Copy the FFI and JNI libs | |
run: | | |
cp ./target/release/librodbus_ffi.dylib ./ffi-modules/${{ matrix.target }} | |
cp ./target/release/librodbus_ffi_java.dylib ./ffi-modules/${{ matrix.target }} | |
- name: Upload compiled FFI modules | |
uses: actions/upload-artifact@v3 | |
with: | |
name: ffi-modules | |
path: ffi-modules | |
- name: Test .NET bindings | |
run: cargo run --bin rodbus-bindings -- --dotnet | |
- name: Test Java bindings | |
run: cargo run --bin rodbus-bindings -- --java | |
# Cross-compilation for various Linux architectures | |
ffi-cross: | |
env: | |
# By default, MUSL will not produce a cdylib with dynamic linkage to MUSL LIB C | |
CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_RUSTFLAGS: "-C target-feature=-crt-static" | |
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_RUSTFLAGS: "-C target-feature=-crt-static" | |
CARGO_TARGET_ARM_UNKNOWN_LINUX_MUSLEABIHF_RUSTFLAGS: "-C target-feature=-crt-static" | |
strategy: | |
fail-fast: false | |
matrix: | |
target: | |
- x86_64-unknown-linux-gnu # 64-bit Linux (kernel 2.6.32+, glibc 2.11+) | |
- x86_64-unknown-linux-musl # 64-bit Linux with MUSL | |
- arm-unknown-linux-gnueabihf # ARMv6 Linux, hardfloat (kernel 3.2, glibc 2.17) | |
- arm-unknown-linux-musleabihf # ARMv6 Linux with MUSL, hardfloat | |
- aarch64-unknown-linux-gnu # ARM64 Linux (kernel 4.2, glibc 2.17+) | |
- aarch64-unknown-linux-musl # ARM64 Linux with MUSL | |
- armv7-unknown-linux-gnueabihf # ARMv7 Linux, hardfloat (kernel 3.2, glibc 2.17) | |
- arm-unknown-linux-gnueabi # ARMv6 Linux (kernel 3.2, glibc 2.17) | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Install Rust | |
uses: dtolnay/rust-toolchain@stable | |
- name: Install Rust Cross | |
run: cargo install cross | |
- name: Create ffi-modules dir | |
run: mkdir -p ffi-modules/${{ matrix.target }} | |
- name: Build FFI | |
run: cross build -p rodbus-ffi --release --target ${{ matrix.target }} | |
- name: Build JNI | |
run: cross build -p rodbus-ffi-java --release --target ${{ matrix.target }} | |
- name: Copy the FFI and JNI libs | |
run: | | |
cp ./target/${{ matrix.target }}/release/librodbus_ffi.so ./ffi-modules/${{ matrix.target }} | |
cp ./target/${{ matrix.target }}/release/librodbus_ffi_java.so ./ffi-modules/${{ matrix.target }} | |
- name: Upload compiled FFI modules | |
uses: actions/upload-artifact@v3 | |
with: | |
name: ffi-modules | |
path: ffi-modules | |
guide: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Install dependencies | |
working-directory: guide | |
run: yarn install | |
- name: Build guide | |
working-directory: guide | |
run: | | |
yarn build | |
mkdir -p ~/doc/guide | |
mv build/* ~/doc/guide | |
- name: Upload guide | |
uses: actions/upload-artifact@v3 | |
with: | |
name: doc | |
path: ~/doc | |
# Package all the generated bindings | |
packaging: | |
needs: [documentation, bindings-windows, bindings-macos, ffi-cross] | |
runs-on: ubuntu-latest | |
steps: | |
- name: Install Rust | |
uses: dtolnay/rust-toolchain@stable | |
- name: Install Cargo CycloneDx | |
run: cargo install cargo-cyclonedx | |
- name: Install custom allow-list tool | |
run: cargo install --git https://github.com/stepfunc/bom-tools.git | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- name: Download compiled FFI | |
uses: actions/download-artifact@v3 | |
with: | |
name: ffi-modules | |
path: ffi-modules | |
- name: Create SBOMs | |
run: | | |
for dir in ffi-modules/*; do | |
echo "processing path: $dir" | |
target=`basename "${dir}"` | |
cargo cyclonedx -f json --target $target | |
mv ./ffi/rodbus-ffi/rodbus-ffi.cdx.json ffi-modules/$target | |
mv ./ffi/rodbus-ffi-java/rodbus-ffi-java.cdx.json ffi-modules/$target | |
done | |
- name: Create FFI third-party-licenses.txt | |
run: allow-list gen-licenses-dir -l ffi-modules -b rodbus-ffi.cdx.json -c allowed.json > third-party-licenses.txt | |
- name: Create FFI third-party-licenses-java.txt | |
run: allow-list gen-licenses-dir -l ffi-modules -b rodbus-ffi-java.cdx.json -c allowed.json > third-party-licenses-java.txt | |
- name: Package C/C++ bindings | |
run: cargo run --bin rodbus-bindings -- --c --package ./ffi-modules --options ./packaging.json -f third-party-licenses.txt | |
- name: Package .NET bindings | |
run: cargo run --bin rodbus-bindings -- --dotnet --package ./ffi-modules --options ./packaging.json -f third-party-licenses.txt | |
- name: Package Java bindings | |
run: cargo run --bin rodbus-bindings -- --java --package ./ffi-modules --options ./packaging.json -f third-party-licenses-java.txt | |
- name: Upload C/C++ bindings | |
uses: actions/upload-artifact@v3 | |
with: | |
name: c-bindings | |
path: ffi/bindings/c/generated/* | |
- name: Upload .NET bindings | |
uses: actions/upload-artifact@v3 | |
with: | |
name: dotnet-bindings | |
path: ffi/bindings/dotnet/nupkg/* | |
- name: Upload Java bindings | |
uses: actions/upload-artifact@v3 | |
with: | |
name: java-bindings | |
path: ffi/bindings/java/rodbus/target/*.jar | |
- name: Upload Java pom.xml | |
uses: actions/upload-artifact@v3 | |
with: | |
name: java-bindings | |
path: ffi/bindings/java/rodbus/pom.xml | |
release: | |
needs: [packaging, guide] | |
runs-on: ubuntu-latest | |
if: startsWith(github.ref, 'refs/tags/') | |
steps: | |
- name: Download all artifacts | |
uses: actions/download-artifact@v3 | |
with: | |
path: artifacts | |
- name: Package C Bindings | |
run: | | |
mkdir release | |
cd artifacts/c-bindings | |
zip -r ../../release/rodbus-${GITHUB_REF##*/}.zip . | |
- name: Checkout stepfunc/docs | |
uses: actions/checkout@v3 | |
with: | |
repository: stepfunc/docs | |
ssh-key: ${{ secrets.SFIO_DOCS_SSH_KEY }} | |
path: docs | |
- name: Upload docs | |
working-directory: docs | |
run: | | |
git config user.name github-actions | |
git config user.email github-actions@github.com | |
rm -rf ./rodbus/${GITHUB_REF##*/} | |
mkdir -p ./rodbus/${GITHUB_REF##*/} | |
cp -a ../artifacts/doc/* ./rodbus/${GITHUB_REF##*/} | |
git add -A | |
git commit -m "[rodbus] Release ${GITHUB_REF##*/}" | |
git push | |
- name: Import PGP key | |
uses: crazy-max/ghaction-import-gpg@v5 | |
with: | |
gpg_private_key: ${{ secrets.SFIO_PGP_PRIVATE_KEY }} | |
passphrase: ${{ secrets.SFIO_PGP_PRIVATE_KEY_PASSPHRASE }} | |
- name: Login to OSSRH | |
uses: whelk-io/maven-settings-xml-action@v21 | |
with: | |
servers: '[{ "id": "ossrh", "username": "${{ secrets.SFIO_OSSRH_USERNAME }}", "password": "${{ secrets.SFIO_OSSRH_PASSWORD }}" }]' | |
- name: Deploy Java | |
shell: bash | |
working-directory: artifacts/java-bindings | |
run: > | |
shopt -s extglob && | |
mvn gpg:sign-and-deploy-file -Durl=https://oss.sonatype.org/service/local/staging/deploy/maven2 -DrepositoryId=ossrh -DpomFile=pom.xml -Dfile=rodbus-${{github.ref_name}}.jar && | |
mvn gpg:sign-and-deploy-file -Durl=https://oss.sonatype.org/service/local/staging/deploy/maven2 -DrepositoryId=ossrh -DpomFile=pom.xml -Dfile=rodbus-${{github.ref_name}}-sources.jar -Dclassifier=sources && | |
mvn gpg:sign-and-deploy-file -Durl=https://oss.sonatype.org/service/local/staging/deploy/maven2 -DrepositoryId=ossrh -DpomFile=pom.xml -Dfile=rodbus-${{github.ref_name}}-javadoc.jar -Dclassifier=javadoc | |
- name: Publish NuGet package | |
shell: bash | |
run: dotnet nuget push $(find artifacts/dotnet-bindings/rodbus*.nupkg) -s https://api.nuget.org/v3/index.json -k ${{ secrets.SFIO_NUGET_KEY }} | |
- name: Create GitHub release | |
uses: softprops/action-gh-release@v1 | |
with: | |
draft: true | |
files: | | |
release/*.zip | |
artifacts/dotnet-bindings/rodbus* | |
artifacts/java-bindings/*.jar | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |