ci: implement tests for rust
This commit is contained in:
		
							parent
							
								
									2955f68562
								
							
						
					
					
						commit
						2bab72a9b7
					
				
					 8 changed files with 83 additions and 238 deletions
				
			
		| 
						 | 
				
			
			@ -1,7 +1,5 @@
 | 
			
		|||
#depends_on:
 | 
			
		||||
#  - build
 | 
			
		||||
#  - test
 | 
			
		||||
#  - lint
 | 
			
		||||
depends_on:
 | 
			
		||||
  - test
 | 
			
		||||
 | 
			
		||||
when:
 | 
			
		||||
  - event: push
 | 
			
		||||
| 
						 | 
				
			
			@ -10,22 +8,21 @@ when:
 | 
			
		|||
 | 
			
		||||
matrix:
 | 
			
		||||
  BUILD_TARGET:
 | 
			
		||||
    - x86_64
 | 
			
		||||
    - aarch64
 | 
			
		||||
    - x86_64-linux
 | 
			
		||||
    - aarch64-linux
 | 
			
		||||
 | 
			
		||||
steps:
 | 
			
		||||
  build:
 | 
			
		||||
    image: nixos/nix:latest
 | 
			
		||||
    image: git.nikos.gg/prymn/images/nix:89bb1c18
 | 
			
		||||
    secrets: [ ATTIC_SECRET ]
 | 
			
		||||
    commands:
 | 
			
		||||
      - export AWS_ACCESS_KEY_ID="$${R2_CACHE_ACCESS_KEY}"
 | 
			
		||||
      - export AWS_SECRET_ACCESS_KEY="$${R2_CACHE_SECRET_KEY}"
 | 
			
		||||
      - echo "experimental-features = nix-command flakes" >> /etc/nix/nix.conf
 | 
			
		||||
      - echo "substituters = s3://prymn-cache?endpoint=75178f9eca227dea51b3db4db2c15a5a.r2.cloudflarestorage.com®ion=auto https://cache.nixos.org/" >> /etc/nix/nix.conf
 | 
			
		||||
      - nix build -L ".#agent.${BUILD_TARGET}"
 | 
			
		||||
      - mkdir -p "dist/${BUILD_TARGET}-unknown-linux-musl"
 | 
			
		||||
      - cp result/bin/prymn_agent "dist/${BUILD_TARGET}-unknown-linux-musl/"
 | 
			
		||||
      - nix copy --to 's3://prymn-cache?endpoint=75178f9eca227dea51b3db4db2c15a5a.r2.cloudflarestorage.com®ion=auto' ".#agent.${BUILD_TARGET}"
 | 
			
		||||
    secrets: [ R2_CACHE_ACCESS_KEY, R2_CACHE_SECRET_KEY ]
 | 
			
		||||
      - attic login local http://172.17.0.1:8080/ "$${ATTIC_SECRET}"
 | 
			
		||||
      - attic use prymn
 | 
			
		||||
      - nix build -L ".#agent-${BUILD_TARGET}"
 | 
			
		||||
      - attic push prymn ./result
 | 
			
		||||
      - mkdir -p "dist/${BUILD_TARGET}"
 | 
			
		||||
      - cp result/bin/prymn_agent "dist/${BUILD_TARGET}/"
 | 
			
		||||
 | 
			
		||||
  release:
 | 
			
		||||
    image: woodpeckerci/plugin-s3
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,65 +0,0 @@
 | 
			
		|||
when:
 | 
			
		||||
  - event: [pull_request, tag]
 | 
			
		||||
  - event: push
 | 
			
		||||
    branch:
 | 
			
		||||
      - ${CI_REPO_DEFAULT_BRANCH}
 | 
			
		||||
 | 
			
		||||
variables:
 | 
			
		||||
  - &rust_image 'git.nikos.gg/prymn/images/rust:33331dfc'
 | 
			
		||||
  - &elixir_image 'git.nikos.gg/prymn/images/elixir:1794cee2'
 | 
			
		||||
  - &cache_settings
 | 
			
		||||
      endpoint: https://75178f9eca227dea51b3db4db2c15a5a.r2.cloudflarestorage.com
 | 
			
		||||
      bucket: prymn-cache
 | 
			
		||||
      region: auto
 | 
			
		||||
      access-key:
 | 
			
		||||
        from_secret: R2_CACHE_ACCESS_KEY
 | 
			
		||||
      secret-key:
 | 
			
		||||
        from_secret: R2_CACHE_SECRET_KEY
 | 
			
		||||
 | 
			
		||||
steps:
 | 
			
		||||
  restore-elixir-cache:
 | 
			
		||||
    image: meltwater/drone-cache
 | 
			
		||||
    pull: true
 | 
			
		||||
    settings:
 | 
			
		||||
      <<: *cache_settings
 | 
			
		||||
      cache_key: '{{ .Commit.Branch }}-{{ checksum "app/mix.lock" }}'
 | 
			
		||||
      restore: true
 | 
			
		||||
      mount:
 | 
			
		||||
        - 'app/deps'
 | 
			
		||||
        - 'app/_build/dev'
 | 
			
		||||
 | 
			
		||||
  rust-build:
 | 
			
		||||
    image: *rust_image
 | 
			
		||||
    group: build
 | 
			
		||||
    secrets: [ R2_CACHE_ACCESS_KEY, R2_CACHE_SECRET_KEY ]
 | 
			
		||||
    commands:
 | 
			
		||||
      - export AWS_ACCESS_KEY_ID="$${R2_CACHE_ACCESS_KEY}"
 | 
			
		||||
      - export AWS_SECRET_ACCESS_KEY="$${R2_CACHE_SECRET_KEY}"
 | 
			
		||||
      - cargo check
 | 
			
		||||
      - ls $CARGO_HOME
 | 
			
		||||
    when:
 | 
			
		||||
      - path:
 | 
			
		||||
        - "**/*.rs"
 | 
			
		||||
        - "Cargo.*"
 | 
			
		||||
 | 
			
		||||
  elixir-build:
 | 
			
		||||
    image: *elixir_image
 | 
			
		||||
    group: build
 | 
			
		||||
    commands:
 | 
			
		||||
      - cd app
 | 
			
		||||
      - mix do deps.get, compile
 | 
			
		||||
    when:
 | 
			
		||||
      - path:
 | 
			
		||||
        - "**/*.{ex,exs}"
 | 
			
		||||
        - "mix.*"
 | 
			
		||||
 | 
			
		||||
  rebuild-elixir-cache:
 | 
			
		||||
    image: meltwater/drone-cache
 | 
			
		||||
    pull: true
 | 
			
		||||
    settings:
 | 
			
		||||
      <<: *cache_settings
 | 
			
		||||
      cache_key: '{{ .Commit.Branch }}-{{ checksum "app/mix.lock" }}'
 | 
			
		||||
      rebuild: true
 | 
			
		||||
      mount:
 | 
			
		||||
        - 'app/deps'
 | 
			
		||||
        - 'app/_build/dev'
 | 
			
		||||
| 
						 | 
				
			
			@ -2,6 +2,8 @@ when:
 | 
			
		|||
  - event: push
 | 
			
		||||
    branch:
 | 
			
		||||
      - ${CI_REPO_DEFAULT_BRANCH}
 | 
			
		||||
    path:
 | 
			
		||||
      - get_prymn.sh
 | 
			
		||||
 | 
			
		||||
steps:
 | 
			
		||||
  release:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,76 +0,0 @@
 | 
			
		|||
depends_on:
 | 
			
		||||
  - build
 | 
			
		||||
  - test
 | 
			
		||||
 | 
			
		||||
when:
 | 
			
		||||
  - event: [pull_request, tag]
 | 
			
		||||
  - event: push
 | 
			
		||||
    branch:
 | 
			
		||||
      - ${CI_REPO_DEFAULT_BRANCH}
 | 
			
		||||
 | 
			
		||||
variables:
 | 
			
		||||
  - &rust_image 'git.nikos.gg/prymn/images/rust:33331dfc'
 | 
			
		||||
  - &elixir_image 'git.nikos.gg/prymn/images/elixir:1794cee2'
 | 
			
		||||
  - &when_elixir
 | 
			
		||||
    - path:
 | 
			
		||||
      - "**/*.{ex,exs}"
 | 
			
		||||
      - "mix.*"
 | 
			
		||||
  - &cache_settings
 | 
			
		||||
      endpoint: https://75178f9eca227dea51b3db4db2c15a5a.r2.cloudflarestorage.com
 | 
			
		||||
      bucket: prymn-cache
 | 
			
		||||
      region: auto
 | 
			
		||||
      access-key:
 | 
			
		||||
        from_secret: R2_CACHE_ACCESS_KEY
 | 
			
		||||
      secret-key:
 | 
			
		||||
        from_secret: R2_CACHE_SECRET_KEY
 | 
			
		||||
 | 
			
		||||
steps:
 | 
			
		||||
  restore-elixir-cache:
 | 
			
		||||
    image: meltwater/drone-cache
 | 
			
		||||
    pull: true
 | 
			
		||||
    settings:
 | 
			
		||||
      <<: *cache_settings
 | 
			
		||||
      cache_key: '{{ .Commit.Branch }}-{{ checksum "app/mix.lock" }}'
 | 
			
		||||
      restore: true
 | 
			
		||||
      mount:
 | 
			
		||||
        - 'app/deps'
 | 
			
		||||
        - 'app/_build/dev'
 | 
			
		||||
 | 
			
		||||
  rust-lint:
 | 
			
		||||
    image: *rust_image
 | 
			
		||||
    group: lint
 | 
			
		||||
    secrets: [ R2_CACHE_ACCESS_KEY, R2_CACHE_SECRET_KEY ]
 | 
			
		||||
    commands:
 | 
			
		||||
      - export AWS_ACCESS_KEY_ID="$${R2_CACHE_ACCESS_KEY}"
 | 
			
		||||
      - export AWS_SECRET_ACCESS_KEY="$${R2_CACHE_SECRET_KEY}"
 | 
			
		||||
      - rustup component add clippy rustfmt
 | 
			
		||||
      - cargo clippy -- -D warnings
 | 
			
		||||
      - cargo fmt --all -- --check
 | 
			
		||||
    when:
 | 
			
		||||
      - path:
 | 
			
		||||
        - "**/*.rs"
 | 
			
		||||
        - "Cargo.*"
 | 
			
		||||
 | 
			
		||||
  elixir-credo:
 | 
			
		||||
    image: *elixir_image
 | 
			
		||||
    group: lint
 | 
			
		||||
    commands:
 | 
			
		||||
      - cd app
 | 
			
		||||
      - mix credo
 | 
			
		||||
    when: *when_elixir
 | 
			
		||||
 | 
			
		||||
  elixir-dialyzer:
 | 
			
		||||
    image: *elixir_image
 | 
			
		||||
    group: lint
 | 
			
		||||
    commands:
 | 
			
		||||
      - cd app
 | 
			
		||||
      - mix dialyzer --format short
 | 
			
		||||
    when: *when_elixir
 | 
			
		||||
 | 
			
		||||
  elixir-format:
 | 
			
		||||
    image: *elixir_image
 | 
			
		||||
    group: lint
 | 
			
		||||
    commands:
 | 
			
		||||
      - cd app
 | 
			
		||||
      - mix format --check-formatted
 | 
			
		||||
    when: *when_elixir
 | 
			
		||||
| 
						 | 
				
			
			@ -1,66 +1,15 @@
 | 
			
		|||
depends_on:
 | 
			
		||||
  - build
 | 
			
		||||
 | 
			
		||||
when:
 | 
			
		||||
  - event: [pull_request, tag]
 | 
			
		||||
  - event: push
 | 
			
		||||
    branch:
 | 
			
		||||
      - ${CI_REPO_DEFAULT_BRANCH}
 | 
			
		||||
 | 
			
		||||
services:
 | 
			
		||||
  database:
 | 
			
		||||
    image: postgres
 | 
			
		||||
    environment:
 | 
			
		||||
      - POSTGRES_DB=postgres
 | 
			
		||||
      - POSTGRES_PASSWORD=postgres
 | 
			
		||||
 | 
			
		||||
variables:
 | 
			
		||||
  - &rust_image 'git.nikos.gg/prymn/images/rust:33331dfc'
 | 
			
		||||
  - &elixir_image 'git.nikos.gg/prymn/images/elixir:1794cee2'
 | 
			
		||||
  - &cache_settings
 | 
			
		||||
      endpoint: https://75178f9eca227dea51b3db4db2c15a5a.r2.cloudflarestorage.com
 | 
			
		||||
      bucket: prymn-cache
 | 
			
		||||
      region: auto
 | 
			
		||||
      access-key:
 | 
			
		||||
        from_secret: R2_CACHE_ACCESS_KEY
 | 
			
		||||
      secret-key:
 | 
			
		||||
        from_secret: R2_CACHE_SECRET_KEY
 | 
			
		||||
 | 
			
		||||
steps:
 | 
			
		||||
  restore-elixir-cache:
 | 
			
		||||
    image: meltwater/drone-cache
 | 
			
		||||
    pull: true
 | 
			
		||||
    settings:
 | 
			
		||||
      <<: *cache_settings
 | 
			
		||||
      cache_key: '{{ .Commit.Branch }}-{{ checksum "app/mix.lock" }}'
 | 
			
		||||
      restore: true
 | 
			
		||||
      mount:
 | 
			
		||||
        - 'app/deps'
 | 
			
		||||
        - 'app/_build/dev'
 | 
			
		||||
 | 
			
		||||
  rust-test:
 | 
			
		||||
    image: *rust_image
 | 
			
		||||
  flake-check:
 | 
			
		||||
    group: test
 | 
			
		||||
    secrets: [ R2_CACHE_ACCESS_KEY, R2_CACHE_SECRET_KEY ]
 | 
			
		||||
    image: git.nikos.gg/prymn/images/nix:89bb1c18
 | 
			
		||||
    secrets: [ ATTIC_SECRET ]
 | 
			
		||||
    commands:
 | 
			
		||||
      - export AWS_ACCESS_KEY_ID="$${R2_CACHE_ACCESS_KEY}"
 | 
			
		||||
      - export AWS_SECRET_ACCESS_KEY="$${R2_CACHE_SECRET_KEY}"
 | 
			
		||||
      - cargo test
 | 
			
		||||
    when:
 | 
			
		||||
      - path:
 | 
			
		||||
        - "**/*.rs"
 | 
			
		||||
        - "Cargo.*"
 | 
			
		||||
 | 
			
		||||
  elixir-test:
 | 
			
		||||
    image: *elixir_image
 | 
			
		||||
    group: test
 | 
			
		||||
    environment:
 | 
			
		||||
      - MIX_ENV=test
 | 
			
		||||
      - PRYMN_TEST_DATABASE_HOST=database
 | 
			
		||||
    commands:
 | 
			
		||||
      - cd app
 | 
			
		||||
      - mix test
 | 
			
		||||
    when:
 | 
			
		||||
      - path:
 | 
			
		||||
        - "**/*.{ex,exs}"
 | 
			
		||||
        - "mix.*"
 | 
			
		||||
      - echo "experimental-features = nix-command flakes" >> /etc/nix/nix.conf # TODO: Move in image
 | 
			
		||||
      - attic login local http://172.17.0.1:8080/ "$${ATTIC_SECRET}"
 | 
			
		||||
      - attic use prymn
 | 
			
		||||
      - nix -L flake check
 | 
			
		||||
      # TODO: nix run jq cache inside image?
 | 
			
		||||
      - attic push prymn $(nix eval .#checks.aarch64-linux --json | nix run nixpkgs#jq -- -r '.|join(" ")')
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -80,7 +80,7 @@ mod tests {
 | 
			
		|||
 | 
			
		||||
    #[tokio::test]
 | 
			
		||||
    async fn exec_works() {
 | 
			
		||||
        let mut rx = exec(&"echo", &["1\n2\n3"]).expect("to spawn command");
 | 
			
		||||
        let mut rx = exec("echo", &["1\n2\n3"]).expect("to spawn command");
 | 
			
		||||
 | 
			
		||||
        let mut outputs = vec![];
 | 
			
		||||
        while let Some(output) = rx.recv().await {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										12
									
								
								flake.nix
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								flake.nix
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -20,10 +20,10 @@
 | 
			
		|||
  outputs = { self, nixpkgs, flake-utils, rust-overlay, crane }:
 | 
			
		||||
    flake-utils.lib.eachDefaultSystem (system:
 | 
			
		||||
      let
 | 
			
		||||
        pkgs = import nixpkgs { inherit system overlays; };
 | 
			
		||||
        overlays = [ (import ./nix/overlay.nix) (import rust-overlay) ];
 | 
			
		||||
        pkgs = import nixpkgs { inherit system overlays; };
 | 
			
		||||
        scripts = pkgs.callPackage ./nix/scripts.nix { };
 | 
			
		||||
        buildRust = buildTarget: pkgs.callPackage ./nix/rust.nix { inherit crane buildTarget; };
 | 
			
		||||
        rustBuilder = import ./nix/rust.nix { inherit crane pkgs system; };
 | 
			
		||||
      in
 | 
			
		||||
      {
 | 
			
		||||
        devShells.default = with pkgs; mkShell {
 | 
			
		||||
| 
						 | 
				
			
			@ -41,7 +41,11 @@
 | 
			
		|||
          '';
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        packages.agent.x86_64 = buildRust "x86_64-unknown-linux-musl";
 | 
			
		||||
        packages.agent.aarch64 = buildRust "aarch64-unknown-linux-musl";
 | 
			
		||||
        checks.rustTest = rustBuilder.test;
 | 
			
		||||
        checks.rustClippy = rustBuilder.clippy;
 | 
			
		||||
        checks.rustFormat = rustBuilder.format;
 | 
			
		||||
 | 
			
		||||
        packages.agent-x86_64-linux = rustBuilder.package "x86_64-linux";
 | 
			
		||||
        packages.agent-aarch64-linux = rustBuilder.package "aarch64-linux";
 | 
			
		||||
      });
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										68
									
								
								nix/rust.nix
									
									
									
									
									
								
							
							
						
						
									
										68
									
								
								nix/rust.nix
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -1,25 +1,59 @@
 | 
			
		|||
{ pkgs
 | 
			
		||||
, crane
 | 
			
		||||
, buildTarget ? "x86_64-unknown-linux-musl"
 | 
			
		||||
, system
 | 
			
		||||
}:
 | 
			
		||||
 | 
			
		||||
let
 | 
			
		||||
  craneLib = (crane.mkLib pkgs).overrideToolchain pkgs.rustToolchain;
 | 
			
		||||
  nativeBuildInputs = [ pkgs.protobuf ];
 | 
			
		||||
  src = pkgs.lib.cleanSourceWith {
 | 
			
		||||
    src = craneLib.path ../.;
 | 
			
		||||
    filter = path: type:
 | 
			
		||||
      (craneLib.filterCargoSources path type) ||
 | 
			
		||||
      (builtins.match ".*proto$" path != null);
 | 
			
		||||
  };
 | 
			
		||||
in
 | 
			
		||||
craneLib.buildPackage {
 | 
			
		||||
  inherit src nativeBuildInputs;
 | 
			
		||||
 | 
			
		||||
  pname = "prymn_agent";
 | 
			
		||||
  version = "0.1.0";
 | 
			
		||||
  doCheck = false; # FIXME: Tests need to run on the native architecture
 | 
			
		||||
  strictDeps = true;
 | 
			
		||||
  CARGO_BUILD_RUSTFLAGS = "-C target-feature=+crt-static -C linker=rust-lld";
 | 
			
		||||
  CARGO_BUILD_TARGET = buildTarget;
 | 
			
		||||
  commonArgs = {
 | 
			
		||||
    pname = "prymn_agent-${system}";
 | 
			
		||||
    version = "0.1.0";
 | 
			
		||||
    nativeBuildInputs = [ pkgs.protobuf ];
 | 
			
		||||
 | 
			
		||||
    src = pkgs.lib.cleanSourceWith {
 | 
			
		||||
      src = craneLib.path ../.;
 | 
			
		||||
 | 
			
		||||
      filter = path: type:
 | 
			
		||||
        (craneLib.filterCargoSources path type) ||
 | 
			
		||||
        (builtins.match ".*proto$" path != null);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    CARGO_BUILD_TARGET = targetToTriple system;
 | 
			
		||||
    CARGO_BUILD_RUSTFLAGS = "-C target-feature=+crt-static -C linker=rust-lld";
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  targetToTriple = targetSystem:
 | 
			
		||||
    builtins.replaceStrings
 | 
			
		||||
      [ "x86_64-linux" "aarch64-linux" ]
 | 
			
		||||
      [ "x86_64-unknown-linux-musl" "aarch64-unknown-linux-musl" ]
 | 
			
		||||
      targetSystem;
 | 
			
		||||
 | 
			
		||||
in
 | 
			
		||||
rec {
 | 
			
		||||
  cargoArtifacts = craneLib.buildDepsOnly (commonArgs // {
 | 
			
		||||
    strictDeps = true;
 | 
			
		||||
    doCheck = false; # Tests are run in CI separately
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  test = craneLib.cargoTest (commonArgs // {
 | 
			
		||||
    inherit cargoArtifacts;
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  clippy = craneLib.cargoClippy (commonArgs // {
 | 
			
		||||
    inherit cargoArtifacts;
 | 
			
		||||
 | 
			
		||||
    cargoClippyExtraArgs = "--all-targets -- -D warnings";
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  format = craneLib.cargoFmt commonArgs;
 | 
			
		||||
 | 
			
		||||
  package = targetSystem: craneLib.buildPackage (commonArgs // {
 | 
			
		||||
    inherit cargoArtifacts;
 | 
			
		||||
 | 
			
		||||
    pname = "prymn_agent-${targetSystem}";
 | 
			
		||||
    doCheck = false;
 | 
			
		||||
    CARGO_BUILD_TARGET = targetToTriple targetSystem;
 | 
			
		||||
    CARGO_BUILD_RUSTFLAGS = "-C target-feature=+crt-static -C linker=rust-lld";
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue