Improve the CI workflow with caching and add timeout limit #3
Workflow file for this run
This file contains hidden or 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: Release | |
| on: | |
| push: | |
| tags: | |
| - 'v*' | |
| workflow_dispatch: | |
| permissions: | |
| contents: write | |
| env: | |
| CARGO_TERM_COLOR: always | |
| CARGO_INCREMENTAL: 0 # Disable incremental for release builds | |
| jobs: | |
| create-release: | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 5 | |
| outputs: | |
| version: ${{ steps.get_version.outputs.version }} | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Get version from tag | |
| id: get_version | |
| run: echo "version=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT | |
| - name: Create Release | |
| id: create_release | |
| uses: softprops/action-gh-release@v1 | |
| with: | |
| name: CANopen Data Viewer v${{ steps.get_version.outputs.version }} | |
| body: | | |
| ## CANopen Real-time Monitor & Plotter v${{ steps.get_version.outputs.version }} | |
| ### Features | |
| - Real-time CANopen SDO monitoring and plotting | |
| - TPDO listener with automatic data plotting | |
| - Comprehensive subscription management | |
| - Plot export (PNG screenshots and CSV data) | |
| - Automatic logging with timestamps | |
| - Connection status monitoring | |
| ### Installation | |
| **Linux (Debian/Ubuntu):** | |
| ```bash | |
| # Install .deb package | |
| sudo dpkg -i canopen-viewer_${{ steps.get_version.outputs.version }}_amd64.deb | |
| sudo apt-get install -f # Fix any dependency issues | |
| ``` | |
| **Linux (Generic):** | |
| ```bash | |
| # Extract and run executable | |
| tar xzf canopen-viewer-v${{ steps.get_version.outputs.version }}-x86_64-unknown-linux-gnu.tar.gz | |
| cd dist | |
| chmod +x canopen-viewer | |
| ./canopen-viewer | |
| ``` | |
| ### System Requirements | |
| - Linux with CAN interface support | |
| - socketcan kernel modules | |
| - For virtual testing: `sudo modprobe vcan && sudo ip link add dev vcan0 type vcan && sudo ip link set up vcan0` | |
| ### Quick Start | |
| 1. Set up your CAN interface (physical or virtual) | |
| 2. Run the application | |
| 3. Select interface, node ID, and EDS file | |
| 4. Start monitoring and subscribe to SDO objects or start TPDO listeners | |
| draft: false | |
| prerelease: false | |
| generate_release_notes: true | |
| build-linux: | |
| needs: create-release | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 30 | |
| strategy: | |
| matrix: | |
| target: [x86_64-unknown-linux-gnu] | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Install Rust stable | |
| uses: dtolnay/rust-toolchain@stable | |
| with: | |
| targets: ${{ matrix.target }} | |
| - name: Install system dependencies | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y \ | |
| libx11-dev \ | |
| libxrandr-dev \ | |
| libxi-dev \ | |
| libgl1-mesa-dev \ | |
| libasound2-dev \ | |
| pkg-config \ | |
| build-essential | |
| # CRITICAL: Cache Cargo to avoid rebuilding dependencies | |
| - name: Cache Cargo | |
| uses: Swatinem/rust-cache@v2 | |
| with: | |
| shared-key: "canopen-viewer-release" | |
| cache-on-failure: false | |
| - name: Update version in Cargo.toml | |
| run: | | |
| sed -i 's/version = "0\.1\.0"/version = "${{ needs.create-release.outputs.version }}"/' canopen-viewer/Cargo.toml | |
| sed -i 's/version = "0\.1\.0"/version = "${{ needs.create-release.outputs.version }}"/' canopen-common/Cargo.toml | |
| sed -i 's/version = "0\.1\.0"/version = "${{ needs.create-release.outputs.version }}"/' mock-canopen-node/Cargo.toml | |
| - name: Build release binary | |
| run: cargo build --release --target ${{ matrix.target }} -p canopen-viewer | |
| - name: Create binary archive | |
| run: | | |
| mkdir -p dist | |
| cp target/${{ matrix.target }}/release/canopen-viewer dist/ | |
| cp README.md dist/ | |
| cp LICENSE dist/ || echo "LICENSE file not found, skipping" | |
| cd dist | |
| tar czf ../canopen-viewer-v${{ needs.create-release.outputs.version }}-${{ matrix.target }}.tar.gz . | |
| - name: Upload binary archive | |
| uses: softprops/action-gh-release@v1 | |
| with: | |
| files: ./canopen-viewer-v${{ needs.create-release.outputs.version }}-${{ matrix.target }}.tar.gz | |
| build-deb-package: | |
| needs: create-release | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 30 | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Install Rust stable | |
| uses: dtolnay/rust-toolchain@stable | |
| - name: Install system dependencies | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y \ | |
| libx11-dev \ | |
| libxrandr-dev \ | |
| libxi-dev \ | |
| libgl1-mesa-dev \ | |
| libasound2-dev \ | |
| pkg-config \ | |
| build-essential \ | |
| dpkg-dev \ | |
| fakeroot | |
| # CRITICAL: Cache Cargo for deb builds too | |
| - name: Cache Cargo | |
| uses: Swatinem/rust-cache@v2 | |
| with: | |
| shared-key: "canopen-viewer-deb" | |
| cache-on-failure: false | |
| - name: Update version in Cargo.toml | |
| run: | | |
| sed -i 's/version = "0\.1\.0"/version = "${{ needs.create-release.outputs.version }}"/' canopen-viewer/Cargo.toml | |
| sed -i 's/version = "0\.1\.0"/version = "${{ needs.create-release.outputs.version }}"/' canopen-common/Cargo.toml | |
| sed -i 's/version = "0\.1\.0"/version = "${{ needs.create-release.outputs.version }}"/' mock-canopen-node/Cargo.toml | |
| - name: Build release binary | |
| run: cargo build --release -p canopen-viewer | |
| - name: Create .deb package structure | |
| run: | | |
| mkdir -p debian/canopen-viewer_${{ needs.create-release.outputs.version }}_amd64/DEBIAN | |
| mkdir -p debian/canopen-viewer_${{ needs.create-release.outputs.version }}_amd64/usr/bin | |
| mkdir -p debian/canopen-viewer_${{ needs.create-release.outputs.version }}_amd64/usr/share/applications | |
| mkdir -p debian/canopen-viewer_${{ needs.create-release.outputs.version }}_amd64/usr/share/doc/canopen-viewer | |
| mkdir -p debian/canopen-viewer_${{ needs.create-release.outputs.version }}_amd64/usr/share/pixmaps | |
| - name: Copy binary and create package files | |
| run: | | |
| # Copy binary | |
| cp target/release/canopen-viewer debian/canopen-viewer_${{ needs.create-release.outputs.version }}_amd64/usr/bin/ | |
| # Create control file | |
| cat > debian/canopen-viewer_${{ needs.create-release.outputs.version }}_amd64/DEBIAN/control << EOF | |
| Package: canopen-viewer | |
| Version: ${{ needs.create-release.outputs.version }} | |
| Section: electronics | |
| Priority: optional | |
| Architecture: amd64 | |
| Depends: libc6, libx11-6, libxrandr2, libxi6, libgl1-mesa-glx, libasound2 | |
| Maintainer: CANopen Data Viewer Team | |
| Description: CANopen Real-time Monitor & Plotter | |
| A high-performance Rust application for CANopen diagnostics providing | |
| real-time visualization of TPDO/SDO data from CAN bus devices with | |
| configurable polling and plotting capabilities. | |
| EOF | |
| # Create desktop entry | |
| cat > debian/canopen-viewer_${{ needs.create-release.outputs.version }}_amd64/usr/share/applications/canopen-viewer.desktop << EOF | |
| [Desktop Entry] | |
| Name=CANopen Data Viewer | |
| Comment=CANopen Real-time Monitor & Plotter | |
| Exec=canopen-viewer | |
| Icon=canopen-viewer | |
| Type=Application | |
| Categories=Development;Electronics; | |
| EOF | |
| # Copy documentation | |
| cp README.md debian/canopen-viewer_${{ needs.create-release.outputs.version }}_amd64/usr/share/doc/canopen-viewer/ | |
| - name: Build .deb package | |
| run: | | |
| cd debian | |
| dpkg-deb --build canopen-viewer_${{ needs.create-release.outputs.version }}_amd64 | |
| - name: Upload .deb package | |
| uses: softprops/action-gh-release@v1 | |
| with: | |
| files: ./debian/canopen-viewer_${{ needs.create-release.outputs.version }}_amd64.deb |