summaryrefslogtreecommitdiffstats
path: root/.github/workflows/workflow.yml
blob: 61798cef769f5e3bb6c7a1cb832586313e189685 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
name: Main workflow
on:
  push:
    paths-ignore:
      - "docs/**"
      - "**.md"
  pull_request:
    paths-ignore:
      - "docs/**"
      - "**.md"

jobs:
  # Run the `rustfmt` code formatter
  rustfmt:
    name: Rustfmt [Formatter]
    runs-on: ubuntu-latest
    steps:
      - name: Setup | Checkout
        uses: actions/checkout@v2

      - name: Setup | Rust
        uses: ATiltedTree/setup-rust@v1
        with:
          rust-version: stable
          components: rustfmt

      - name: Build | Format
        run: cargo fmt --all -- --check

  # Run the `clippy` linting tool
  clippy:
    name: Clippy [Linter]
    runs-on: ubuntu-latest
    steps:
      - name: Setup | Checkout
        uses: actions/checkout@v2

      # Cache files between builds
      - name: Setup | Cache Cargo
        uses: actions/cache@v2
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}

      - name: Setup | Rust
        uses: ATiltedTree/setup-rust@v1
        with:
          rust-version: stable
          components: clippy

      - name: Build | Lint
        run: cargo clippy --all-targets --all-features -- -D clippy::all

  # Ensure that the project could be successfully compiled
  cargo_check:
    name: Compile
    runs-on: ubuntu-latest
    steps:
      - name: Setup | Checkout
        uses: actions/checkout@v2

      # Cache files between builds
      - name: Setup | Cache Cargo
        uses: actions/cache@v2
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}

      - name: Setup | Rust
        uses: ATiltedTree/setup-rust@v1
        with:
          rust-version: stable

      - name: Build | Check
        run: cargo check --all

  # Run tests on Linux, macOS, and Windows
  # On both Rust stable and Rust nightly
  test:
    name: Test Suite
    runs-on: ${{ matrix.os }}
    needs: cargo_check # First check then run expansive tests
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, macOS-latest, windows-latest]
        rust: [stable, nightly]
    steps:
      - name: Setup | Checkout
        uses: actions/checkout@v2

      - name: Setup | Cache Cargo
        uses: actions/cache@v2
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: ${{ runner.os }}-${{ matrix.rust }}-cargo-${{ hashFiles('**/Cargo.lock') }}

      # Install all the required dependencies for testing
      - name: Setup | Rust
        uses: ATiltedTree/setup-rust@v1
        with:
          rust-version: ${{ matrix.rust }}

      # Install dotnet at a fixed version
      - name: Setup | DotNet
        uses: actions/setup-dotnet@v1
        with:
          dotnet-version: "2.2.402"

      # Install Mercurial (pre-installed on Linux and windows)
      - name: Setup | Mercurial (macos)
        if: matrix.os == 'macOS-latest'
        run: pip3 install mercurial

      # Install Terraform at a fixed version
      - name: Setup | Terraform
        uses: volcano-coffee-company/setup-terraform@v1
        with:
          version: "0.12.14"

      # Run the ignored tests that expect the above setup
      - name: Build | Test
        run: cargo test -- -Z unstable-options --include-ignored