123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309 |
- # TODO: The when: platform conditionals aren't working currently
- # See https://github.com/woodpecker-ci/woodpecker/issues/1677
- variables:
- - &rust_image "rust:1.77"
- - &install_pnpm "corepack enable pnpm"
- - &slow_check_paths
- - event: pull_request
- path:
- include: [
- # rust source code
- "crates/**",
- "src/**",
- "**/Cargo.toml",
- "Cargo.lock",
- # database migrations
- "migrations/**",
- # typescript tests
- "api_tests/**",
- # config files and scripts used by ci
- ".woodpecker.yml",
- ".rustfmt.toml",
- "scripts/update_config_defaults.sh",
- "diesel.toml",
- ".gitmodules",
- ]
- # Broken for cron jobs currently, see
- # https://github.com/woodpecker-ci/woodpecker/issues/1716
- # clone:
- # git:
- # image: woodpeckerci/plugin-git
- # settings:
- # recursive: true
- # submodule_update_remote: true
- steps:
- prepare_repo:
- image: alpine:3
- commands:
- - apk add git
- - git submodule init
- - git submodule update
- when:
- - event: [pull_request, tag]
- prettier_check:
- image: tmknom/prettier:3.0.0
- commands:
- - prettier -c . '!**/volumes' '!**/dist' '!target' '!**/translations' '!api_tests/pnpm-lock.yaml'
- when:
- - event: pull_request
- toml_fmt:
- image: tamasfe/taplo:0.8.1
- commands:
- - taplo format --check
- when:
- - event: pull_request
- sql_fmt:
- image: backplane/pgformatter
- commands:
- - ./scripts/sql_format_check.sh
- when:
- - event: pull_request
- cargo_fmt:
- image: rustlang/rust:nightly
- environment:
- # store cargo data in repo folder so that it gets cached between steps
- CARGO_HOME: .cargo_home
- commands:
- - rustup component add rustfmt
- - cargo +nightly fmt -- --check
- when:
- - event: pull_request
- cargo_machete:
- image: rustlang/rust:nightly
- commands:
- - wget https://github.com/cargo-bins/cargo-binstall/releases/latest/download/cargo-binstall-x86_64-unknown-linux-musl.tgz
- - tar -xvf cargo-binstall-x86_64-unknown-linux-musl.tgz
- - cp cargo-binstall /usr/local/cargo/bin
- - cargo binstall -y cargo-machete
- - cargo machete
- when:
- - event: pull_request
- ignored_files:
- image: alpine:3
- commands:
- - apk add git
- - IGNORED=$(git ls-files --cached -i --exclude-standard)
- - if [[ "$IGNORED" ]]; then echo "Ignored files present:\n$IGNORED\n"; exit 1; fi
- when:
- - event: pull_request
- # make sure api builds with default features (used by other crates relying on lemmy api)
- check_api_common_default_features:
- image: *rust_image
- environment:
- CARGO_HOME: .cargo_home
- commands:
- - cargo check --package lemmy_api_common
- when: *slow_check_paths
- lemmy_api_common_doesnt_depend_on_diesel:
- image: *rust_image
- environment:
- CARGO_HOME: .cargo_home
- commands:
- - "! cargo tree -p lemmy_api_common --no-default-features -i diesel"
- when: *slow_check_paths
- lemmy_api_common_works_with_wasm:
- image: *rust_image
- environment:
- CARGO_HOME: .cargo_home
- commands:
- - "rustup target add wasm32-unknown-unknown"
- - "cargo check --target wasm32-unknown-unknown -p lemmy_api_common"
- when: *slow_check_paths
- check_defaults_hjson_updated:
- image: *rust_image
- environment:
- CARGO_HOME: .cargo_home
- commands:
- - export LEMMY_CONFIG_LOCATION=./config/config.hjson
- - ./scripts/update_config_defaults.sh config/defaults_current.hjson
- - diff config/defaults.hjson config/defaults_current.hjson
- when: *slow_check_paths
- check_diesel_schema:
- image: willsquire/diesel-cli
- environment:
- CARGO_HOME: .cargo_home
- DATABASE_URL: postgres://lemmy:password@database:5432/lemmy
- commands:
- - diesel migration run
- - diesel print-schema --config-file=diesel.toml > tmp.schema
- - diff tmp.schema crates/db_schema/src/schema.rs
- when: *slow_check_paths
- check_db_perf_tool:
- image: *rust_image
- environment:
- LEMMY_DATABASE_URL: postgres://lemmy:password@database:5432/lemmy
- RUST_BACKTRACE: "1"
- CARGO_HOME: .cargo_home
- commands:
- # same as scripts/db_perf.sh but without creating a new database server
- - export LEMMY_CONFIG_LOCATION=config/config.hjson
- - cargo run --package lemmy_db_perf -- --posts 10 --read-post-pages 1
- when: *slow_check_paths
- cargo_clippy:
- image: *rust_image
- environment:
- CARGO_HOME: .cargo_home
- commands:
- - rustup component add clippy
- - cargo clippy --workspace --tests --all-targets --features console -- -D warnings
- when: *slow_check_paths
- cargo_build:
- image: *rust_image
- environment:
- CARGO_HOME: .cargo_home
- commands:
- - cargo build
- - mv target/debug/lemmy_server target/lemmy_server
- when: *slow_check_paths
- cargo_test:
- image: *rust_image
- environment:
- LEMMY_DATABASE_URL: postgres://lemmy:password@database:5432/lemmy
- RUST_BACKTRACE: "1"
- CARGO_HOME: .cargo_home
- commands:
- - export LEMMY_CONFIG_LOCATION=../../config/config.hjson
- - cargo test --workspace --no-fail-fast
- when: *slow_check_paths
- check_diesel_migration:
- # TODO: use willsquire/diesel-cli image when shared libraries become optional in lemmy_server
- image: *rust_image
- environment:
- LEMMY_DATABASE_URL: postgres://lemmy:password@database:5432/lemmy
- RUST_BACKTRACE: "1"
- CARGO_HOME: .cargo_home
- DATABASE_URL: postgres://lemmy:password@database:5432/lemmy
- PGUSER: lemmy
- PGPASSWORD: password
- PGHOST: database
- PGDATABASE: lemmy
- commands:
- - cargo install diesel_cli
- - export PATH="$CARGO_HOME/bin:$PATH"
- # Run all migrations
- - diesel migration run
- # Dump schema to before.sqldump (PostgreSQL apt repo is used to prevent pg_dump version mismatch error)
- - apt update && apt install -y lsb-release
- - sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
- - wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
- - apt update && apt install -y postgresql-client-16
- - psql -c "DROP SCHEMA IF EXISTS r CASCADE;"
- - pg_dump --no-owner --no-privileges --no-table-access-method --schema-only --no-sync -f before.sqldump
- # Make sure that the newest migration is revertable without the `r` schema
- - diesel migration redo
- # Run schema setup twice, which fails on the 2nd time if `DROP SCHEMA IF EXISTS r CASCADE` drops the wrong things
- - alias lemmy_schema_setup="target/lemmy_server --disable-scheduled-tasks --disable-http-server --disable-activity-sending"
- - lemmy_schema_setup
- - lemmy_schema_setup
- # Make sure that the newest migration is revertable with the `r` schema
- - diesel migration redo
- # Check for changes in the schema, which would be caused by an incorrect migration
- - psql -c "DROP SCHEMA IF EXISTS r CASCADE;"
- - pg_dump --no-owner --no-privileges --no-table-access-method --schema-only --no-sync -f after.sqldump
- - diff before.sqldump after.sqldump
- when: *slow_check_paths
- run_federation_tests:
- image: node:20-bookworm-slim
- environment:
- LEMMY_DATABASE_URL: postgres://lemmy:password@database:5432
- DO_WRITE_HOSTS_FILE: "1"
- commands:
- - *install_pnpm
- - apt update && apt install -y bash curl postgresql-client
- - bash api_tests/prepare-drone-federation-test.sh
- - cd api_tests/
- - pnpm i
- - pnpm api-test
- when: *slow_check_paths
- federation_tests_server_output:
- image: alpine:3
- commands:
- # `|| true` prevents this step from appearing to fail if the server output files don't exist
- - cat target/log/lemmy_*.out || true
- - "# If you can't see all output, then use the download button"
- when:
- - event: pull_request
- status: failure
- publish_release_docker:
- image: woodpeckerci/plugin-docker-buildx
- secrets: [docker_username, docker_password]
- settings:
- repo: dessalines/lemmy
- dockerfile: docker/Dockerfile
- platforms: linux/amd64, linux/arm64
- build_args:
- - RUST_RELEASE_MODE=release
- tag: ${CI_COMMIT_TAG}
- when:
- - event: tag
- nightly_build:
- image: woodpeckerci/plugin-docker-buildx
- secrets: [docker_username, docker_password]
- settings:
- repo: dessalines/lemmy
- dockerfile: docker/Dockerfile
- platforms: linux/amd64,linux/arm64
- build_args:
- - RUST_RELEASE_MODE=release
- tag: dev
- when:
- - event: cron
- # using https://github.com/pksunkara/cargo-workspaces
- publish_to_crates_io:
- image: *rust_image
- commands:
- - cargo install cargo-workspaces
- - cp -r migrations crates/db_schema/
- - cargo workspaces publish --token "$CARGO_API_TOKEN" --from-git --allow-dirty --no-verify --allow-branch "${CI_COMMIT_TAG}" --yes custom "${CI_COMMIT_TAG}"
- secrets: [cargo_api_token]
- when:
- - event: tag
- notify_on_failure:
- image: alpine:3
- commands:
- - apk add curl
- - "curl -d'Lemmy CI build failed: ${CI_PIPELINE_URL}' ntfy.sh/lemmy_drone_ci"
- when:
- - event: [pull_request, tag]
- status: failure
- notify_on_tag_deploy:
- image: alpine:3
- commands:
- - apk add curl
- - "curl -d'lemmy:${CI_COMMIT_TAG} deployed' ntfy.sh/lemmy_drone_ci"
- when:
- - event: tag
- services:
- database:
- image: postgres:16-alpine
- environment:
- POSTGRES_USER: lemmy
- POSTGRES_PASSWORD: password
|