Skip to content

Build-Rust

Build-Rust #513

Workflow file for this run

name: Build-Rust
on:
push:
branches: [ "main", "backend" ]
paths:
- "backend/**"
pull_request:
branches: [ "main", "backend" ]
paths:
- "backend/**"
workflow_dispatch:
env:
CARGO_TERM_COLOR: always
DATABASE_URL: "postgres://postgres:password@postgres/mensa_app"
FLICKR_API_KEY: ${{ secrets.FLICKR_PUBLIC_KEY }}
SMTP_SERVER: ${{ vars.SMTP_SERVER }}
SMTP_PORT: ${{ vars.SMTP_PORT }}
SMTP_USERNAME: ${{ vars.SMTP_USERNAME }}
SMTP_PASSWORD: ${{ secrets.SMTP_PASSWORD }}
ADMIN_EMAIL: ${{ vars.ADMIN_EMAIL }}
GOOGLE_CLIENT_JSON_BASE64: ${{ secrets.GOOGLE_CLIENT_JSON_BASE64 }}
GOOGLE_PROJECT_ID: ${{ vars.GOOGLE_PROJECT_ID }}
jobs:
build_rust:
runs-on: ubuntu-latest
needs: [build, test, coverage]
steps:
- name: Print success
run: |
echo "Building, testing and coverage succeeded!"
build:
runs-on: ubuntu-latest
container: rust:latest
defaults:
run:
working-directory: ./backend
services:
postgres:
image: postgres
env:
POSTGRES_PASSWORD: password
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v4
- run: rustup toolchain install stable --profile minimal
- uses: Swatinem/rust-cache@v2
with:
key: "build"
- name: Check formatting
run: |
rustup component add rustfmt
cargo fmt --check
- name: Setup database
run: |
cargo install sqlx-cli --no-default-features --features native-tls,postgres
cargo sqlx database setup
- name: Check prepared sql query information
run: cargo sqlx prepare --check
- name: Check docs
run: RUSTDOCFLAGS="-D warnings" cargo doc --no-deps
- name: Build
run: cargo build --verbose
- name: Check linter warnings
run: |
rustup component add clippy
cargo clippy --all-targets -- -D warnings
test:
runs-on: ubuntu-latest
container: rust:latest
defaults:
run:
working-directory: ./backend
services:
postgres:
image: postgres
env:
POSTGRES_PASSWORD: password
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v4
- run: rustup toolchain install stable --profile minimal
- uses: Swatinem/rust-cache@v2
with:
key: "test"
- name: Setup database
run: |
cargo install sqlx-cli --no-default-features --features native-tls,postgres
cargo sqlx database setup
- name: Prepare secret file
run: |
echo "$GOOGLE_CLIENT_JSON_BASE64" >> secret.base64
base64 --decode secret.base64 > secret.json
echo "SERVICE_ACCOUNT_JSON=$(realpath secret.json)" >> $GITHUB_ENV
- name: Run tests
run: cargo test --verbose
coverage:
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./backend
container:
image: xd009642/tarpaulin:develop-nightly
options: --security-opt seccomp=unconfined
services:
postgres:
image: postgres
env:
POSTGRES_PASSWORD: password
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v4
- run: rustup toolchain install stable --profile minimal
- uses: Swatinem/rust-cache@v2
with:
key: "coverage"
- name: Setup database
run: |
cargo install sqlx-cli --no-default-features --features native-tls,postgres
cargo sqlx database setup
- name: Prepare secret file
run: |
echo "$GOOGLE_CLIENT_JSON_BASE64" >> secret.base64
base64 --decode secret.base64 > secret.json
echo "SERVICE_ACCOUNT_JSON=$(realpath secret.json)" >> $GITHUB_ENV
- name: Generate code coverage
run: |
cargo tarpaulin --all-targets --skip-clean --workspace --timeout 120 --out xml
- name: Upload to codecov.io
uses: codecov/codecov-action@v4
with:
token: ${{secrets.CODECOV_TOKEN}}
fail_ci_if_error: true