Unverified Commit 57b0925b authored by Wael Nasreddine's avatar Wael Nasreddine Committed by GitHub
Browse files

ncps: v0.5.2 -> v0.6.0 (#477912)

parents c25638b3 55ee39e4
Loading
Loading
Loading
Loading
+21 −93
Original line number Diff line number Diff line
@@ -3,117 +3,35 @@
  curl,
  dbmate,
  fetchFromGitHub,
  jq,
  lib,
  mariadb,
  minio,
  minio-client,
  postgresql,
  python3,
  redis,
}:

let

  # Start MinIO before running tests to enable S3 integration tests
  minioPreCheck = ''
    echo "🚀 Starting MinIO for S3 integration tests..."

    # Create temporary directories for MinIO data and config
    export MINIO_DATA_DIR=$(mktemp -d)
    export HOME=$(mktemp -d)

    # Configure MinIO credentials (must be set before starting MinIO)
    export MINIO_ROOT_USER=admin
    export MINIO_ROOT_PASSWORD=password
    export MINIO_REGION=us-east-1

    # Generate random free ports using python
    # We bind to port 0, get the assigned port, and close the socket immediately.
    # In a Nix sandbox, the race condition risk (port being stolen between check and use) is negligible.
    export MINIO_PORT=$(python3 -c 'import socket; s=socket.socket(); s.bind(("", 0)); print(s.getsockname()[1]); s.close()')
    export CONSOLE_PORT=$(python3 -c 'import socket; s=socket.socket(); s.bind(("", 0)); print(s.getsockname()[1]); s.close()')

    # Export S3 test environment variables
    export NCPS_TEST_S3_BUCKET="test-bucket"
    export NCPS_TEST_S3_ENDPOINT="http://127.0.0.1:$MINIO_PORT"
    export NCPS_TEST_S3_REGION="us-east-1"
    export NCPS_TEST_S3_ACCESS_KEY_ID="test-access-key"
    export NCPS_TEST_S3_SECRET_ACCESS_KEY="test-secret-key"

    # Start MinIO server in background
    minio server "$MINIO_DATA_DIR" \
      --address "127.0.0.1:$MINIO_PORT" \
      --console-address "127.0.0.1:$CONSOLE_PORT" &
    export MINIO_PID=$!

    # Wait for MinIO to be ready
    echo "⏳ Waiting for MinIO to be ready..."
    for i in {1..30}; do
      if curl -sf "$NCPS_TEST_S3_ENDPOINT/minio/health/live"; then
        echo "✅ MinIO is ready"
        break
      fi
      if [ $i -eq 30 ]; then
        echo "❌ MinIO failed to start"
        kill $MINIO_PID 2>/dev/null || true
        exit 1
      fi
      sleep 1
    done

    # Setup admin alias
    mc alias set local "$NCPS_TEST_S3_ENDPOINT" "$MINIO_ROOT_USER" "$MINIO_ROOT_PASSWORD"

    # Create test bucket
    mc mb "local/$NCPS_TEST_S3_BUCKET" || true

    # Create service account for tests
    mc admin user svcacct add \
      --access-key "$NCPS_TEST_S3_ACCESS_KEY_ID" \
      --secret-key "$NCPS_TEST_S3_SECRET_ACCESS_KEY" \
      local admin || true

    echo "✅ MinIO configured for S3 integration tests"
  '';

  # Stop MinIO after tests complete
  minioPostCheck = ''
    echo "🛑 Stopping MinIO..."
    if [ -n "$MINIO_PID" ]; then
      kill $MINIO_PID 2>/dev/null || true
      # Wait for MinIO to fully shut down
      for i in {1..30}; do
        if ! kill -0 $MINIO_PID 2>/dev/null; then
          break
        fi
        sleep 0.5
      done

      # If it's still alive, force kill it
      if kill -0 $MINIO_PID 2>/dev/null; then
        echo "MinIO did not shut down gracefully, force killing..."
        kill -9 $MINIO_PID 2>/dev/null || true
        sleep 1 # Give a moment for the OS to clean up after SIGKILL
      fi
    fi
    sleep 1
    rm -rf "$MINIO_DATA_DIR" 2>/dev/null || true
    echo "✅ MinIO stopped and cleaned up"
  '';

  finalAttrs = {
    pname = "ncps";
    version = "0.5.2";
    version = "0.6.0";

    src = fetchFromGitHub {
      owner = "kalbasit";
      repo = "ncps";
      tag = "v${finalAttrs.version}";
      hash = "sha256-uGghoADkD2eJYZwt8QSiVzw68dRDLI+OxMa1VAQhBKQ=";
      hash = "sha256-/Fa8cpBACbbB74W1HSQmsS06BLofnH094be6I2peX0U=";
    };

    ldflags = [
      "-X github.com/kalbasit/ncps/cmd.Version=v${finalAttrs.version}"
    ];

    vendorHash = "sha256-3YPKlz7+x7nYCqKmOroaiUyZGKIQMGFxcNyPnrA9Tio=";
    vendorHash = "sha256-GuUhJ0Zf2Zjfgstxcy6/DAs0Eq7PU4aiiJMSNcNqsqI=";

    subPackages = [ "." ];

    doCheck = true;
    checkFlags = [ "-race" ];
@@ -121,20 +39,30 @@ let
    nativeBuildInputs = [
      curl # used for checking MinIO health check
      dbmate # used for testing
      jq # used for testing by the init-minio
      mariadb # MySQL/MariaDB for integration tests
      minio # S3-compatible storage for integration tests
      minio-client # mc CLI for MinIO setup
      postgresql # PostgreSQL for integration tests
      python3 # used for generating the ports
      redis # Redis for distributed locking integration tests
    ];

    # pre and post checks
    preCheck = ''
      # Set up cleanup trap to ensure background processes are killed even if tests fail
      cleanup() {
        ${minioPostCheck}
        source $src/nix/packages/ncps/post-check-minio.sh
        source $src/nix/packages/ncps/post-check-mysql.sh
        source $src/nix/packages/ncps/post-check-postgres.sh
        source $src/nix/packages/ncps/post-check-redis.sh
      }
      trap cleanup EXIT

      ${minioPreCheck}
      source $src/nix/packages/ncps/pre-check-minio.sh
      source $src/nix/packages/ncps/pre-check-mysql.sh
      source $src/nix/packages/ncps/pre-check-postgres.sh
      source $src/nix/packages/ncps/pre-check-redis.sh
    '';

    postInstall = ''