ci.yml (7870B)
1 name: CI 2 3 on: 4 pull_request: 5 push: 6 branches: main 7 schedule: 8 - cron: "0 18 * * 1,4,6" # 1800 UTC every Monday, Thursday, Saturday 9 10 jobs: 11 tests-cargo: 12 name: Unit tests 13 runs-on: ${{ matrix.os }} 14 15 strategy: 16 fail-fast: false 17 matrix: 18 os: [windows-latest, macos-latest, ubuntu-latest] 19 rust_version: [stable, 1.74.0] 20 21 steps: 22 - name: Checkout repository 23 uses: actions/checkout@v3 24 25 - name: Install Rust toolchain 26 uses: dtolnay/rust-toolchain@master 27 with: 28 toolchain: ${{ matrix.rust_version }} 29 30 - name: Cache Rust dependencies 31 uses: Swatinem/rust-cache@v2 32 33 - name: Run unit tests 34 run: cargo test --all-features --verbose 35 36 tests-cross: 37 name: Unit tests 38 runs-on: ubuntu-latest 39 40 strategy: 41 fail-fast: false 42 matrix: 43 target: [aarch64-unknown-linux-gnu] 44 rust_version: [stable, 1.74.0] 45 46 steps: 47 - name: Checkout repository 48 uses: actions/checkout@v3 49 50 - name: Install Rust toolchain 51 uses: dtolnay/rust-toolchain@master 52 with: 53 toolchain: ${{ matrix.rust_version }} 54 targets: ${{ matrix.target }} 55 56 - name: Install cross-compilation toolset 57 run: cargo install cross 58 59 - name: Cache Rust dependencies 60 uses: Swatinem/rust-cache@v2 61 62 # Note that we do not run code coverage because 63 # it isn't readily accessible from cross-compilation 64 # environment. (A PR to fix this would be welcomed!) 65 66 - name: Run unit tests (cross build) 67 run: cross test --all-targets --all-features --target ${{ matrix.target }} 68 69 tests-wasm: 70 name: Unit tests (WASM) 71 runs-on: ubuntu-latest 72 73 steps: 74 - name: Checkout repository 75 uses: actions/checkout@v3 76 77 - name: Install Rust toolchain 78 uses: dtolnay/rust-toolchain@stable 79 80 - name: Install wasm-pack 81 run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh 82 83 - name: Run Wasm tests 84 run: wasm-pack test --chrome --headless 85 working-directory: ./sdk 86 87 test-direct-minimal-versions: 88 name: Unit tests with minimum versions of direct dependencies 89 runs-on: ${{ matrix.os }} 90 91 strategy: 92 fail-fast: false 93 matrix: 94 os: [windows-latest, macos-latest, ubuntu-latest] 95 96 steps: 97 - name: Checkout repository 98 uses: actions/checkout@v3 99 100 - name: Install Rust toolchain 101 uses: dtolnay/rust-toolchain@nightly 102 with: 103 components: llvm-tools-preview 104 105 - name: Cache Rust dependencies 106 uses: Swatinem/rust-cache@v2 107 108 - name: Run tests 109 run: cargo +nightly test -Z direct-minimal-versions --all-targets --all-features 110 111 publish-preflight: 112 name: Preflight crate publish 113 runs-on: ${{ matrix.os }} 114 115 strategy: 116 fail-fast: false 117 matrix: 118 os: [ubuntu-latest] 119 rust_version: [stable] 120 121 steps: 122 - name: Checkout repository 123 uses: actions/checkout@v3 124 125 - name: Install Rust toolchain 126 uses: dtolnay/rust-toolchain@master 127 with: 128 toolchain: ${{ matrix.rust_version }} 129 components: llvm-tools-preview 130 131 - name: Cache Rust dependencies 132 uses: Swatinem/rust-cache@v2 133 134 - name: Dry-run of crate publish 135 run: cargo publish -p c2pa --dry-run 136 137 clippy_check: 138 name: Clippy 139 runs-on: ubuntu-latest 140 steps: 141 - name: Checkout repository 142 uses: actions/checkout@v3 143 144 - name: Install Rust toolchain 145 uses: dtolnay/rust-toolchain@stable 146 147 - name: Install clippy 148 run: rustup component add clippy 149 150 - name: Cache Rust dependencies 151 uses: Swatinem/rust-cache@v2 152 153 - name: Cargo clippy 154 uses: actions-rs/clippy-check@v1 155 with: 156 token: ${{ secrets.GITHUB_TOKEN }} 157 args: --all-features --all-targets -- -D warnings 158 env: 159 RUST_BACKTRACE: "1" 160 161 cargo_fmt: 162 name: Enforce Rust code format 163 runs-on: ubuntu-latest 164 steps: 165 - name: Checkout repository 166 uses: actions/checkout@v3 167 168 - name: Install stable toolchain 169 uses: dtolnay/rust-toolchain@nightly 170 with: 171 components: rustfmt 172 173 - name: Check format 174 run: cargo +nightly fmt --all -- --check 175 176 docs_rs: 177 name: Preflight docs.rs build 178 runs-on: ubuntu-latest 179 steps: 180 - name: Checkout repository 181 uses: actions/checkout@v3 182 183 - name: Install nightly Rust toolchain 184 # Nightly is used here because the docs.rs build 185 # uses nightly and we use doc_cfg features that are 186 # not in stable Rust as of this writing (Rust 1.62). 187 uses: dtolnay/rust-toolchain@nightly 188 189 - name: Run cargo docs 190 # This is intended to mimic the docs.rs build 191 # environment. The goal is to fail PR validation 192 # if the subsequent release would result in a failed 193 # documentation build on docs.rs. 194 run: cargo +nightly doc --all-features --no-deps 195 env: 196 RUSTDOCFLAGS: --cfg docsrs 197 DOCS_RS: 1 198 199 cargo-deny: 200 name: License / vulnerability audit 201 runs-on: ubuntu-latest 202 203 strategy: 204 fail-fast: false 205 matrix: 206 checks: 207 - advisories 208 - bans licenses sources 209 210 # Prevent sudden announcement of a new advisory from failing CI: 211 continue-on-error: ${{ matrix.checks == 'advisories' }} 212 213 steps: 214 - name: Checkout repository 215 uses: actions/checkout@v3 216 217 - name: Audit crate dependencies 218 uses: EmbarkStudios/cargo-deny-action@v1 219 with: 220 command: check ${{ matrix.checks }} 221 222 unused_deps: 223 name: Check for unused dependencies 224 runs-on: ubuntu-latest 225 steps: 226 - name: Checkout repository 227 uses: actions/checkout@v3 228 229 - name: Install Rust toolchain 230 uses: dtolnay/rust-toolchain@nightly 231 232 - name: Run cargo-udeps 233 uses: aig787/cargo-udeps-action@v1 234 with: 235 version: latest 236 args: --all-targets --all-features 237 238 version_bump: 239 name: Ensure (MINOR) tag is used when making an API breaking change 240 # Change all of these steps to (MAJOR) after 1.0 release 241 runs-on: ubuntu-latest 242 steps: 243 - name: Checkout repository 244 uses: actions/checkout@v3 245 with: 246 fetch-depth: 0 247 248 - name: Install Rust toolchain 249 uses: dtolnay/rust-toolchain@stable 250 251 - name: Get latest existing tag 252 uses: WyriHaximus/github-action-get-previous-tag@v1 253 id: get-latest-tag 254 255 - name: Set new version 256 uses: paulhatch/semantic-version@v5.2.1 257 id: set-version 258 with: 259 tag_prefix: "v" 260 version_format: "${major}.${minor}.${patch}" 261 major_pattern: "(MAJOR)" 262 minor_pattern: "(MINOR)" 263 264 - name: Generate changelog since last tag 265 run: | 266 { 267 echo 'changelog<<EOF' 268 git log --format="* %s" ${{ steps.get-latest-tag.outputs.tag }}..HEAD | { grep -v "(IGNORE)" || :; } 269 echo EOF 270 } >> "$GITHUB_OUTPUT" 271 272 - name: "Bump crate version (NOTE: Not pushed back to repo!)" 273 continue-on-error: true # If no change to crate version, ignore git commit error 274 run: | 275 sed -i "s/^version = \"[^\"]*\"$/version = \"$VERSION\"/;" sdk/Cargo.toml 276 git config user.email "nobody@example.com" 277 git config --global user.name "PR validation bot" 278 git add . 279 git commit -m "DO NOT PUSH BACK TO PR: Bump crate version" 280 env: 281 VERSION: ${{ steps.set-version.outputs.version }} 282 283 - name: If this step fails, change title of the PR to include (MINOR) tag 284 uses: obi1kenobi/cargo-semver-checks-action@v2 285 with: 286 package: c2pa