image: registry.gitlab.com/veloren/veloren-docker-ci:latest

variables:
    GIT_STRATEGY: fetch
    GIT_DEPTH: 3
    GIT_CLEAN_FLAGS: -f

stages:
    - optional-builds
    - check-compile
    - post

before_script:
    - source $HOME/.cargo/env
    - df -h /
    - free -h
    - cargo --version
    - export DISABLE_GIT_LFS_CHECK=true
    - export VELOREN_ASSETS="$(pwd)/assets"
    - echo "VELOREN_ASSETS=$VELOREN_ASSETS"
    - rm -r target || echo "target doesnt exist, which is fine"
    - ln -s /dockercache/veloren/target target

# -- optional build

.optional-release: &optional-release
    stage: optional-builds
    tags:
        - veloren-docker
    except:
        - schedules
    when: manual

optional-release:linux:
    <<: *optional-release
    script:
        - cargo build --verbose --release
        - cp target/release/veloren-server-cli $CI_PROJECT_DIR
        - cp target/release/veloren-voxygen $CI_PROJECT_DIR
        - strip --strip-all veloren-server-cli
        - strip --strip-all veloren-voxygen
    artifacts:
        paths:
            - veloren-server-cli
            - veloren-voxygen
            - assets/
            - LICENSE
        expire_in: 1 week

optional-release:windows:
    <<: *optional-release
    script:
        - cargo build --verbose --target=x86_64-pc-windows-gnu --release
        - cp target/x86_64-pc-windows-gnu/release/veloren-server-cli.exe $CI_PROJECT_DIR
        - cp target/x86_64-pc-windows-gnu/release/veloren-voxygen.exe $CI_PROJECT_DIR
    artifacts:
        paths:
            - veloren-server-cli.exe
            - veloren-voxygen.exe
            - assets/
            - LICENSE
        expire_in: 1 week

# --

# -- check

check:
    stage: check-compile
    tags:
        - veloren-docker
    script:
        - RUSTFLAGS="-D warnings" cargo check

code-quality:
    stage: check-compile
    tags:
        - veloren-docker
    script:
        - cargo clippy -- --warn clippy::all
        - cargo fmt --all -- --check

security:
    stage: check-compile
    allow_failure: true
    tags:
        - veloren-docker
    script:
        - cargo audit

# --

# -- post build

unittests:
    stage: post
    when: delayed
    start_in: 5 seconds
    tags:
        - veloren-docker
    script:
        - echo "Workaround, cargo tests fails due some rust files are already deleted, so we just stack cargo test. if its the os error, it wont appear on them all, if its a real error, it will retry and then fail"
        - cargo test || cargo test || cargo test || cargo test

coverage:
    stage: post
    when: delayed
    start_in: 5 seconds
    tags:
        - veloren-docker
    script:
        - cargo tarpaulin -v

benchmarks:
    stage: post
    when: delayed
    start_in: 5 seconds
    tags:
        - veloren-docker
    script:
        - unset DISABLE_GIT_LFS_CHECK
        - cargo bench

linux:
    stage: post
    when: delayed
    start_in: 5 seconds
    only:
        refs:
            - /^r[0-9]+\.[0-9]+\.[0-9]+/
            - /^v[0-9]+\.[0-9]+\.[0-9]+/
            - /^master$/
    tags:
        - veloren-docker
    script:
        - cargo build --release
        - cp -r target/release/veloren-server-cli $CI_PROJECT_DIR
        - cp -r target/release/veloren-voxygen $CI_PROJECT_DIR
        - strip --strip-all veloren-server-cli
        - strip --strip-all veloren-voxygen
    artifacts:
        paths:
            - veloren-server-cli
            - veloren-voxygen
            - assets/
            - LICENSE
        expire_in: 1 week

windows:
    stage: post
    when: delayed
    start_in: 5 seconds
    only:
        refs:
            - /^r[0-9]+\.[0-9]+\.[0-9]+/
            - /^v[0-9]+\.[0-9]+\.[0-9]+/
            - /^master$/
    tags:
        - veloren-docker
    script:
        - cargo build --target=x86_64-pc-windows-gnu --release
        - cp -r target/x86_64-pc-windows-gnu/release/veloren-server-cli.exe $CI_PROJECT_DIR
        - cp -r target/x86_64-pc-windows-gnu/release/veloren-voxygen.exe $CI_PROJECT_DIR
    artifacts:
        paths:
            - veloren-server-cli.exe
            - veloren-voxygen.exe
            - assets/
            - LICENSE
        expire_in: 1 week

# --