How to Set Up Continuous Deployment for Rust Applications

Configure GitHub Actions to automatically test, lint, and build your Rust application on every code change.

Set up continuous deployment by creating a GitHub Actions workflow file at .github/workflows/main.yml that triggers on pushes and pull requests to run tests, linting, and builds using rustup, cargo, and mdbook.

name: CI
on: [push, pull_request]

env:
  MDBOOK_VERSION: 0.5.1

jobs:
  test:
    name: Run tests
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@master
    - name: Update rustup
      run: rustup self update
    - name: Install Rust
      run: |
        rustup set profile minimal
        rustup toolchain install 1.90 -c rust-docs
        rustup default 1.90
    - name: Install mdbook
      run: |
        mkdir bin
        curl -sSL https://github.com/rust-lang/mdBook/releases/download/v${MDBOOK_VERSION}/mdbook-v${MDBOOK_VERSION}-x86_64-unknown-linux-gnu.tar.gz | tar -xz --directory=bin
        echo "$(pwd)/bin" >> "${GITHUB_PATH}"
    - name: Build `trpl` crate
      run: |
        cd packages/trpl
        cargo build
    - name: Run tests
      run: mdbook test --library-path packages/trpl/target/debug/deps
  package_tests:
    name: Run package tests
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@master
    - name: Update rustup
      run: rustup self update
    - name: Install Rust
      run: |
        rustup set profile minimal
        rustup toolchain install 1.90 -c rust-docs
        rustup default 1.90
    - name: Run `tools` package tests
      run: cargo test
    - name: Run `mdbook-trpl` package tests
      working-directory: packages/mdbook-trpl
      run: cargo test
  lint:
    name: Run lints
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@master
    - name: Update rustup
      run: rustup self update
    - name: Install Rust
      run: |
        rustup set profile minimal
        rustup toolchain install nightly -c rust-docs
        rustup override set nightly
    - name: Install mdbook
      run: |
        mkdir bin
        curl -sSL https://github.com/rust-lang/mdBook/releases/download/v${MDBOOK_VERSION}/mdbook-v${MDBOOK_VERSION}-x86_64-unknown-linux-gnu.tar.gz | tar -xz --directory=bin
        echo "$(pwd)/bin" >> "${GITHUB_PATH}"
    - name: Install aspell
      run: sudo apt-get install aspell
    - name: Install shellcheck
      run: sudo apt-get install shellcheck
    - name: Shellcheck
      run: find . -name '*.sh' -print0 | xargs -0 shellcheck
    - name: Spellcheck
      run: bash ci/spellcheck.sh list
    - name: Lint for local file paths
      run: |
        mdbook build
        cargo run --bin lfp src
    - name: Validate references
      run: bash ci/validate.sh
    - name: Check for broken links
      run: |
        curl -sSLo linkcheck.sh https://raw.githubusercontent.com/rust-lang/rust/HEAD/src/tools/linkchecker/linkcheck.sh
        sh linkcheck.sh book