• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1version: '2.1'
2
3workflows:
4  version: 2
5  build:
6    jobs:
7      - build:
8          matrix:
9            parameters:
10              rust_img: [
11                # Yes, a single-parameter axis, but means it can be referred to as a cache parameter easily without
12                # duplicating the magic version number throughout this file.
13                # The default rust images (not -slim or -alpine) are based on buildpack-deps. Hopefully this will
14                # be easier on the CI hosts since presumably those fat lower layers will already be cached, and
15                # therefore faster than a minimal, customized alpine.
16                # MSRV
17                'rust:1.48.0'
18              ]
19              # a hacky scheme to work around CircleCI's inability to deal with mutable docker tags, forcing us to
20              # get a nightly or stable toolchain via rustup instead of a mutable docker tag
21              toolchain_override: [
22                '__msrv__', # won't add any other toolchains, just uses what's in the docker image
23                '1.70.0', # minimum needed to build dev-dependencies
24                'stable',
25                'beta',
26                'nightly'
27              ]
28
29jobs:
30  build:
31    parameters:
32      rust_img:
33        type: string
34      toolchain_override:
35        type: string
36    docker:
37      - image: << parameters.rust_img >>
38    steps:
39      - checkout
40      - restore_cache:
41          key: project-cache-v5-<< parameters.rust_img >>-<< parameters.toolchain_override >>-{{ checksum "Cargo.toml" }}
42      - run:
43          name: Setup toolchain
44          command: |
45            if [[ '<< parameters.toolchain_override >>' != '__msrv__' ]]
46            then
47              rustup toolchain add '<< parameters.toolchain_override >>'
48              rustup default '<< parameters.toolchain_override >>'
49            fi
50      - run:
51          name: Log rustc version
52          command: rustc --version
53      - run:
54          name: Build main target
55          # update first to select dependencies appropriate for this toolchain
56          command: |
57            cargo update
58            cargo build
59      - run:
60          name: Check formatting
61          command: |
62            rustup component add rustfmt
63            cargo fmt -- --check
64      - run:
65          name: Check clippy lints
66          # we only care about stable clippy -- nightly clippy is a bit wild
67          command: |
68            if [[ '<< parameters.toolchain_override >>' == 'stable' ]]
69            then
70              rustup component add clippy
71              cargo clippy --all-targets
72            fi
73      - run:
74          name: Build all targets
75          command: |
76            if [[ '<< parameters.toolchain_override >>' != '__msrv__' ]]
77            then
78              cargo build --all-targets
79            fi
80      - run:
81          name: Build without default features
82          command: |
83            cargo build --no-default-features
84            if [[ '<< parameters.toolchain_override >>' != '__msrv__' ]]
85            then
86              cargo build --no-default-features --all-targets
87            fi
88      - run:
89          name: Build with only alloc
90          command: |
91            cargo build --no-default-features --features alloc
92            if [[ '<< parameters.toolchain_override >>' != '__msrv__' ]]
93            then
94              cargo build --no-default-features --features alloc --all-targets
95            fi
96      - run:
97          name: Add arm toolchain
98          command: rustup target add thumbv6m-none-eabi
99      - run:
100          name: Build ARM without default features (no_std)
101          command: cargo build --target thumbv6m-none-eabi --no-default-features
102      - run:
103          name: Build ARM with only alloc feature
104          command: cargo build --target thumbv6m-none-eabi --no-default-features --features alloc
105      - run:
106          # dev dependencies can't build on 1.48.0
107          name: Run tests
108          command: |
109            if [[ '<< parameters.toolchain_override >>' != '__msrv__' ]]
110            then
111              cargo test --no-default-features
112              cargo test
113            fi
114      - run:
115          name: Build docs
116          command: cargo doc --verbose
117      - run:
118          name: Confirm fuzzers can run
119          # TERM=dumb prevents cargo fuzz list from printing with color
120          environment:
121            TERM: dumb
122          command: |
123            if [[ '<< parameters.toolchain_override >>' = 'nightly' ]]
124            then
125              cargo install cargo-fuzz
126              cargo fuzz list | xargs -I FUZZER cargo fuzz run FUZZER -- -max_total_time=1
127            fi
128
129      - save_cache:
130          key: project-cache-v5-<< parameters.rust_img >>-<< parameters.toolchain_override >>-{{ checksum "Cargo.toml" }}
131          paths:
132            # rust docker img doesn't use $HOME/[.cargo,.rustup]
133            - /usr/local/cargo
134            - /usr/local/rustup
135            - ./target
136