From fc2925f6feec4116d397dd6ac95fb4fb6e3f6ee9 Mon Sep 17 00:00:00 2001 From: Yousaf Nabi Date: Sat, 27 Sep 2025 12:04:49 +0100 Subject: [PATCH 1/9] feat: cli as lib --- pact_mock_server_cli/Cargo.toml | 8 ++++ pact_mock_server_cli/src/bin.rs | 7 +++ pact_mock_server_cli/src/main.rs | 73 ++++++++++++++++++-------------- 3 files changed, 56 insertions(+), 32 deletions(-) create mode 100644 pact_mock_server_cli/src/bin.rs diff --git a/pact_mock_server_cli/Cargo.toml b/pact_mock_server_cli/Cargo.toml index cad65202..bfabf6a4 100644 --- a/pact_mock_server_cli/Cargo.toml +++ b/pact_mock_server_cli/Cargo.toml @@ -56,3 +56,11 @@ expectest = "0.12.0" trycmd = "0.15.7" test-log = "0.2.16" env_logger = "0.11.5" + +# create bin and lib entries +[[bin]] +name = "pact_mock_server_cli" +path = "src/bin.rs" +[lib] +name = "pact_mock_server_cli" +path = "src/main.rs" \ No newline at end of file diff --git a/pact_mock_server_cli/src/bin.rs b/pact_mock_server_cli/src/bin.rs new file mode 100644 index 00000000..9078b12e --- /dev/null +++ b/pact_mock_server_cli/src/bin.rs @@ -0,0 +1,7 @@ +#[tokio::main] +async fn main() { + match pact_mock_server_cli::handle_command_args().await { + Ok(_) => (), + Err(err) => std::process::exit(err) + } +} diff --git a/pact_mock_server_cli/src/main.rs b/pact_mock_server_cli/src/main.rs index 92b5b93a..59557e19 100644 --- a/pact_mock_server_cli/src/main.rs +++ b/pact_mock_server_cli/src/main.rs @@ -7,10 +7,12 @@ use std::env; use std::io; +use std::process::ExitCode; use std::str::FromStr; use std::sync::Mutex; use anyhow::anyhow; +use clap::ArgMatches; use clap::{Arg, ArgAction, command, Command}; use clap::error::ErrorKind; use lazy_static::*; @@ -41,7 +43,7 @@ mod list; mod verify; mod shutdown; -fn print_version() { +pub fn print_version() { println!("pact mock server version : v{}", clap::crate_version!()); println!("pact specification version: v{}", PactSpecification::V4.version_str()); } @@ -95,14 +97,6 @@ fn mock_server_id(v: &str) -> Result { } } -#[tokio::main] -async fn main() { - match handle_command_args().await { - Ok(_) => (), - Err(err) => std::process::exit(err) - } -} - #[derive(Debug, Clone)] pub(crate) struct ServerOpts { pub output_path: Option, @@ -114,13 +108,45 @@ lazy_static!{ pub(crate) static ref SERVER_MANAGER: Mutex = Mutex::new(ServerManager::new()); } -async fn handle_command_args() -> Result<(), i32> { +pub async fn handle_command_args() -> Result<(), i32> { let mut app = setup_args(); - let usage = app.render_usage().to_string(); let matches = app.try_get_matches(); match matches { - Ok(ref matches) => { + Ok(results) => handle_matches(&results).await, + + Err(ref err) => { + match err.kind() { + ErrorKind::DisplayHelp => { + println!("{}", err); + Ok(()) + }, + ErrorKind::DisplayVersion => { + print_version(); + println!(); + Ok(()) + }, + _ => { + err.exit() + } + } + } + } +} + +pub fn process_mock_command(args: &ArgMatches) -> Result<(), ExitCode> { + tokio::runtime::Runtime::new().unwrap().block_on(async { + let res = handle_matches(args).await; + match res { + Ok(()) => Ok(()), + Err(code) => Err(ExitCode::from(code as u8)), + } + }) +} + + + +async fn handle_matches(matches: &ArgMatches) -> Result<(), i32> { let log_level = matches.get_one::("loglevel").map(|lvl| lvl.as_str()); let no_file_log = matches.get_flag("no-file-log"); let no_term_log = matches.get_flag("no-term-log"); @@ -144,6 +170,8 @@ async fn handle_command_args() -> Result<(), i32> { let localhost = "localhost".to_string(); let host = matches.get_one::("host").unwrap_or(&localhost); + let usage = setup_args().render_usage().to_string(); + match matches.subcommand() { Some(("start", sub_matches)) => { let output_path = sub_matches.get_one::("output").map(|s| s.to_owned()); @@ -164,27 +192,8 @@ async fn handle_command_args() -> Result<(), i32> { Some(("shutdown-master", sub_matches)) => shutdown::shutdown_master_server(host, port, sub_matches, usage.as_str()).await, _ => Err(3) } - }, - Err(ref err) => { - match err.kind() { - ErrorKind::DisplayHelp => { - println!("{}", err); - Ok(()) - }, - ErrorKind::DisplayVersion => { - print_version(); - println!(); - Ok(()) - }, - _ => { - err.exit() - } - } - } - } } - -fn setup_args() -> Command { +pub fn setup_args() -> Command { #[allow(unused_mut)] let mut create_command = Command::new("create") .about("Creates a new mock server from a pact file") From 87316f47b71939e25d35768d944a7a0ec3e587a0 Mon Sep 17 00:00:00 2001 From: Yousaf Nabi Date: Wed, 8 Oct 2025 23:59:05 +0100 Subject: [PATCH 2/9] chore: rename main.rs to lib.rs to align with rust conventions --- pact_mock_server_cli/Cargo.toml | 2 +- pact_mock_server_cli/src/{main.rs => lib.rs} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename pact_mock_server_cli/src/{main.rs => lib.rs} (100%) diff --git a/pact_mock_server_cli/Cargo.toml b/pact_mock_server_cli/Cargo.toml index bfabf6a4..662ec8af 100644 --- a/pact_mock_server_cli/Cargo.toml +++ b/pact_mock_server_cli/Cargo.toml @@ -63,4 +63,4 @@ name = "pact_mock_server_cli" path = "src/bin.rs" [lib] name = "pact_mock_server_cli" -path = "src/main.rs" \ No newline at end of file +path = "src/lib.rs" \ No newline at end of file diff --git a/pact_mock_server_cli/src/main.rs b/pact_mock_server_cli/src/lib.rs similarity index 100% rename from pact_mock_server_cli/src/main.rs rename to pact_mock_server_cli/src/lib.rs From 19b1066a547a5609643c2cd8f13e7b9a24b135b7 Mon Sep 17 00:00:00 2001 From: Yousaf Nabi Date: Sat, 18 Oct 2025 01:57:52 +0100 Subject: [PATCH 3/9] feat: allow setting of pact specification version to output on mock server creation --- pact_mock_server_cli/README.md | 21 ++++++++++---------- pact_mock_server_cli/src/create_mock.rs | 11 +++++++--- pact_mock_server_cli/src/lib.rs | 7 ++++++- pact_mock_server_cli/src/server.rs | 17 ++++++++++++++-- pact_mock_server_cli/tests/cmd/create.stdout | 21 ++++++++++---------- 5 files changed, 51 insertions(+), 26 deletions(-) diff --git a/pact_mock_server_cli/README.md b/pact_mock_server_cli/README.md index 11a6041c..198d9f78 100644 --- a/pact_mock_server_cli/README.md +++ b/pact_mock_server_cli/README.md @@ -120,16 +120,17 @@ Creates a new mock server from a pact file Usage: pact_mock_server_cli create [OPTIONS] --file Options: - -f, --file the pact file to define the mock server - --help Print help and exit - -c, --cors-preflight Handle CORS pre-flight requests - -v, --version Print version information and exit - -p, --port port the master mock server runs on (defaults to 8080) - --tls Enable TLS with the mock server (will use a self-signed certificate) - -h, --host hostname the master mock server runs on (defaults to localhost) - -l, --loglevel Log level for mock servers to write to the log file (defaults to info) [possible values: error, warn, info, debug, trace, none] - --no-term-log Turns off using terminal ANSI escape codes - --no-file-log Do not log to an output file + -f, --file the pact file to define the mock server + --help Print help and exit + -c, --cors-preflight Handle CORS pre-flight requests + -v, --version Print version information and exit + -p, --port port the master mock server runs on (defaults to 8080) + --specification The Pact specification version to use (defaults to V4) + -h, --host hostname the master mock server runs on (defaults to localhost) + --tls Enable TLS with the mock server (will use a self-signed certificate) + -l, --loglevel Log level for mock servers to write to the log file (defaults to info) [possible values: error, warn, info, debug, trace, none] + --no-term-log Turns off using terminal ANSI escape codes + --no-file-log Do not log to an output file ``` diff --git a/pact_mock_server_cli/src/create_mock.rs b/pact_mock_server_cli/src/create_mock.rs index d420bcbd..49bdc2e0 100644 --- a/pact_mock_server_cli/src/create_mock.rs +++ b/pact_mock_server_cli/src/create_mock.rs @@ -15,14 +15,19 @@ pub async fn create_mock_server(host: &str, port: u16, matches: &ArgMatches, usa match RequestResponsePact::read_pact(Path::new(file)) { Ok(ref pact) => { - let mut args = vec![]; + let mut args = Vec::::new(); if matches.get_flag("cors") { info!("Setting mock server to handle CORS pre-flight requests"); - args.push("cors=true"); + args.push("cors=true".to_string()); + } + if let Some(specification) = matches.get_one::("specification") { + info!("Setting mock server to use pact specification {}", specification); + let spec_arg = format!("specification={}", specification); + args.push(spec_arg); } if matches.get_flag("tls") { info!("Setting mock server to use TLS"); - args.push("tls=true"); + args.push("tls=true".to_string()); } let url = if args.is_empty() { format!("http://{}:{}/", host, port) diff --git a/pact_mock_server_cli/src/lib.rs b/pact_mock_server_cli/src/lib.rs index 59557e19..423cc12d 100644 --- a/pact_mock_server_cli/src/lib.rs +++ b/pact_mock_server_cli/src/lib.rs @@ -208,7 +208,12 @@ pub fn setup_args() -> Command { .short('c') .long("cors-preflight") .action(ArgAction::SetTrue) - .help("Handle CORS pre-flight requests")); + .help("Handle CORS pre-flight requests")) + .arg(Arg::new("specification") + .long("specification") + .action(ArgAction::Set) + .num_args(1) + .help("The Pact specification version to use (defaults to V4)")); #[cfg(feature = "tls")] { diff --git a/pact_mock_server_cli/src/server.rs b/pact_mock_server_cli/src/server.rs index 7a4dfcf4..143d5f8e 100644 --- a/pact_mock_server_cli/src/server.rs +++ b/pact_mock_server_cli/src/server.rs @@ -93,10 +93,23 @@ fn start_provider(context: &mut WebmachineContext) -> Result { })?; debug!("Loaded pact = {:?}", pact); let mock_server_id = generate_hexadecimal(8); - let config = MockServerConfig { + let pact_specification = match context.request.query.get("specification") { + Some(specs) => { + match specs.first() { + Some(spec) if !spec.is_empty() => Some(spec.clone()), + _ => None, + } + }, + None => None + }; + + let mut config = MockServerConfig { cors_preflight: query_param_set(context, "cors"), .. MockServerConfig::default() - }; + }; + if let Some(spec) = pact_specification { + config.pact_specification = spec.into(); + } debug!("Mock server config = {:?}", config); #[allow(unused_assignments)] diff --git a/pact_mock_server_cli/tests/cmd/create.stdout b/pact_mock_server_cli/tests/cmd/create.stdout index 849dad63..439f178e 100644 --- a/pact_mock_server_cli/tests/cmd/create.stdout +++ b/pact_mock_server_cli/tests/cmd/create.stdout @@ -3,14 +3,15 @@ Creates a new mock server from a pact file Usage: pact_mock_server_cli create [OPTIONS] --file Options: - -f, --file the pact file to define the mock server - --help Print help and exit - -c, --cors-preflight Handle CORS pre-flight requests - -v, --version Print version information and exit - -p, --port port the master mock server runs on (defaults to 8080) - --tls Enable TLS with the mock server (will use a self-signed certificate) - -h, --host hostname the master mock server runs on (defaults to localhost) - -l, --loglevel Log level for mock servers to write to the log file (defaults to info) [possible values: error, warn, info, debug, trace, none] - --no-term-log Turns off using terminal ANSI escape codes - --no-file-log Do not log to an output file + -f, --file the pact file to define the mock server + --help Print help and exit + -c, --cors-preflight Handle CORS pre-flight requests + -v, --version Print version information and exit + -p, --port port the master mock server runs on (defaults to 8080) + --specification The Pact specification version to use (defaults to V4) + -h, --host hostname the master mock server runs on (defaults to localhost) + --tls Enable TLS with the mock server (will use a self-signed certificate) + -l, --loglevel Log level for mock servers to write to the log file (defaults to info) [possible values: error, warn, info, debug, trace, none] + --no-term-log Turns off using terminal ANSI escape codes + --no-file-log Do not log to an output file From 1bf02075da8241e0757c4974d5bb0db5e7b7baff Mon Sep 17 00:00:00 2001 From: Yousaf Nabi Date: Fri, 24 Oct 2025 12:11:05 +0100 Subject: [PATCH 4/9] fix: ensure we write logs to file --- pact_mock_server_cli/src/lib.rs | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/pact_mock_server_cli/src/lib.rs b/pact_mock_server_cli/src/lib.rs index 423cc12d..8f8474c3 100644 --- a/pact_mock_server_cli/src/lib.rs +++ b/pact_mock_server_cli/src/lib.rs @@ -21,10 +21,10 @@ use rand::distributions::Alphanumeric; use rand::Rng; use regex::Regex; use tracing_core::LevelFilter; -use tracing_subscriber::fmt::writer::MakeWriterExt; use tracing_subscriber::FmtSubscriber; use pact_mock_server::server_manager::ServerManager; +use tracing_subscriber::layer::SubscriberExt; pub(crate) fn display_error(error: String, _usage: &str, code: i32) -> ! { eprintln!("ERROR: {}\nExiting with status {}", error, code); @@ -62,13 +62,20 @@ fn setup_loggers( if command == "start" && !no_file_log { let file_appender = tracing_appender::rolling::daily(output.unwrap_or("."), "pact_mock_server.log"); - let (non_blocking, _guard) = tracing_appender::non_blocking(file_appender); - let subscriber = FmtSubscriber::builder() - .with_max_level(log_level) - .with_writer(non_blocking.and(io::stdout)) - .with_thread_names(true) - .with_ansi(!no_term_log) - .finish(); + let (non_blocking, guard) = tracing_appender::non_blocking(file_appender); + static mut LOG_GUARD: Option = None; + unsafe { + LOG_GUARD = Some(guard); + } + let file_layer = tracing_subscriber::fmt::layer() + .with_writer(non_blocking) + .with_ansi(false) + .with_thread_names(true); + + let subscriber = + FmtSubscriber::builder().with_max_level(log_level).with_ansi(!no_term_log).finish() + .with(file_layer); + tracing::subscriber::set_global_default(subscriber) } else { let subscriber = FmtSubscriber::builder() From a48de4523a47187e5f860a24129ba5f448ca68ec Mon Sep 17 00:00:00 2001 From: Yousaf Nabi Date: Fri, 24 Oct 2025 12:56:04 +0100 Subject: [PATCH 5/9] feat!: rename binary to pact-mock-server also drop osx named artifacts, use new macos named ones instead fix release artifact shasums, see https://github.com/pact-foundation/pact-plugins/issues/91 --- pact_mock_server_cli/Cargo.toml | 2 +- pact_mock_server_cli/Dockerfile | 10 ++--- pact_mock_server_cli/README.md | 40 +++++++++---------- pact_mock_server_cli/release-linux.sh | 8 ++-- pact_mock_server_cli/release-macos.sh | 14 ++----- pact_mock_server_cli/release-win.sh | 8 ++-- pact_mock_server_cli/tests/cmd/create.stdout | 2 +- pact_mock_server_cli/tests/cmd/create.toml | 2 +- pact_mock_server_cli/tests/cmd/list.stdout | 2 +- pact_mock_server_cli/tests/cmd/list.toml | 2 +- pact_mock_server_cli/tests/cmd/main.stdout | 2 +- pact_mock_server_cli/tests/cmd/main.toml | 2 +- .../tests/cmd/shutdown.stdout | 2 +- pact_mock_server_cli/tests/cmd/shutdown.toml | 2 +- pact_mock_server_cli/tests/cmd/start.stdout | 2 +- pact_mock_server_cli/tests/cmd/start.toml | 2 +- pact_mock_server_cli/tests/cmd/verify.stdout | 2 +- pact_mock_server_cli/tests/cmd/verify.toml | 2 +- scripts/gzip-and-sum.sh | 9 ++++- 19 files changed, 58 insertions(+), 57 deletions(-) diff --git a/pact_mock_server_cli/Cargo.toml b/pact_mock_server_cli/Cargo.toml index 662ec8af..02d36179 100644 --- a/pact_mock_server_cli/Cargo.toml +++ b/pact_mock_server_cli/Cargo.toml @@ -59,7 +59,7 @@ env_logger = "0.11.5" # create bin and lib entries [[bin]] -name = "pact_mock_server_cli" +name = "pact-mock-server" path = "src/bin.rs" [lib] name = "pact_mock_server_cli" diff --git a/pact_mock_server_cli/Dockerfile b/pact_mock_server_cli/Dockerfile index ab2737fd..3fafe547 100644 --- a/pact_mock_server_cli/Dockerfile +++ b/pact_mock_server_cli/Dockerfile @@ -4,19 +4,19 @@ ARG BIN_ARCH=x86_64 ARG VERSION=1.0.5 RUN apk --no-cache add wget -RUN wget -O pact_mock_server_cli.gz https://github.com/pact-foundation/pact-reference/releases/download/pact_mock_server_cli-v${VERSION}/pact_mock_server_cli-linux-${BIN_ARCH}.gz -RUN gunzip pact_mock_server_cli.gz -RUN chmod +x pact_mock_server_cli +RUN wget -O pact-mock-server.gz https://github.com/pact-foundation/pact-reference/releases/download/pact_mock_server_cli-v${VERSION}/pact-mock-server-linux-${BIN_ARCH}.gz +RUN gunzip pact-mock-server.gz +RUN chmod +x pact-mock-server # Now, we need to build our _real_ Docker container, copying in the executable. FROM ${ARCH}alpine:3.16 RUN apk --no-cache add ca-certificates COPY --from=builder \ - /pact_mock_server_cli \ + /pact-mock-server \ /usr/local/bin/ EXPOSE 8080 9000-9020 -ENTRYPOINT ["/usr/local/bin/pact_mock_server_cli"] +ENTRYPOINT ["/usr/local/bin/pact-mock-server"] CMD ["start", "--base-port", "9000"] diff --git a/pact_mock_server_cli/README.md b/pact_mock_server_cli/README.md index 198d9f78..d05ae327 100644 --- a/pact_mock_server_cli/README.md +++ b/pact_mock_server_cli/README.md @@ -8,16 +8,16 @@ restful web api or through the command line interface. It implements the [V4 Pac ## Command line interface -The mock server is bundles as a single binary executable `pact_mock_server_cli`. Running this with out any options displays +The mock server is bundles as a single binary executable `pact-mock-server`. Running this with out any options displays the standard help. ```console,ignore -$ ./pact_mock_server_cli --help -./pact_mock_server_cli v1.0.0 +$ ./pact-mock-server --help +./pact-mock-server v1.0.0 Standalone Pact mock server USAGE: - pact_mock_server_cli [FLAGS] [OPTIONS] + pact-mock-server [FLAGS] [OPTIONS] FLAGS: --help Prints help information @@ -72,10 +72,10 @@ This prints either the main help or the help for a sub-command. This starts the master mock server. This server needs to be running for the other sub-commands to work. ```console -$ ./pact_mock_server_cli help start +$ ./pact-mock-server help start Starts the master mock server -Usage: pact_mock_server_cli start [OPTIONS] +Usage: pact-mock-server start [OPTIONS] Options: --help Print help and exit @@ -101,7 +101,7 @@ This sets the output directory that log files and pact files are written to. It ##### Example ```console,ignore -$ ./pact_mock_server_cli start -l debug -o logs/ +$ ./pact-mock-server start -l debug -o logs/ 15:40:08 [DEBUG] hyper::server: threads = 10 15:40:08 [INFO] pact_mock_server_cli::server: Server started on port 8080 ``` @@ -114,10 +114,10 @@ will be displayed. Note, the tls option will only be available if the tls create feature is enabled. ```console -$ ./pact_mock_server_cli help create +$ ./pact-mock-server help create Creates a new mock server from a pact file -Usage: pact_mock_server_cli create [OPTIONS] --file +Usage: pact-mock-server create [OPTIONS] --file Options: -f, --file the pact file to define the mock server @@ -144,7 +144,7 @@ This option specifies the pact file to base the mock server on. It is a mandator ##### Example ```console,ignore -$ ./pact_mock_server_cli create -f ../../../libpact_matching/tests/pact.json +$ ./pact-mock-server create -f ../../../libpact_matching/tests/pact.json 15:43:47 [INFO] pact_mock_server_cli::create_mock: Creating mock server from file ../../../libpact_matching/tests/pact.json Mock server "7d1bf906d0ff42528f2d7d794dd19c5b" started on port 52943 ``` @@ -154,10 +154,10 @@ Mock server "7d1bf906d0ff42528f2d7d794dd19c5b" started on port 52943 Lists out all running mock servers with their ID, port, provider name and status. ```console -$ ./pact_mock_server_cli list --help +$ ./pact-mock-server list --help Lists all the running mock servers -Usage: pact_mock_server_cli list [OPTIONS] +Usage: pact-mock-server list [OPTIONS] Options: --help Print help and exit @@ -174,7 +174,7 @@ Options: ##### Example ```console,ignore -$ ./pact_mock_server_cli list +$ ./pact-mock-server list Mock Server Id Port Provider Status 7d1bf906d0ff42528f2d7d794dd19c5b 52943 Alice Service error ``` @@ -186,10 +186,10 @@ expectations have been met, the pact file will be written out to the output dire sub-command. If there is any errors, no pact file will be written and the errors displayed to the console. ```console -$ ./pact_mock_server_cli verify --help +$ ./pact-mock-server verify --help Verify the mock server by id or port number, and generate a pact file if all ok -Usage: pact_mock_server_cli verify [OPTIONS] +Usage: pact-mock-server verify [OPTIONS] Options: --help @@ -229,7 +229,7 @@ The port number of the mock server to verify. Either this option or the mock ser In the case of a mock server that has issues: ```console,ignore -$ ./pact_mock_server_cli verify -m 52943 +$ ./pact-mock-server verify -m 52943 Mock server 7d1bf906d0ff42528f2d7d794dd19c5b/52943 failed verification with 1 errors 0 - Expected request was not received - {"method":"GET","path":"/mallory","query":"name=ron&status=good"} @@ -238,7 +238,7 @@ Mock server 7d1bf906d0ff42528f2d7d794dd19c5b/52943 failed verification with 1 er and for a mock server that has matched all requests: ```console,ignore -$ ./pact_mock_server_cli verify -m 52943 +$ ./pact-mock-server verify -m 52943 Mock server 7d1bf906d0ff42528f2d7d794dd19c5b/52943 verified ok ``` @@ -247,10 +247,10 @@ Mock server 7d1bf906d0ff42528f2d7d794dd19c5b/52943 verified ok Shutdown the mock server by id or port number, releasing all its resources. ```console -$ ./pact_mock_server_cli help shutdown +$ ./pact-mock-server help shutdown Shutdown the mock server by id or port number, releasing all its resources -Usage: pact_mock_server_cli shutdown [OPTIONS] +Usage: pact-mock-server shutdown [OPTIONS] Options: --help @@ -288,7 +288,7 @@ The port number of the mock server to shutdown. Either this option or the mock s ##### Example ```console,ignore -$ ./pact_mock_server_cli shutdown -i 3a94a472d04849048b78109e288702d0 +$ ./pact-mock-server shutdown -i 3a94a472d04849048b78109e288702d0 Mock server with id '3a94a472d04849048b78109e288702d0' shutdown ok ``` diff --git a/pact_mock_server_cli/release-linux.sh b/pact_mock_server_cli/release-linux.sh index 4b27b734..a66d2fc2 100755 --- a/pact_mock_server_cli/release-linux.sh +++ b/pact_mock_server_cli/release-linux.sh @@ -19,8 +19,8 @@ build_x86_64() { if [[ "${cargo_flags[*]}" =~ "--release" ]]; then gzip_and_sum \ - "$CARGO_TARGET_DIR/x86_64-unknown-linux-musl/release/pact_mock_server_cli" \ - "$ARTIFACTS_DIR/pact_mock_server_cli-linux-x86_64.gz" + "$CARGO_TARGET_DIR/x86_64-unknown-linux-musl/release/pact-mock-server" \ + "$ARTIFACTS_DIR/pact-mock-server-linux-x86_64.gz" fi } @@ -34,8 +34,8 @@ build_aarch64() { if [[ "${cargo_flags[*]}" =~ "--release" ]]; then gzip_and_sum \ - "$CARGO_TARGET_DIR/aarch64-unknown-linux-musl/release/pact_mock_server_cli" \ - "$ARTIFACTS_DIR/pact_mock_server_cli-linux-aarch64.gz" + "$CARGO_TARGET_DIR/aarch64-unknown-linux-musl/release/pact-mock-server" \ + "$ARTIFACTS_DIR/pact-mock-server-linux-aarch64.gz" fi } diff --git a/pact_mock_server_cli/release-macos.sh b/pact_mock_server_cli/release-macos.sh index d9e77ff3..a4afdad1 100755 --- a/pact_mock_server_cli/release-macos.sh +++ b/pact_mock_server_cli/release-macos.sh @@ -22,11 +22,8 @@ build_x86_64() { if [[ "${cargo_flags[*]}" =~ "--release" ]]; then gzip_and_sum \ - "$CARGO_TARGET_DIR/x86_64-apple-darwin/release/pact_mock_server_cli" \ - "$ARTIFACTS_DIR/pact_mock_server_cli-osx-x86_64.gz" - gzip_and_sum \ - "$CARGO_TARGET_DIR/x86_64-apple-darwin/release/pact_mock_server_cli" \ - "$ARTIFACTS_DIR/pact_mock_server_cli-macos-x86_64.gz" + "$CARGO_TARGET_DIR/x86_64-apple-darwin/release/pact-mock-server" \ + "$ARTIFACTS_DIR/pact-mock-server-macos-x86_64.gz" fi } @@ -36,11 +33,8 @@ build_aarch64() { if [[ "${cargo_flags[*]}" =~ "--release" ]]; then gzip_and_sum \ - "$CARGO_TARGET_DIR/aarch64-apple-darwin/release/pact_mock_server_cli" \ - "$ARTIFACTS_DIR/pact_mock_server_cli-osx-aarch64.gz" - gzip_and_sum \ - "$CARGO_TARGET_DIR/aarch64-apple-darwin/release/pact_mock_server_cli" \ - "$ARTIFACTS_DIR/pact_mock_server_cli-macos-aarch64.gz" + "$CARGO_TARGET_DIR/aarch64-apple-darwin/release/pact-mock-server" \ + "$ARTIFACTS_DIR/pact-mock-server-macos-aarch64.gz" fi } diff --git a/pact_mock_server_cli/release-win.sh b/pact_mock_server_cli/release-win.sh index e6ebe3a2..5fe1dab2 100644 --- a/pact_mock_server_cli/release-win.sh +++ b/pact_mock_server_cli/release-win.sh @@ -20,8 +20,8 @@ build_x86_64() { # If --release in cargo flags, then gzip and sum the release artifacts if [[ "${cargo_flags[*]}" =~ "--release" ]]; then gzip_and_sum \ - "$CARGO_TARGET_DIR/x86_64-pc-windows-msvc/release/pact_mock_server_cli.exe" \ - "$ARTIFACTS_DIR/pact_mock_server_cli-windows-x86_64.exe.gz" + "$CARGO_TARGET_DIR/x86_64-pc-windows-msvc/release/pact-mock-server.exe" \ + "$ARTIFACTS_DIR/pact-mock-server-windows-x86_64.exe.gz" fi } @@ -31,8 +31,8 @@ build_aarch64() { if [[ "${cargo_flags[*]}" =~ "--release" ]]; then gzip_and_sum \ - "$CARGO_TARGET_DIR/aarch64-pc-windows-msvc/release/pact_mock_server_cli.exe" \ - "$ARTIFACTS_DIR/pact_mock_server_cli-windows-aarch64.exe.gz" + "$CARGO_TARGET_DIR/aarch64-pc-windows-msvc/release/pact-mock-server.exe" \ + "$ARTIFACTS_DIR/pact-mock-server-windows-aarch64.exe.gz" fi } diff --git a/pact_mock_server_cli/tests/cmd/create.stdout b/pact_mock_server_cli/tests/cmd/create.stdout index 439f178e..e2167f1b 100644 --- a/pact_mock_server_cli/tests/cmd/create.stdout +++ b/pact_mock_server_cli/tests/cmd/create.stdout @@ -1,6 +1,6 @@ Creates a new mock server from a pact file -Usage: pact_mock_server_cli create [OPTIONS] --file +Usage: pact-mock-server create [OPTIONS] --file Options: -f, --file the pact file to define the mock server diff --git a/pact_mock_server_cli/tests/cmd/create.toml b/pact_mock_server_cli/tests/cmd/create.toml index fe1883b3..86129dae 100644 --- a/pact_mock_server_cli/tests/cmd/create.toml +++ b/pact_mock_server_cli/tests/cmd/create.toml @@ -1,2 +1,2 @@ -bin.name = "pact_mock_server_cli" +bin.name = "pact-mock-server" args = "create --help" diff --git a/pact_mock_server_cli/tests/cmd/list.stdout b/pact_mock_server_cli/tests/cmd/list.stdout index e7329b58..42a65395 100644 --- a/pact_mock_server_cli/tests/cmd/list.stdout +++ b/pact_mock_server_cli/tests/cmd/list.stdout @@ -1,6 +1,6 @@ Lists all the running mock servers -Usage: pact_mock_server_cli list [OPTIONS] +Usage: pact-mock-server list [OPTIONS] Options: --help Print help and exit diff --git a/pact_mock_server_cli/tests/cmd/list.toml b/pact_mock_server_cli/tests/cmd/list.toml index d921b514..8f4ff6dd 100644 --- a/pact_mock_server_cli/tests/cmd/list.toml +++ b/pact_mock_server_cli/tests/cmd/list.toml @@ -1,2 +1,2 @@ -bin.name = "pact_mock_server_cli" +bin.name = "pact-mock-server" args = "list --help" diff --git a/pact_mock_server_cli/tests/cmd/main.stdout b/pact_mock_server_cli/tests/cmd/main.stdout index 173bb772..da32110b 100644 --- a/pact_mock_server_cli/tests/cmd/main.stdout +++ b/pact_mock_server_cli/tests/cmd/main.stdout @@ -1,6 +1,6 @@ Standalone Pact mock server -Usage: pact_mock_server_cli [OPTIONS] [COMMAND] +Usage: pact-mock-server [OPTIONS] [COMMAND] Commands: start Starts the master mock server diff --git a/pact_mock_server_cli/tests/cmd/main.toml b/pact_mock_server_cli/tests/cmd/main.toml index b47a251e..0943ea2a 100644 --- a/pact_mock_server_cli/tests/cmd/main.toml +++ b/pact_mock_server_cli/tests/cmd/main.toml @@ -1,3 +1,3 @@ -bin.name = "pact_mock_server_cli" +bin.name = "pact-mock-server" args = "--help" #status.code = 2 diff --git a/pact_mock_server_cli/tests/cmd/shutdown.stdout b/pact_mock_server_cli/tests/cmd/shutdown.stdout index ecfb1ab6..f4a3bdad 100644 --- a/pact_mock_server_cli/tests/cmd/shutdown.stdout +++ b/pact_mock_server_cli/tests/cmd/shutdown.stdout @@ -1,6 +1,6 @@ Shutdown the mock server by id or port number, releasing all its resources -Usage: pact_mock_server_cli shutdown [OPTIONS] +Usage: pact-mock-server shutdown [OPTIONS] Options: --help diff --git a/pact_mock_server_cli/tests/cmd/shutdown.toml b/pact_mock_server_cli/tests/cmd/shutdown.toml index 892ce160..6267f9b3 100644 --- a/pact_mock_server_cli/tests/cmd/shutdown.toml +++ b/pact_mock_server_cli/tests/cmd/shutdown.toml @@ -1,2 +1,2 @@ -bin.name = "pact_mock_server_cli" +bin.name = "pact-mock-server" args = "shutdown --help" diff --git a/pact_mock_server_cli/tests/cmd/start.stdout b/pact_mock_server_cli/tests/cmd/start.stdout index 8d9eb008..57fbe509 100644 --- a/pact_mock_server_cli/tests/cmd/start.stdout +++ b/pact_mock_server_cli/tests/cmd/start.stdout @@ -1,6 +1,6 @@ Starts the master mock server -Usage: pact_mock_server_cli start [OPTIONS] +Usage: pact-mock-server start [OPTIONS] Options: --help Print help and exit diff --git a/pact_mock_server_cli/tests/cmd/start.toml b/pact_mock_server_cli/tests/cmd/start.toml index 997c2c45..256eb650 100644 --- a/pact_mock_server_cli/tests/cmd/start.toml +++ b/pact_mock_server_cli/tests/cmd/start.toml @@ -1,2 +1,2 @@ -bin.name = "pact_mock_server_cli" +bin.name = "pact-mock-server" args = "start --help" diff --git a/pact_mock_server_cli/tests/cmd/verify.stdout b/pact_mock_server_cli/tests/cmd/verify.stdout index 9c680ef0..1e070c8f 100644 --- a/pact_mock_server_cli/tests/cmd/verify.stdout +++ b/pact_mock_server_cli/tests/cmd/verify.stdout @@ -1,6 +1,6 @@ Verify the mock server by id or port number, and generate a pact file if all ok -Usage: pact_mock_server_cli verify [OPTIONS] +Usage: pact-mock-server verify [OPTIONS] Options: --help diff --git a/pact_mock_server_cli/tests/cmd/verify.toml b/pact_mock_server_cli/tests/cmd/verify.toml index b73e00b1..99f93491 100644 --- a/pact_mock_server_cli/tests/cmd/verify.toml +++ b/pact_mock_server_cli/tests/cmd/verify.toml @@ -1,2 +1,2 @@ -bin.name = "pact_mock_server_cli" +bin.name = "pact-mock-server" args = "verify --help" diff --git a/scripts/gzip-and-sum.sh b/scripts/gzip-and-sum.sh index 42f1f1d8..c7847b52 100644 --- a/scripts/gzip-and-sum.sh +++ b/scripts/gzip-and-sum.sh @@ -15,4 +15,11 @@ gzip_and_sum() { gzip --stdout --best "$orig_file" > "$target_file" openssl dgst -sha256 -r "$target_file" > "$digest_file" -} + basenamedir=$(basename $target_file) + if [[ "$(uname -s)" == "Darwin" ]]; then + # OSX requires an empty arg passed to -i, but this doesn't work on Lin/Win + sed -Ei '' "s|\*(.*)$|\*$basenamedir|" "$digest_file" + else + sed -Ei "s|\*(.*)$|\*$basenamedir|" "$digest_file" + fi +} \ No newline at end of file From 5232396ec33dcb285200a3faa59caef592a890a0 Mon Sep 17 00:00:00 2001 From: Yousaf Nabi Date: Fri, 24 Oct 2025 13:46:37 +0100 Subject: [PATCH 6/9] chore(ci): fix release/build workflow (windows/macos-latest - ubuntu 22.04) --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0a6ca52a..b9a0a276 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,7 +13,7 @@ jobs: runs-on: ${{ matrix.operating-system }} strategy: matrix: - operating-system: [ ubuntu-latest, windows-latest, macos-13 ] + operating-system: [ ubuntu-latest, windows-latest, macos-latest ] rust: [ stable ] env: pact_do_not_track: true diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3a5473d0..313d43a7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,11 +19,11 @@ jobs: strategy: matrix: include: - - operating-system: ubuntu-20.04 + - operating-system: ubuntu-22.04 targets: x86_64-unknown-linux-gnu,x86_64-unknown-linux-musl,aarch64-unknown-linux-gnu,aarch64-unknown-linux-musl - - operating-system: windows-2019 + - operating-system: windows-latest targets: aarch64-pc-windows-msvc,x86_64-pc-windows-msvc - - operating-system: macos-13 + - operating-system: macos-latest targets: aarch64-apple-darwin,x86_64-apple-darwin fail-fast: false From f1ab67bc92c9da9d99a2d73fb1cea8c0d5451d5d Mon Sep 17 00:00:00 2001 From: Yousaf Nabi Date: Wed, 29 Oct 2025 20:26:28 +0000 Subject: [PATCH 7/9] chore(pact_mock_server_cli): rename bin.rs to bin/pact-mock-server --- pact_mock_server_cli/Cargo.toml | 8 -------- .../src/{bin.rs => bin/pact-mock-server.rs} | 0 2 files changed, 8 deletions(-) rename pact_mock_server_cli/src/{bin.rs => bin/pact-mock-server.rs} (100%) diff --git a/pact_mock_server_cli/Cargo.toml b/pact_mock_server_cli/Cargo.toml index 02d36179..cad65202 100644 --- a/pact_mock_server_cli/Cargo.toml +++ b/pact_mock_server_cli/Cargo.toml @@ -56,11 +56,3 @@ expectest = "0.12.0" trycmd = "0.15.7" test-log = "0.2.16" env_logger = "0.11.5" - -# create bin and lib entries -[[bin]] -name = "pact-mock-server" -path = "src/bin.rs" -[lib] -name = "pact_mock_server_cli" -path = "src/lib.rs" \ No newline at end of file diff --git a/pact_mock_server_cli/src/bin.rs b/pact_mock_server_cli/src/bin/pact-mock-server.rs similarity index 100% rename from pact_mock_server_cli/src/bin.rs rename to pact_mock_server_cli/src/bin/pact-mock-server.rs From 05aa5e6313dafc9f590d6c9d38f592b1b905bf6a Mon Sep 17 00:00:00 2001 From: Yousaf Nabi Date: Wed, 29 Oct 2025 20:27:03 +0000 Subject: [PATCH 8/9] chore(docker): rename to pactfoundation/pact-mock-server drop -ref- seperator --- pact_mock_server_cli/release-docker.sh | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/pact_mock_server_cli/release-docker.sh b/pact_mock_server_cli/release-docker.sh index 50564cf6..f565ab96 100755 --- a/pact_mock_server_cli/release-docker.sh +++ b/pact_mock_server_cli/release-docker.sh @@ -9,21 +9,21 @@ if [ "" = "$1" ]; then fi # AMD64 -docker build . -t pactfoundation/pact-ref-mock-server:$1-amd64 --platform linux/amd64 \ +docker build . -t pactfoundation/pact-mock-server:$1-amd64 --platform linux/amd64 \ --build-arg ARCH=amd64/ --build-arg BIN_ARCH=x86_64 --build-arg VERSION=$1 -docker push pactfoundation/pact-ref-mock-server:$1-amd64 +docker push pactfoundation/pact-mock-server:$1-amd64 # ARM64V8 -docker build . -t pactfoundation/pact-ref-mock-server:$1-arm64v8 --platform linux/arm64 \ +docker build . -t pactfoundation/pact-mock-server:$1-arm64v8 --platform linux/arm64 \ --build-arg ARCH=arm64v8/ --build-arg BIN_ARCH=aarch64 --build-arg VERSION=$1 -docker push pactfoundation/pact-ref-mock-server:$1-arm64v8 +docker push pactfoundation/pact-mock-server:$1-arm64v8 # Create Manifest -docker manifest create pactfoundation/pact-ref-mock-server:$1 \ - --amend pactfoundation/pact-ref-mock-server:$1-amd64 \ - --amend pactfoundation/pact-ref-mock-server:$1-arm64v8 -docker manifest push pactfoundation/pact-ref-mock-server:$1 -docker manifest create pactfoundation/pact-ref-mock-server:latest \ - --amend pactfoundation/pact-ref-mock-server:$1-amd64 \ - --amend pactfoundation/pact-ref-mock-server:$1-arm64v8 -docker manifest push pactfoundation/pact-ref-mock-server:latest +docker manifest create pactfoundation/pact-mock-server:$1 \ + --amend pactfoundation/pact-mock-server:$1-amd64 \ + --amend pactfoundation/pact-mock-server:$1-arm64v8 +docker manifest push pactfoundation/pact-mock-server:$1 +docker manifest create pactfoundation/pact-mock-server:latest \ + --amend pactfoundation/pact-mock-server:$1-amd64 \ + --amend pactfoundation/pact-mock-server:$1-arm64v8 +docker manifest push pactfoundation/pact-mock-server:latest From 7ba07860bfff1676e08c67097d632eb3f1647038 Mon Sep 17 00:00:00 2001 From: Yousaf Nabi Date: Fri, 31 Oct 2025 15:33:17 +0000 Subject: [PATCH 9/9] chore: add install script --- scripts/install-pact_mock_server_cli.sh | 48 +++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100755 scripts/install-pact_mock_server_cli.sh diff --git a/scripts/install-pact_mock_server_cli.sh b/scripts/install-pact_mock_server_cli.sh new file mode 100755 index 00000000..17ac5ac4 --- /dev/null +++ b/scripts/install-pact_mock_server_cli.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env sh + +set -e +set -x + +MOCK_SERVER_CLI_VERSION="2.0.0" # https://github.com/pact-foundation/pact-core-mock-server/releases + +mkdir -p ~/.pact/bin +case "$(uname -s)" in + + Darwin) + echo '== Installing mock server CLI for Mac OSX ==' + if [ "$(uname -m)" = "arm64" ]; then + curl -L -o ~/.pact/bin/pact-mock-server.gz https://github.com/pact-foundation/pact-core-mock-server/releases/download/pact_mock_server_cli-v${MOCK_SERVER_CLI_VERSION}/pact-mock-server-macos-aarch64.gz + else + curl -L -o ~/.pact/bin/pact-mock-server.gz https://github.com/pact-foundation/pact-core-mock-server/releases/download/pact_mock_server_cli-v${MOCK_SERVER_CLI_VERSION}/pact-mock-server-macos-x86_64.gz + fi + gunzip -N -f ~/.pact/bin/pact-mock-server.gz + chmod +x ~/.pact/bin/pact-mock-server + ;; + + Linux) + echo '== Installing mock server CLI for Linux ==' + if [ "$(uname -m)" = "aarch64" ]; then + curl -L -o ~/.pact/bin/pact-mock-server.gz https://github.com/pact-foundation/pact-core-mock-server/releases/download/pact_mock_server_cli-v${MOCK_SERVER_CLI_VERSION}/pact-mock-server-linux-aarch64.gz + else + curl -L -o ~/.pact/bin/pact-mock-server.gz https://github.com/pact-foundation/pact-core-mock-server/releases/download/pact_mock_server_cli-v${MOCK_SERVER_CLI_VERSION}/pact-mock-server-linux-x86_64.gz + fi + gunzip -N -f ~/.pact/bin/pact-mock-server.gz + chmod +x ~/.pact/bin/pact-mock-server + ;; + + CYGWIN*|MINGW32*|MSYS*|MINGW*) + echo '== Installing mock server CLI for MS Windows ==' + if [ "$(uname -m)" = "aarch64" ]; then + curl -L -o ~/.pact/bin/pact-mock-server.exe.gz https://github.com/pact-foundation/pact-core-mock-server/releases/download/pact_mock_server_cli-v${MOCK_SERVER_CLI_VERSION}/pact-mock-server-windows-aarch64.exe.gz + else + curl -L -o ~/.pact/bin/pact-mock-server.exe.gz https://github.com/pact-foundation/pact-core-mock-server/releases/download/pact_mock_server_cli-v${MOCK_SERVER_CLI_VERSION}/pact-mock-server-windows-x86_64.exe.gz + fi + gunzip -N -f ~/.pact/bin/pact-mock-server.exe.gz + chmod +x ~/.pact/bin/pact-mock-server.exe + ;; + + *) + echo "ERROR: $(uname -s) is not a supported operating system" + exit 1 + ;; +esac \ No newline at end of file