version: 2.1 aliases: - &plume-docker image: plumeorg/plume-buildenv:v0.0.5 - &defaults docker: - *plume-docker working_directory: ~/projects/Plume - &postgresql docker: - *plume-docker - image: circleci/postgres:9.6-alpine environment: POSTGRES_USER: postgres POSTGRES_DB: plume working_directory: ~/projects/Plume - &selenium docker: - *plume-docker - image: elgalu/selenium:latest working_directory: ~/projects/Plume - &postgresql_selenium docker: - *plume-docker - image: circleci/postgres:9.6-alpine environment: POSTGRES_USER: postgres POSTGRES_DB: plume - image: elgalu/selenium:latest working_directory: ~/projects/Plume - &attach_workspace attach_workspace: at: ~/projects/Plume/ - &persist_to_workspace persist_to_workspace: root: ~/projects/Plume/ paths: - ./ - &env_postgresql environment: MIGRATION_DIRECTORY: migrations/postgres FEATURES: postgres DATABASE_URL: postgres://postgres@localhost/plume RUST_TEST_THREADS: 1 - &env_sqlite environment: MIGRATION_DIRECTORY: migrations/sqlite FEATURES: sqlite DATABASE_URL: plume.sqlite3 RUST_TEST_THREADS: 1 - &restore_cache restore_cache: keys: - v1-plume-notest-{{ checksum "Cargo.lock" }} - v1-plume-notest - &save_cache save_cache: key: v1-plume-notest-{{ checksum "Cargo.lock" }} paths: - ~/.cargo/ - ./target - &restore_cache_web restore_cache: keys: - v1-plume-web-{{ checksum "Cargo.lock" }} - v1-plume-web - &save_cache_web save_cache: key: v1-plume-web-{{ checksum "Cargo.lock" }} paths: - ~/.cargo/ - ./target - &restore_cache_cli restore_cache: keys: - v1-plume-notest-{{ checksum "Cargo.lock" }}-{{ checksum "/FEATURES" }}-cli - v1-plume-notest-{{ checksum "Cargo.lock" }}-{{ checksum "/FEATURES" }} - v1-plume-notest-{{ checksum "Cargo.lock" }} - v1-plume-notest - &save_cache_cli save_cache: key: v1-plume-notest-{{ checksum "Cargo.lock" }}-{{ checksum "/FEATURES" }}-cli paths: - ~/.cargo/ - target - &restore_cache_release restore_cache: keys: - v1-plume-release-{{ checksum "Cargo.lock" }} - v1-plume-release - v1-plume-notest-{{ checksum "Cargo.lock" }} - v1-plume-notest - &save_cache_release save_cache: key: v1-plume-release-{{ checksum "Cargo.lock" }} paths: - ~/.cargo - target/release - target/wasm32-unknown-unknown/release - &restore_cache_plume_dead_code restore_cache: keys: - v1-plume-test-{{ checksum "/FEATURES" }}-{{ checksum "Cargo.lock" }}-plume - v1-plume-test-{{ checksum "/FEATURES" }}-{{ checksum "Cargo.lock" }} - v1-plume-test-{{ checksum "/FEATURES" }} - v1-plume-notest-{{ checksum "Cargo.lock" }}-{{ checksum "/FEATURES" }} - v1-plume-notest-{{ checksum "Cargo.lock" }} - v1-plume-notest - &save_cache_plume_dead_code save_cache: key: v1-plume-test-{{ checksum "/FEATURES" }}-{{ checksum "Cargo.lock" }}-plume paths: - ~/.cargo/ - target - &test_cli steps: - *attach_workspace - run: name: Set cache key command: echo "$FEATURES" > /FEATURES - *restore_cache_cli - run: name: clippy command: cargo clippy --no-default-features --features="${FEATURES}" --release -p plume-cli -- -D warnings - *save_cache_cli - &test_unit steps: - *attach_workspace - run: name: Set cache key command: echo "$FEATURES" > /FEATURES - *restore_cache_plume_dead_code - run: name: clippy command: cargo clippy --no-default-features --features="${FEATURES}" --release -- -D warnings - run: name: compile test command: cargo test --no-default-features --features="${FEATURES}" --all --exclude plume-front --no-run || cargo test --no-default-features --features="${FEATURES}" --all --exclude plume-front --no-run - run: name: run test command: ./script/run_unit_test.sh - run: name: upload coverage command: ./script/upload_coverage.sh unit - *save_cache_plume_dead_code - &test_browser steps: - *attach_workspace - run: name: Set cache key command: echo "$FEATURES" > /FEATURES - *restore_cache_plume_dead_code - run: name: install server command: cargo install --debug --no-default-features --features="${FEATURES}",test --path . -f || cargo install --debug --no-default-features --features="${FEATURES}",test --path . -f - run: name: install plm command: cargo install --debug --no-default-features --features="${FEATURES}" --path plume-cli -f || cargo install --debug --no-default-features --features="${FEATURES}" --path plume-cli -f - run: name: run test command: ./script/run_browser_test.sh environment: BROWSER: firefox - run: name: upload coverage command: ./script/upload_coverage.sh integration - *save_cache_plume_dead_code - &release steps: - *attach_workspace - *restore_cache_release - run: name: build frontend command: cargo web deploy -p plume-front --release - run: name: build server command: cargo build --release --no-default-features --features="${FEATURES}" || cargo build --release --no-default-features --features="${FEATURES}" - run: name: build plm command: cargo build --release --no-default-features --features="${FEATURES}" -p plume-cli || cargo build --release --no-default-features --features="${FEATURES}" -p plume-cli - *save_cache_release - run: script/generate_artifact.sh - store_artifacts: path: plume.tar.gz destination: plume.tar.gz jobs: download_deps: <<: *defaults steps: - checkout - *attach_workspace - *restore_cache - run: cargo fetch - *save_cache - *persist_to_workspace cargo_fmt: <<: *defaults steps: - *attach_workspace - run: cargo fmt --all -- --check build_web: <<: *defaults steps: - *attach_workspace - *restore_cache_web - run: cargo clippy -p plume-front -- -D warnings - run: cargo web deploy -p plume-front - *save_cache_web - *persist_to_workspace test_cli_postgresql: <<: *postgresql <<: *env_postgresql <<: *test_cli test_cli_sqlite: <<: *defaults <<: *env_sqlite <<: *test_cli test_unit_postgresql: <<: *postgresql <<: *env_postgresql <<: *test_unit test_unit_sqlite: <<: *defaults <<: *env_sqlite <<: *test_unit test_browser_postgresql: <<: *postgresql_selenium <<: *env_postgresql <<: *test_browser test_browser_sqlite: <<: *selenium <<: *env_sqlite <<: *test_browser all_ok: docker: - image: alpine:3.7 steps: - run: /bin/true release_postgresql: <<: *defaults <<: *env_postgresql <<: *release release_sqlite: <<: *defaults <<: *env_sqlite <<: *release workflows: version: 2 build_and_test: jobs: - download_deps - cargo_fmt: requires: - download_deps - build_web: requires: - download_deps - test_cli_postgresql: requires: - download_deps - test_cli_sqlite: requires: - download_deps - test_unit_postgresql: requires: - download_deps - test_unit_sqlite: requires: - download_deps - test_browser_postgresql: requires: - build_web - test_browser_sqlite: requires: - build_web - all_ok: requires: - cargo_fmt - test_cli_postgresql - test_cli_sqlite - test_unit_postgresql - test_unit_sqlite - test_browser_postgresql - test_browser_sqlite - release_postgresql: requires: - all_ok - release_sqlite: requires: - all_ok