summaryrefslogtreecommitdiffstats
path: root/.github/workflows/workflow.yml
blob: 72ac94f95f2b0fe50c38728402ebd1f2939ec986 (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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
name: Main workflow
on:
  push:
    paths-ignore:
      - "docs/**"
      - "**.md"
  pull_request:
    paths-ignore:
      - "docs/**"
      - "**.md"

env:
  CARGO_INCREMENTAL: 0
  CARGO_NET_RETRY: 10
  RUST_BACKTRACE: short
  RUSTFLAGS: "-D warnings"
  RUSTUP_MAX_RETRIES: 10
  MACOSX_DEPLOYMENT_TARGET: 10.7

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

      - name: Setup | Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          components: rustfmt

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

  # Run the `clippy` linting tool
  clippy:
    name: Clippy [Linter]
    strategy:
      matrix:
        os: [ubuntu-latest, macOS-latest, windows-latest]
    runs-on: ${{ matrix.os }}
    steps:
      - name: Setup | Checkout
        uses: actions/checkout@v4

      - name: Setup | Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          components: clippy

      - name: Setup | Cache
        uses: Swatinem/rust-cache@v2

      - name: Build | Lint
        uses: giraffate/clippy-action@94e9bd8deab2618756ec5380f12eb35bcb0a88ca

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

      - name: Setup | Rust
        uses: dtolnay/rust-toolchain@stable

      - name: Setup | Cache
        uses: Swatinem/rust-cache@v2

      - name: Build | Check
        run: cargo check --workspace --locked

  # Ensure that the project could be successfully compiled with no features enabled
  cargo_check_no_features:
    name: Compile with no features enabled
    needs: cargo_check
    runs-on: ubuntu-latest
    steps:
      - name: Setup | Checkout
        uses: actions/checkout@v4

      - name: Setup | Rust
        uses: dtolnay/rust-toolchain@stable

      - name: Setup | Cache
        uses: Swatinem/rust-cache@v2

      - name: Build | Check
        run: cargo check --workspace --locked --no-default-features

  # Ensure that the project could be successfully compiled with all features enabled
  cargo_check_all_features:
    name: Compile with all features enabled
    needs: cargo_check
    runs-on: ubuntu-latest
    steps:
      - name: Setup | Checkout
        uses: actions/checkout@v4

      - name: Setup | Rust
        uses: dtolnay/rust-toolchain@stable

      - name: Setup | Cache
        uses: Swatinem/rust-cache@v2

      - name: Build | Check
        run: cargo check --workspace --locked --all-features

  # Check if config schema needs to be updated to reflect updated configuration options
  check_if_config_schema_up_to_date:
    name: Check if config schema is up to date
    needs: cargo_check
    runs-on: ubuntu-latest
    permissions:
      checks: write
      contents: read
      pull-requests: write
    steps:
      - name: Setup | Checkout
        uses: actions/checkout@v4

      - name: Setup | Rust
        uses: dtolnay/rust-toolchain@stable

      - name: Setup | Cache
        uses: Swatinem/rust-cache@v2

      - name: Run | Generate Schema
        run: cargo run --locked --features config-schema -- config-schema > .github/config-schema.json

      - name: Check | Detect Changes
        uses: reviewdog/action-suggester@v1.9.0
        with:
          tool_name: starship config-schema
          filter_mode: nofilter
          fail_on_error: 'true'

  # 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]
        include:
          - os: windows-latest
            rustflags: -C target-feature=+crt-static
    env:
      RUSTFLAGS: ${{ matrix.rustflags || '' }}
    steps:
      - name: Setup | Checkout
        uses: actions/checkout@v4

      # Install all the required dependencies for testing
      - name: Setup | Rust
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ matrix.rust }}
          components: llvm-tools-preview

      - name: Setup | Cache
        uses: Swatinem/rust-cache@v2

      - name: Install cargo-llvm-cov
        uses: taiki-e/install-action@cargo-llvm-cov

      # For windows installer test
      # On stable rust & main repo pushes only
      - name: Install cargo-wix [Windows]
        continue-on-error: true
        if: matrix.os == 'windows-latest' && matrix.rust == 'stable'
        run: cargo install --version 0.3.4 cargo-wix
        env:
          # cargo-wix does not require static crt
          RUSTFLAGS: ""

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

      # Run the ignored tests that expect the above setup
      - name: Build | Test
        run: "cargo llvm-cov
          --all-features
          --locked
          --workspace
          --lcov --output-path lcov.info
          -- --include-ignored"
        env:
          # Avoid -D warnings on nightly builds
          RUSTFLAGS: ""

      - name: Build | Installer [Windows]
        continue-on-error: true
        if: matrix.os == 'windows-latest' && matrix.rust == 'stable'
        run: cargo wix --dbg-build -v --nocapture -I install/windows/main.wxs

      - name: Build | Chocolatey Package [Windows]
        continue-on-error: true
        if: matrix.os == 'windows-latest' && matrix.rust == 'stable'
        run: |
          # Setup dummy release artifacts
          foreach ($arch in @("aarch64", "i686", "x86_64")) {
            foreach ($ext in @("zip", "msi")) {
              New-Item -ItemType Directory -Path ./starship-$arch-pc-windows-msvc.$ext
              New-Item -ItemType File -Path ./starship-$arch-pc-windows-msvc.$ext/starship-$arch-pc-windows-msvc.$ext
            }
          }
          # Build package
          pwsh ./install/windows/choco/update.ps1
        env:
          STARSHIP_VERSION: v1.2.3

      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v3
        if: github.repository == 'starship/starship'
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          files: lcov.info