Skip to content

Instantly share code, notes, and snippets.

@LukeMathWalker
Last active March 29, 2024 16:15
Show Gist options
  • Star 28 You must be signed in to star a gist
  • Fork 10 You must be signed in to fork a gist
  • Save LukeMathWalker/d98fa8d0fc5394b347adf734ef0e85ec to your computer and use it in GitHub Desktop.
Save LukeMathWalker/d98fa8d0fc5394b347adf734ef0e85ec to your computer and use it in GitHub Desktop.
GitLab CI - Rust setup
image: "rust:latest"
default:
before_script:
- rustc --version
- cargo --version
stages:
- test
test-code:
stage: test
script:
- cargo test
- cargo install cargo-tarpaulin
- cargo tarpaulin --ignore-tests
lint-code:
stage: test
script:
- rustup component add clippy
- cargo clippy -- -D warnings
format-code:
stage: test
script:
- rustup component add rustfmt
- cargo fmt -- --check
audit-code:
stage: test
script:
- cargo install cargo-audit
- cargo audit
@Arevjensen
Copy link

Ran into:

$ cargo test
Compiling zero2prod v0.1.0 (/builds/SniffleEU/zero2prod)
error: linker clang not found = note: No such file or directory (os error 2)
error: could not compile zero2prod due to previous error
Cleaning up project directory and file based variables 00:01
ERROR: Job failed: exit code 1

In the test-code block.
As I've never tried gitlab CI before my workaround is crude, but changing from:

test-code:
  stage: test  
  script:  
    - cargo test
    - cargo install cargo-tarpaulin
    - cargo tarpaulin --ignore-tests

to

test-code:
  stage: test  
  script:  
    - apt update  
    - apt install lld clang -y
    - cargo test
    - cargo install cargo-tarpaulin
    - cargo tarpaulin --ignore-tests

Fixes the issue and runs the block

@Estus-Dev
Copy link

@Arevjensen Gitlab CI runs in a docker container, in this case, rust:latest as specified at the top of the file here. As you've discovered the rust container doesn't include lld or clang by default.

When doing it this way, you're installing these each and every time. I've gone ahead and bundled all the dependencies as of Chapter 1 into a single docker image.

If you'd like you can replace image: "rust-latest" with image: "aestusvitae/rust-ci:latest" and remove the installs (apt, cargo install, rustup component add) from your CI scripts, and CI runs should be noticeably quicker.

You can even build the image yourself if you're so inclined. (or if I fail to keep mine up to date) The Dockerfile is very simple.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment