Skip to main content

Β· 10 min read

Welcome everyone, to that time of year when the πŸ•’ shifts an hour forward, the 🌞 shines on for a bit longer, which is nice, after a πŸ₯Ά and 🌧️ winter. It's March and we are live for another Pact Open Source update.

We've got lots of community contributions this month, and pleased to announce that Pact-PHP v10 is wrapping up for an official release, which will bring that Pact Rust core to more users, bringing speed and reliability benefits over the existing implementation. Huge props go out to Tien Vo πŸ‘¨πŸ»β€πŸ’» for the incredible coding marathon, and Lewis Cowles πŸ•΅οΈ for the code reviews.

Pact OSS Updates​

Specific language updates​

PHP​

Pact-PHP: V10 is nearly here. πŸš€ This brings the Pact Rust core to Pact-PHP allowing support up to the Pact V4 specification, which includes http / async & sync message / plugin interaction support, as well as allowing these to all co-exist in a single Pact file.

Here is a bit of a timeline of activities:

  • βœ…10.0.0-alpha7 release just went live
  • βœ… Creation of a release/9.x branch from current master branch for anyone who still want to work on Ruby Standalone code.
  • βœ… Merging of ffi branch into master
  • πŸ”œ Official release of Pact-PHP v10
    • alpha -> beta -> release

Once again we want to thank Tien and Lewis for their efforts in bringing this across the line. It is a testament to open-source collaboration across the globe, and has been really fun to watch. I really hope you enjoy using the new release. Be sure to drop us feedback like Steve Taylor did in this Github Issue

Not an issue as such, just want to say I love it. (I'm using 10-alpha3) It's so much faster and simpler, and I'm looking forward to using some of the newer Pact specification features. My API tests came across easily without much fuss.

Chat to us in: #pact-php.

Pact-Reference​

Pact-Reference:

  • Multi-Arch Docker images.

    • You asked for it, you got it!

      • --platform=linux/amd64

      • --platform=linux/arm64

      • DockerHub Images

    • Whats left?

      • CI pipeline to automate building/publishing of Docker images
      • Publishing of images to GitHub container registry
  • Alpine Support

    • Linux binaries are now built with musl statically linked rather than glibc dynamically.

      • This means any Linux users, regardless of distribution should all be able to use a single architecture specific binary.
    • Releases

      • pact-verifier-cli

        curl -LO https://github.com/pact-foundation/pact-reference/releases/download/pact_verifier_cli-v1.1.1/pact_verifier_cli-linux-$(uname -m).gz
        gunzip pact_verifier_cli-linux-$(uname -m).gz
        mv pact_verifier_cli-linux-$(uname -m) pact_verifier_cli
        ./pact_verifier_cli --help
      • pact_mock_server_cli

        curl -LO https://github.com/pact-foundation/pact-reference/releases/download/pact_mock_server_cli-v1.0.5/pact_mock_server_cli-linux-$(uname -m).gz
        gunzip pact_mock_server_cli-linux-$(uname -m).gz
        mv pact_mock_server_cli-linux-$(uname -m) pact_mock_server_cli
        ./pact_mock_server_cli --help
    • Whats left?

    • Pact FFI Alpine specific static and shared libraries

      • These are now published, and require consumption in client libraries. Contributions are welcome, otherwise you'll hopefully see these rolling out throughout the year.

Chat with us in: #pact-rust.

Node JS​

Pact-JS​

Pact-JS Features​
info

Did you know, Pact-JS now supports the V4 Specification via the PactV4 interface. The documentation has been updated to reflect this. Found an issue or gap? Let us know

Corporate proxy support was delivered by Zac Poe in this pull request

  • feat(corporate proxy #1188)

In Zac's words

Add native support of HTTPS_PROXY and HTTP_PROXY for verifier for #1188

This change adds two pieces of behavior:

  • The verifier's 2 step parse body behavior now uses a proxy request buffer (instead of the 'proxyReq' rewrite behavior) to ensure the request stream is accessible for intermediary agent behavior
  • The verifier natively supports HTTP_PROXY/HTTPS_PROXY config and assigns a proxy http Agent where those values are present

This results in out-of-the-box support for corporate proxies in the js verifier

Thanks Zac πŸ™Œ

Pact-JS Fixes​

Dany Marques went down the NPM rabbit hole, to investigate the root cause of a very interesting bug, affecting NPM registry proxies, and npm script-jacking!

Some long nights with his detective hat on, saw Dany find a suitable workaround as an interim for the Pact-JS project, as well as upstream fixes to the npm project itself. We cannot thank you enough for your herculean efforts.

Matt Fellows fixed an issue where matching rules are not supported in messages: pact-foundation/pact-js#1183.

If you've been stuck on either of these issues, be sure to give it a re-test!

Chat with us in: #pact-js.

React/Cypress users​

GearΓ³id Γ“ Treasaig upgraded one of our example repos which contains our vanilla React "Product" API consumer used across all the JS HTTP based examples, and additionally includes Cypress and Pact-Cypress-Adapter.

GearΓ³id utilized graphite.dev to stage his pull-requests in distinct commits. The PR for good reading if you are preparing for upgrading some major dependencies in your JavaScript project, and want an example to follow. Thank you, we really appreciate it.

If you want to get involved, why not pull down the example and try it out, or apply upgrades to one of our many example repos. We would greatly appreciate it, and it is a neat way to start contributing to open source, if you haven't managed to already, but want to start somewhere!

Pact Broker​

Pact-Broker: Multi-Platform support + GitHub container registry support.

Multi-platform images are available

  • --platform=linux/amd64

  • --platform=linux/arm/v7

  • --platform=linux/arm64

  • DockerHub Image

    docker pull pactfoundation/pact-broker:latest
  • GitHub Container Registry Image

    docker pull ghcr.io/pact-foundation/pact-broker:latest
    • Note: The Org name needs to match our GitHub org, so note the additional hyphen - between pact-foundation

Pact Broker on AWS Fargate with CDK​

The beauty of the Pact Broker nature as a Docker image, means that it can be deployed in a multitude of different ways, and the architecture considerations are the end users to determine, implement and manage.

There are projects which seek to offer experiences with Terraform & Helm in order to provide some out-the-box experiences for regular deployment platforms.

Most of these have come from community contributions, either publicly displayed on GitHub, or shared back into the Pact-Foundation, such as pact-broker-chart.

I'm pleased to announce that we've had a community contribution by learnautomatedtesting of a PactStack, an open source tool utilizing gitlab AWS CDK to publish and deploy a serverless framework of the pactbroker and postgres database.

PactStack is a serverless solution for running a Pact broker alongside a PostgreSQL database entirely on AWS Fargate, leveraging the AWS Cloud Development Kit (CDK) for infrastructure as code. This solution is designed to facilitate contract testing between microservices by providing a centralized broker for storing and retrieving Pact contracts. The stack includes an ECS cluster, Fargate services for the Pact broker and PostgreSQL database, a CloudWatch Log Group for logs, and an S3 bucket for storing Pacts.

You can check out the repository here and see it in action against a full worked example

We've not had the chance to test this out yet, but if it appeals to you, please feel free to try it out and let the author know if you have any issues.

Chat to us in: #pact-broker.

Pact Ruby CLI​

Pact-Ruby-CLI: Multi-Platform support + GitHub container registry support.

Multi-platform images are available

  • --platform=linux/amd64

  • --platform=linux/arm/v7

  • --platform=linux/arm64

  • DockerHub Image

    docker pull pactfoundation/pact-cli:latest
  • GitHub Container Registry Image

    docker pull ghcr.io/pact-foundation/pact-cli:latest
    • Note: The Org name needs to match our GitHub org, so note the additional hyphen - between pact-foundation

Chat to us in: #pact-ruby.

Pact Docs​

Martin Gallauner is on his road to Pact Nirvana, and has been dropping some edits to the guide as he is working through it.

Thanks Martin, we really appreciate it and know that our end-users will to!

Did you know, that the majority of our website documentation was written by volunteers and it is a collective smattering of shared knowledge. A contract testing wikipedia if you will.

Whilst this is awesome, it can make a new users journey, a little disjointed at times, as they can feel overloaded with information.

We'd love to look at the documentation estate as a whole this year, and redesign our user journeys. If this appeals to you, why not get in touch.

Community Events​

Women Who Go London Feb 2024​

image

I had the pleasure of traveling down to London and speaking to a load of budding software-engineers at Deliveroo HQ about GoLang via the Women Who Go London group!

How do we test our applications now, what are the benefits and drawbacks of each way of testing and how does integration fit into all of it. Yousaf explains it all and provides examples on how to start contract testing with Go and Pact.

You can check out the slides here

Sanyia Saidova walks us through the journey of how to shape your platform to account for growth in your application - what decisions lay in your path as your userbase grows and how to weight them.

IMG_5478

You can check out Sanyia's slides here

Are you in, or near London? Do you love coding? Do you want to build a more diverse and inclusive Go community? Why not join us the WWGL Meetup group and attend an event soon.

Community shout-outs​

Big shout outs go to these contributors for their efforts, big and small.

  • Tien Vo for his dedication and determination to complete the pact-php rust core migration, I'm sure it's been a learning journey and you've come out as an even better PHP developer. We hope you can take you learnings and apply in a day job, as many others will be able to apply your code against their projects, providing safety and guarantees for years to come.
  • Lewis Cowles for the continual reviews in pact-php and support for Tien Vo.
  • Dany Marques for his tenacity in tracking down an obscure bug in the npm ecosystem, and creating upstream fixes, as well as resolving his issue in the interim in the pact-js project.
  • GearΓ³id Γ“ Treasaig for a series of PR's to improve the quality and health of our examples.
  • learnautomatedtesting for the Pact Broker AWS Fargate project and demo.
  • Zac Poe for corporate proxy support in Pact-JS

No matter the contributions, your work will make a positive impact to end users, who wish to benefit for Pact's feature-set, no matter the language or the tooling. We love seeing users bring fixes, improvements and new features to the Pact stable. We can help support you, if you aren't sure where to start.

What's stopping you?

Thats a wrap​

Want to carry on the conversation? Sign up here to join our Slack community, where you will be amongst over 5k other users. It's a safe place to ask questions, and a great place to share the awesome work you are doing in the Pact ecosystem.

Whatever you are up to, let us know, and we can look to get you featured in the Pact post.

See you next month folks!

Cheers, Saf

Β· 3 min read
tl;dr

Call one of the following when a branch is deleted in your CI systems to improve your Pact Broker performance.

  • Pact CLI's pact-broker delete-branch command
  • Pact Broker's API endpoint http://broker/pacticipants/$APPLICATION_NAME/branches/$BRANCH

Most CI systems provide event triggers which can be used to detect branch deletion events.

Back in 2021, the Pact Broker introduced the concepts of Branches and environments, rather than overloading tags, for both purposes. This came with a range of benefits, described in this post.

We've seen rafts of you switch over to the new state of Pact Nirvana, utilizing branches and environments, to their full effect and today I'd like to share a little tip, to help keep your Pact Broker working at it's optimum.

It is important to have good hygiene in your Pact Broker, ensuring that when you remove applications, branches, or environments from your version control system (github/bitbucket etc), you reflect the same within your broker.

Doing so, will improve performance when fetching pacts for verification and is highly recommended if you are deeply reliant on the can-i-deploy matrix's output, to keep query times as low as possible.

Removing stale branches is one of the easiest, and yet most overlooked areas of these, so I'm going to show you a couple of different techniques you can use.

Delete Branch Methods​

Removes a branch from a pacticipant version. Does not delete the actual pacticipant version.

API​

Send a DELETE request to the branch version resource.

Pact Broker - No Auth - Delete Branch​

curl -X DELETE $PACT_BROKER_BASE_URL/pacticipants/$APPLICATION_NAME/branches/$BRANCH

Pact Broker - Basic Auth - Delete Branch​

curl --user $PACT_BROKER_USERNAME:$PACT_BROKER_PASSWORD \
-X DELETE $PACT_BROKER_BASE_URL/pacticipants/$APPLICATION_NAME/branches/$BRANCH

PactFlow Broker - Bearer Auth - Delete Branch​

curl -H "Authorization: Bearer $PACT_BROKER_TOKEN" \
-X DELETE $PACT_BROKER_BASE_URL/pacticipants/$APPLICATION_NAME/branches/$BRANCH

Note:

If you want to check if your Pact Broker has support for the above relation, you can call the Pact Broker index, and check for the existence of _links."pb:pacticipant-branch"

Pact Broker - No Auth - Index​

curl $PACT_BROKER_BASE_URL \
| jq '._links."pb:pacticipant-branch"'

Pact Broker - Basic Auth - Index​

curl --user $PACT_BROKER_USERNAME:$PACT_BROKER_PASSWORD $PACT_BROKER_BASE_URL \
| jq '._links."pb:pacticipant-branch"'

PactFlow Broker - Bearer Auth - Index​

curl -H "Authorization: Bearer $PACT_BROKER_TOKEN" $PACT_BROKER_BASE_URL \
| jq '._links."pb:pacticipant-branch"'

Pact CLI​

pact-broker delete-branch \
--pacticipant "$APPLICATION_NAME" \
--branch "$BRANCH" \
--no-error-when-not-found

Note:

The Pact CLI is PACT_BROKER_* environment variable aware, so if you have your Basic Auth PACT_BROKER_USERNAME/PACT_BROKER_PASSWORD, or Bearer Auth PACT_BROKER_TOKEN environment variables set, the CLI will pick them up.

In our example above, PACT_BROKER_BASE_URL is set in our shell prior to executing.

You can explicitly set those values with

-b, --broker-base-url=BROKER_BASE_URL
# The base URL of the Pact Broker
-u, [--broker-username=BROKER_USERNAME]
# Pact Broker basic auth username
-p, [--broker-password=BROKER_PASSWORD]
# Pact Broker basic auth password
-k, [--broker-token=BROKER_TOKEN]
# Pact Broker bearer token

Example​

GitHub Actions​

name: Delete application branch in a Pact Broker

on:
delete:
branches:
- "*"

jobs:
delete-branch-in-pact-broker:
name: delete
runs-on: ubuntu-latest

steps:
- name: Install Pact CLI
run: |
curl -fsSL https://raw.githubusercontent.com/pact-foundation/pact-ruby-standalone/master/install.sh | sh
echo "PATH=${PATH}:${PWD}/pact/bin/" >>$GITHUB_ENV

- name: Delete branch
run: |
pact-broker delete-branch \
--pacticipant "$APPLICATION_NAME" \
--branch "${{ github.event.ref }}" \
--no-error-when-not-found
env:
PACT_BROKER_BASE_URL: "https://your-broker-url"
PACT_BROKER_USERNAME: ${{ secrets.PACT_BROKER_USERNAME }}
PACT_BROKER_PASSWORD: ${{ secrets.PACT_BROKER_PASSWORD }}
APPLICATION_NAME: 'example-consumer'

Go forth and delete all the things!

Β· 20 min read

Hello, and welcome to our first Pact Open post of 2024. It seems customary that you get a month's reprieve from me at the start of every year, so I'll start by saying Happy New Year to everyone, and also Happy New Year of the Dragon, to those who celebrated the Chinese New Year recently.

I hope you all had the chance to wind-down, relax and spend time with people you care about, whilst looking back, hopefully with a smile, at all the things you achieved last year. If you helped get involved in Pact, in any way, big or small, we are grateful.

Anyhow, that brings me to February, and I get the pleasure of letting you know what has been happening across the Pact estate over the last 8 weeks!

Pact OSS Updates​

Specific language updates​

Pact-Reference​

Pact-Reference: Lots of changes in the Pact-Reference project, from Ron and others. You'll find Pact FFI 0.4.16 out with a number of QoL improvements from a range of contributors.

Chat with us in: #pact-rust.

Pact-Plugins​

Pact-Plugins: The pact-protobuf-plugin has seen an uptick in usage, with several new contributors raising issues and fixes. We appreciate both, especially if the issues come with reproducible snippets as we have been seeing. Keep it up.

Fixes by Ron:

Have you tried out Pact Plugins yet? What's stopping you?

Chat with us in: #pact-plugins.

.NET​

Pact-net: 5.0.0-beta.2 was released a few days ago which includes the following

  • Replaced Newtonsoft with System.Text.Json (see upgrade guide for more info)
  • Increased minimum supported .Net Framework version to 4.6.2
  • Marked MacOS ARM architecture as fully supported
  • Upgraded to FFI 0.4.16
  • Upgraded tests to .Net 8 and .Net Frame 4.6.2
  • Find unused ports for the messaging server more efficiently

Want to upgrade? Check out the upgrade guide here.

Still on Pact-Net v3.x and want to migrate to the latest stable v4 version? Check out the upgrade guide here.

Whats next? Pact Plugin support! Check out the RFC for more detail, and feel free to add your feedback.

Chat with us in: #pact-net.

Golang​

Pact-go: v2.0.4 has just been released, which bumps the Pact FFI and includes external contributions from Armin Becher and Stanislav Vodetskyi, thanks guys πŸš€.

  • feat: add native lib path function #376
  • fix: allow empty responses in sync messages (#386)
  • fix: update pact-ffi to 0.4.16

Armin's change looks to improve the developer experience for GoLang users utilising Windows. Are you one of them?

Chat with us in: #pact-go.

Node JS​

Pact-JS: v12.2.0 has just been released. This introduces the PactV4 interface into GA (it was previously feature-flag enabled). This allows for Pact plugin support to the Pact-JS project. A team effort, led to a vulnerability fix, closing off an outstanding issue, thanks Yukun & Rufei. Matchers can now be applied to response bodies, thanks to this PR

Want to see the plugin framework in action in Pact-JS? Check out our gRPC example here.

Chat with us in: #pact-js.

Python​

Pact-Python: Josh has been continuing to work on the pact-compatability-suite integration in order to verify the Pact-Python integration with the Pact Rust libraries works correctly. You can keep track of the road to V3/V4 and the Rust backed implementation in this tracking issue. We saw a community fix: ensure interactions are not left when exception occur inside with statement from Jakub Stolarkski.

We hope to get a release out shortly, which will bring in an updated pact-ruby-standalone, and support for Python 3.12, and Jakub's fix. Also don't forget to watch the repository, if you want to be first in the loop when the new release lands, and later in the year you can start trialing the pact rust engine in your pact-python projects.

Chat to us in: #pact-python.

PHP​

Pact-PHP: Tien Vo has been on fire over the last 8 weeks, buoyed by Lewis Cowles input at review time. It has been nice to see Lewis dropping in to help lighten the load of Tien as well. It's nice to watch from afar, as I can see them both learning off each other, and goes to show how much collaboration helps as sometimes it can feel like a lonely place when you are just plugging away.

Changes in the FFI branch include:

  • Implementing of the V1 Consumer / V1 Provider/ V2 / V3 and V4 pact compatibility suites. If you've not seen the compat suite, it uses Cucumber to describe the Pact features, and Pact-PHP is using the Behat flavour. It is worth taking a look at.

I'd recommend dropping into the FFI branch, and checking out some of the examples where you can see Pact-PHP being used for contract testing gRPC services.

Have you trialed the V10 Beta of Pact-PHP?

Chat to us in: #pact-php.

Pact Broker​

Pact-Broker: JΓΆrgen Andersson is helping keeping the Pact Broker up to date, by updating our base image to Ruby 3.2.3, the Alpine version from 3.17 -> 3.19 and upgrading Supercronic 0.2.29.

Unfortunately moving to Alpine 3.19, broke Sqlite for x86_64 users, in the same way that it had been noted to have been broken in the aarch64 and arm images. We got a couple of reports, one from a fellow maintainer, and another from a user, which provided a cookie trail, which led to a fix, building sqlite3 gem from source, which not only solver the issue in our x86_64 image, and the outstanding aarch64/arm issue as well.

What does this mean for you? We will soon be publishing our multi-manifest images, without a -multi suffix, which means whether you are running on shiny M-Series macbook, a Raspberry PI, or your Intel/AMD gaming rig, you'll be able to pull the latest image, and get a native image that is right for your system.

Chat to us in: #pact-broker.

Pact Ruby Standalone​

Pact-Ruby-Standalone: Our fork of Traveling-Ruby has been updated with a few goodies.

What does this mean for users of the Pact Ruby Standalone project?

  • The ruby runtime is updated to Ruby 3.2.3
  • The bundled version of OpenSSL is now bumped to 3.2.0
  • The dependency on bash is gone! Yep, you heard that right, you can get away with sh only which means no more bash required in your Alpine images.

Pact Workshops​

The following workshops have been updated to use the latest versions of the Pact client libraries:

Yo dawg, I heard you like Alpine​

Unless you've been living under a rock, you've probably heard about Alpine. If not, it is a variant of Linux, which many teams choose to run their builds on due to its tiny footprint, and smaller security surface area. One of the significant areas of differences to more regular flavour of Linux (Debian/Ubuntu/Fedora etc), are it's choice of standard library. With Alpine choosing musl whilst others prefer glibc. This poses challenges for distributors of packages used within the Linux ecosystem.

So lets take a look at our options.

  1. We provide a single distribution, linked to glibc:
    1. Users need to be aware that the distribution is linked to glibc.
    2. Alpine users are required to perform workarounds.
    3. There will be a performance overhead in calling a program linked to glibc, over musl for Alpine users.
    4. Compatibility is not guaranteed, so further issues may occur, which can become complex to diagnose, especially if not reproducible on a glibc based distro.
    5. Maintainers need to ideally update their code to detect the presence of musl, to inform users of compatability issues. In many cases, glibc programs won't run without the Alpine workarounds, and therefore there is no ability in code to provide useful messages to users, so the onus is on them reading the documentation.
  2. We provide two distributions, one linked to glibc, one linked to musl:
    1. Users need to be aware of which std library they use, glibc or musl.
    2. Maintainers need to ideally update their code to detect the presence of musl, so they can provide the correct musl package to users. This can be challenging.
    3. Alpine traditionally prefers creating static builds, which can cause the inability of client languages to link to the shared C libraries.

Rust Core​

Alpine support has not been made available to the pact-reference project, often referred to the Pact Core, with our official guidance on our website:

Alpine is not supported as it requires us to build dynamically linked libraries for each specific version of Alpine and musl. It's possible to make it work, but we make no guarantees and it's likely to break in subtle ways and we would instead recommend adopting Ubuntu or Debian which supports linking to glibc.

I'm not sure how many users have been limited by this, unable to switch from Alpine based containers, and therefore unable to utilise the pact-reference project, and all the V3/V4 Pact Spec goodness, along with the benefits that the Pact Plugin ecosystem providers, however there were enough issues on our repositories to make it a worthwhile wander to investigate. I've documented it in this issue in our pact-foundation/devrel repo.

The pact-core consists of a few elements, which are of use to end consumers, and languages, who are not using Rust.

note

You can take a look at the ecosystem here.

As the project is built with Rust, we can easily add in musl targets, both aarch64 and x86_64 with Cross (we'll talk a little about Cross in our next section).

The CLIs are easy, add in our required targets, build with cross, and out pops a musl based executable.

Shared libraries are a little more awkward. In order to tell Rust to create a shared library, we use the cdylib notation in our Cargo.toml file. This pops out shared libaries, when we build it with the following extensions.

  • Linux .so (shared object)
  • MacOS .dylib (dynamic library)
  • Windows .dll (dynamic linked library)

The extensions here, denote that they are shared libaries. If one was to build them statically, they would return a .a extension, which denotes archive. These files are in order of magnitude larger than their dynamic counterparts, as they self-contain everything needed to run the program, without requiring any external or system libraries.

When we build for Alpine targets, we only get a .a file output. Whilst this is perfect for some of our client languages, some such as PHP, Ruby and .NET to name a few, are unable to read .a files, excluding them from the picture.

It's possible by setting some flags, either as Rust compile time, or by using some gcc commands to take a .a file, and convert it into a shared object file. With this newly created file, we can load it with PHP, Ruby and .NET, in Alpine successfully.

In order to get green test suites, under the Alpine platform, it was necessary to also update parts of the Pact plugin framework to become musl aware, such that if it detects musl, it attempts to download a musl variant of a plugin. If the musl variant doesn't exist, it would be nice if we could attempt to load the glibc variant, which may work with the compatibility workarounds discussed earlier. If we can warn the user, so they can take an proactive actions, even better.

For two of the plugins, protobuf and csv, these are written in rust, so again we can follow our same pattern to enable musl variants. For our sample build your own plugin template, it is written in GoLang, which uses Goreleaser to build the linux variants. There is the added benefit that the application is built linked against musl, but able to be run on machines that link to glibc or musl, meaning there is no need to produce a separate musl named artifact.

The last of the plugins I took a look at was pact-avro-plugin, created by one of our community members Ali Ustek. This particular plugin is written in Java, so required the end user to install at least the JRE, if not the SDK, of Java 17, in order to use it. It also had a requirement on bash, in it's startup script, but the author has since updated this to use a sh based wrapper, meaning end users on Alpine, won't additionally need to install bash. Hooray!

Lower is better​

Whilst we've been talking about glibc/musl, it's usually good to know that they tend to be forwards compatible, such that if you build against an older version of musl or glibc, then your application will work with later versions of each respective library.

If you happen to build your application on the latest version of Alpine (musl) or Debian (glibc), you'll find users of older versions of those distro's will have errors running your application due to missing symbols.

We can resolve that using fixed images, which carefully control the versions of musl/glibc that we link against.

Now rather than creating our own build-box, the cross-rs project allows Rust based projects, to compile (and cross-compile) for multiple targets. Each of these targets, has a corresponding build image, and the team provide a brilliant table of the libc versions in place.

Now you'll note against the main branch, the glibc version is 2.31. This caused issues for several users, often for them indirectly. For example, one might be running an official NodeJS image, for an older version of Node, say version 16. These images are no longer being updated, as Node 16 is EOL, so it's built against an older version of Debian, which runs an older version of glibc, than 2.31. Oh noes!

Whilst our user in our story, was able to unblock themselves by updating to a later node image, which contained a later distribution, we are unknowingly excluding many Linux users from utilising the Pact Framework.

That isn't a place we'd like to position ourselves, as we understand that not only do teams in greenfield applications, who have the freedom to choose their tools and techniques, often pick contract testing, but that teams supporting heritage (legacy) applications, who for many varying reasons, might not have the ability to upgrade their infrastructure to the latest and greatest at the drop of a hat. These teams can benefit too from contract testing and should not be omitted from the frame.

So how do we solve it?

By pinning our version of cross to 0.2.5, our glibc based targets will link to 2.23, as shown in this cross target table

One of our community members Omair Majid posted this table of glibc versions in use across common linux distributions.

Distributionglibc version
Arch Linux2.36
Alpine 3.13N/A
CentOS 72.17
CentOS Stream 82.28
CentOS Stream 92.34
Debian 9 (Stretch)2.24
Debian 10 (Buster)2.28
Debian 11 (Bullseye)2.31
Fedora 352.34
Homebrew2.23
OpenSUSE Leap 15.32.31
OpenSUSE Tumbleweed2.35
RHEL 72.17
RHEL 82.28
RHEL 92.34
Ubuntu 18.042.27
Ubuntu 20.042.31
Ubuntu 22.042.35

Ruby Core​

So what about Ruby? I spoke earlier about our fork of traveling-ruby, which recently underwent some updates. Whilst on my Alpine adventures, I realised that there would now be some disparity between the platforms supported by the Pact Rust core, and the Pact Ruby core. That was an itch, I needed to scratch. Could I bring native musl based support to traveling-ruby? That way not only do we need to tell users, they no longer need bash, due to using sh compliant wrapper scripts, but they no longer would need a compatability layer, if one was running Alpine.

So similar to Cross, the traveling-ruby package uses Docker images to build for Linux. They are referred to as a holy-build-box, and was originally created by the Phusion team, of Passenger fame (and also the creators of traveling-ruby). The box used for building the current linux packages are based on Centos7 which links to glibc 2.17.

So I would need to create an Alpine based holy-build-box and see how far could get. Turns out pretty far and I managed to successfully Alpine/musl based packages for aarch64/x86_64. They were built on an Alpine 3.15 box, and have been tested up to the current 3.19 Alpine release.

Itching to try out the musl based packages? I've published a release from my fork of pact-ruby-standalone, that you can take out for a test drive today.

Who and whose ARMy?​

Multi-Manifest Images​

For the last year, we have been trialing multi-manifest images for the pact-cli and pact-broker docker images, which you have to opt in to use, by appending the tag name with -multi.

We've had a small amount of feedback, mainly all positive, with hopefully the last of the gremlins sorted (Sqlite3 was failing on arm64 images, then x86_64 images, resolved by building from source), so we are beginning to drop the multi suffix.

Pact-CLI has been the first, and also it celebrates it v1.0.0 release. You can find a multi-manifest tag with AMD64/ARM64 and ARM flavours here.

We would also like to publish our images to GitHub container registry in order to alleviate any pain, DockerHub's rate limits may be imposing on teams. The first of a series of PR's across our images is here, and a tracking issue here.

GitHub Actions launches ARM64 MacOS Runners​

We recently introduced ARM64 CI testing capabilities via CirrusCI last year, and rolled it out to several of our repositories, which unlocked cross-platform, cross-architecture testing for our maintainers, however due to licensing changes, CirrusCI began limiting OSS users usage, which mean monthly, builds would fail as we moved over our limits.

This was an inconvenience, but not limiting as we had not removed our existing GitHub Actions workflows, and were infact waiting for GitHub to unlock access to MacOS M1 runners for OSS usage. That time came last month, and we have see it applied to a couple of our repositories already.

If you spot a repo not covered by the new macos-14 runner, why not drop a PR in on the project?

Windows on ARM​

Are you running Windows on ARM? Whether you running it natively, or you are enjoying it via your speedy M-Series Apple processors via Apples Virtualisation framework (Check out UTM for a rather splendid open-source virt tool), I've got some good news for you.

We have started to publish support for Windows on ARM across a few of our projects. I'll borrow our list of Rust tooling before, as it'll highlight some of the gaps that we still need to cover. If you want to see Windows on ARM via your favourite Pact Client library, why not help fill in some of the blanks.

So what about Ruby? Not again Saf! Well it turns out Windows on ARM for Ruby, transpired to be a bit more complex, with even x86_64 emulation being broken in some versions. Users would come across this error, which would ultimately be solved for arm64 native builds (still broken in x86_64 emulation mode) via this patchset.

With this in place, it is now possible to compile later versions of Ruby > 3.1 for arm64 via a clangarm64 msys2 environment, and official msys2 packages were released for Ruby 3.1.4.

Traveling-Ruby utilises RubyInstaller2's packages for bundling Ruby and your gems, for distribution, but is awaiting arm64 support, with a request here. One can't utilise the msys2 packages directly, without a couple of tweaks, as RI2 maintains it's own Pacman repository with Ruby builds.

So I had a little dive into RI2, and managed to get it building for ARM64, consumed via traveling-ruby and consumed in pact-ruby-standalone locally.

Community Events​

Eric DeAndrea - How to avoid common pitfalls with modern microservices testing​

Eric DeAndrea spoke this month at the San Francisco Java User Group where he some common battle scars from our experiences in the field. He introduced the testing pyramid and explained why it is important in helping to continuously deploy microservices independently without fear. He also demonstrated, through a test-driven development approach, how the combination of Pact contract testing combined with Quarkus developer joy can help prevent your microservices from breaking in production.

Missed it? Don't worry you can catch the slides here, and you can be sure to hear more from Eric throughout the year. I would recommend following his socials for heads up on his next event.

WomenWhoGo - London​

WomenWhoGo London

If you're based in London, why not link up with the Women Who Go community, who are holding their first in-person event of 2024.

You'll get to hear from Sanyia Saidova from Deliveroo who will be speaking about Growing your application from prototype to production, and I'll be talking about Pact + GoLang - Contract testing for the past, present and the future (and how you can get involved!).

You can check out the meetup event here.

Community shout-outs​

We'd love to give a huge shout out to Stanislav Vodetskyi, who has been going above and beyond to improve the Pact-Go experience, by not only dropping PR's in the Pact-Go project, but rolling up his sleeves, learning Rust on the fly, to provide PR's in the Pact-Reference and Pact-Rust project, to improve the gRPC plugin capabilities, either by bug-fixes or improvements.

It's great to the see the plugin framework being actively used in an organisation, and this adoption helps bring more use cases to the table, and the feedback we receive in terms of Slack, GitHub issues or pull-requests, all go a long way to helping new users embrace Pact Plugins and the DX around it.

If you've spotted an improvement you can make, why not strike up a discussion with the maintainers, or fork the repo and have a play.

Thats a wrap​

Phew, that was a-lot! I didn't even scratch the surface, as this is only a small selection of the repositories across the Pact Foundation. If I missed something you achieved since the start of 2024, be sure to give me a shout so I get you a mention in the post.

If you haven't yet contributed to the Pact project, this is your year. If you are stuck and don't know where to start, why not join us in our Pact Slack community.

Sign up here!

See you next month folks!

Cheers, Saf

Β· 4 min read

Pact Almanac 2023​

Grab your hoverboard, and get prepared for another trip back to the future, with our round up of this years Pactivities in our seasonal Pact Almanac.

image

We had a raft of code features, patches, fixes and new projects added to the Pact-Foundation over the year. If you haven't read our monthly blog posts, you can read a round-up of the most significant changes from each month in there. Check out the side-bar to the left to view the older posts.

I've mainly focused on video content this time round, where you can find multiple advocates of Pact, spreading the word of not just how to do contract testing, but the why. I hope you'll enjoy them, be sure to like and comment on the videos, whether it's to show your appreciation or you just fancy a debate.

Oh, and if you are the debating type, why not join us in a fireside chat next year?

Anyhow, let see what each month has in store for us.

January​

Kicking off the year, we introduce a blog post from eBay titled API Evolution Is a Challenge. Could Contract Testing Be the Solution? You can read it here

Feb​

Diego Herrera introduced spoke at at EdinburghJS with a talk titled Testing services with Pact. Watch it here

Mar​

Holly Cummins discusses how contract tests combine the lightness of unit tests with the confidence of integration tests, and should be part of your development toolkit. Watch it here

Apr​

Lewis Prescott caught up with Janet Gregory and Lisa Crispin (Authors of the famed Agile Testing book), where they talk about how to use holistic testing with microservices and contract testing. You can watch it here.

May​

In this k6 Office Hours episode, Developer Advocates Marie Cruz (long time Pact friend) and Paul Balogh discuss what contract testing is, if schema testing is the same as contract testing, and how to do schema validation testing using Grafana k6. Check it out here

June​

gRPC and Protobufs are increasing in popularity, however, there are multiple classes of problems that may result in API breaking changes. In this video, we show how you can apply contract testing to gRPC and Protobufs systems using Pact and its Plugin framework. Watch Matt, show a quick demo of it in action here

July​

Dave Farley from Contiunuus Delivery explains why Contract Testing For Microservices IS A MUST, in his video here

For our Polish speaking friends, you can watch Jakub MaΕ‚yjasiak from Ocado Technology, talk about How Pact is more than just contracts and tests, here from a local meet up WrocΕ‚aw.

Aug​

DPoint, helped demystify contract testing, in this video here, you can also see it in action with Spring Boot demos for both producers and consumers.

Sept​

Ebay explains Consumer-Driven Contract Testing and how could they use it to improve testing their Microservice APIs with Pact? Watch their video where dive into the theory of Contract Testing, the potential benefits of using it, and some practical examples, here

Oct​

It was Pact's 10th Birthday, and you can find your map to all the resources that came out of our month long celebration in this blog post.

LambdaTest spoke with Bas Djistrka about Solving the Integration Testing Puzzle with Contract Testing, as part of the Voices of Community series. You can watch it here

Nov​

Matt Fellows spoke at Testing Talks Conference in Melbourne, where he provides a comprehensive guide to Pact. Watch it here

Dec​

Angelo kicked off December with a tutorial showcasing interoperability with a PHP backend and JavaScript frontend powered by contract testing, watch it here

See you next year folks​

Thanks for everyone's efforts in using, promoting, and preaching about Pact to everyone you know, now its our time to repay the favour.

If you've done something great, and want to share it, get it listed - the site is open source and you can edit any page, we want to give you a platform to help amplify your voice!

Maybe there is time to get one last video/blog or PR in before crimbo! No, only joking, that’s a wrap for this year's Pact Open Source Almanac, pop your feet up, enjoy your puds and hope to see your name in the book next year.

Β· 6 min read

Happy November everyone! I'm sure holidays for most are fast approaching, and as it's the season for giving, we'll be sharing all the updates across the Pact community and giving you a heads-up about our latest webinar where you can see all of SmartBears open source tools in action, including yours truly, Pact.

OSS Updates​

  • Pact Compatibility Suite
  • Pact Reference
  • Pact PHP
  • Pact Python
  • Pact Broker Client
  • Pact MSW Adapter

Pact Compatibility Suite​

Tien Vo (Pact-PHP), and Josh Ellis (Pact-Python), have both been working on verifying their Pact client implementations against the new Pact Compatibility Suite.

It will help root out inconsistencies in implementations and ensure feature parity. If you are interested in checking it out, or contributing, please jump in. You can retrospectively apply the tests against existing implementations to ascertain their completeness/correctness.

This will be a massive boost to end users, so we would appreciate any help!

Pact Reference​

As Tien as been working through the compatibility suite, he has noted some improvements that can be made to the Pact-FFI, which would otherwise has been found sporadically usually through end-user issues.

Pact-PHP​

Tien brings more features to the ffi branch of pact-php

Pact Python​

Josh implemented the Pact (Consumer) Compatibility Suite (V1) in this PR utilizing the pact_ffi core, great steps in progress towards full specification compatibility, and that juicy V3 and V4 Pact Spec goodness, you Pythonista's have been waiting for.

Pact Broker Client​

Two new features arrive in the Pact-Broker Client.

  1. pact-broker publish PACT_DIRS_OR_FILES --auto-detect-version-properties
    1. When publishing Pacts, by setting --auto-detect-version-properties, you can now automatically detect the repository commit, branch and build URL from known CI environment variables or git CLI.
    2. Supports Buildkite, Circle CI, Travis CI, GitHub Actions, Jenkins, Hudson, AppVeyor, GitLab, CodeShip, Bitbucket and Azure DevOps.
    3. --auto-detect-version-properties is aliased to -r to ease of use
    4. The recent feature improvement introduces the detection of the commit and buildUrl, rather than only the branch, greatly simplifying our recommended Pact Nirvana workflows for users
  2. delete-branch
    1. Users now can delete branches from the CLI

Pact MSW Adapter​

Mock Service Worker (MSW) has fast been becoming the industry standard API mocking for JavaScript, we heard that cry, and created a project to help you leverage the contract testing goodness of Pact, with the power of MSW.

At the end of October, Artem, MSW's creator announced the launch of MSW v2.0, with a raft of changes to improve the life of end-users and plugin authors.

Not long after, Jakub Riedl from CultureAmp, long time friends of Pact, helped bring our adapter in line with MSW v2.0. You can check out the PR here. This is actually his third contribution to the adapter, which is awesome to see.

Not only that, Joel Whalen has been working on support for GraphQL, in the adapter. Already supported by MSW, this would allow for MSW gql interactions to generate Pact contracts. You can check out his progress here.

I also noted whilst I was npm surfing, a new pact-msw package has been launched, this isn't an officially supported version but it's always great to see people working with Pact in the wild, so it might be worth your time checking it out.

Maintainer Meets​

Want to help shape the future of Pact? Why not join us?

We catch up every week with alternating times for the sessions, to aid with syncing with Europe / Austrailian members

  • 9am-9:45am UTC
  • 9pm-9:45pm UTC

You can download a calender invite from our DevRel repository, see Pact Community Meeting.ics

A google document holds our agenda which is openly editable and where anyone can table ideas for discussion.

Pact in the wild​

Bazel + Pact​

We spoke with Olivier Picaud back in July, about the work he was doing with Bazel & Pact, and why it was so important, personally for him.

We have an update

Hello,

I have worked to associate Pact within Bazel by providing rules_pact The good news is that rules_pact has been accepted to be part of the official Bazel Central Registry

Happy to share this contribution with you guys and again thanks to help teams to facilitate their testing journey :)

VoilΓ  :)

Olivier

You can check out the GitHub repo https://github.com/opicaud/rules_pact and a full worked example in https://github.com/opicaud/monorepo

Community Events​

Are you hosting a Pact event? Let us know and we can feature it in the blog and list it on our events section.

Show and Tell: Discover the Benefits SmartBear’s Open-Source Tools Bring to the SDLC​

On Tuesday Dec 5th 2023 at 10am ET, the SmartBear Dev-Rel team will be showcasing OpenAPI, Swagger, Stoplight, Pact and SoapUI and how they can be used across your SDLC, along with tips, links and pointers on how to get involved with these open-source tools and communities.

You can register here, where if you can't make it, you'll be sent an recording for on-demand viewing.

Dec 5th OSS Webinar

Community Corner​

Omer Morad introduces Automock​

We spoke to Omer Morad back in June 2022, where he introduced NestJS-Pact into the Pact Foundation fold. We caught up with him this week, to find out what he's been up to.

Welcome Omer, we heard from you around a year ago in one of our community corner updates. I hear you’ve been working on a new open source project, would you like to tell our readers a little about it?

I've been working on Automock, an open-source mocking framework. Much of my time has been spent manually mocking for unit tests in dependency injection environments like NestJS. It may cause test suites to become unmanageably large and convoluted. For this reason, I made Automock. By creating mock objects for class dependencies automatically, it simplifies the unit testing procedure. Compatibility across multiple DI and testing frameworks will make the unit testing process easier by allowing developers to focus on writing test cases rather than manually configuring mock configurations.

Awesome! Thanks for sharing with us, hopefully this Automock is useful to others. You can find Omer in our Pact Slack group where you can talk about all things open source.

Thats a wrap​

That’s it for this month. Stay safe and carry on coding!

  • Yousaf Nabi β€” Developer Advocate at PactFlow and Community Shepherd at Pact.

Β· 9 min read

πŸ‘» Happy Halloween all! This month you can look forward to our round up of all things Pactober that happened this month to celebrate 10 years of Pact and the usual open-source updates from across the Pact ecosystem.

Pactober​

Your πŸ—ΊοΈ to the months events.

Pactober Workshops​

Want to learn more about Pact, how it works, and how you can get hands-on?

Watch one, or the series of workshops over on our YouTube channel & check out the supporting material

OSS Updates​

  • Pact Rust
  • Pact PHP
  • Pact Python
  • Pact Go
  • Pact Mock Service
  • Pact Broker

Pact PHP​

Tien Vo showcased the work he has been doing in Pact-PHP during our Pactober birthday bash, you can check it out πŸ“Ί here.

However if you just want to jump into the code, Tien has published a new release 10.0.0-alpha3

You can find lots of examples in the ffi branch showcasing the new functionality.

Check out the merged pull requests, for all the latest work to date, and the open pull requests for anything you can help review!

Pact Python​

Joshua Ellis said Hello World to the Pact community during our Pactober birthday bash, you can check it out πŸ“Ί here.

He has also been super busy in the world of Pact-Python where we've seen a hive of activity.

Josh published his first release, v2.1.0 which is the first to include pre-built wheels published to GitHub.

This release also drops support for Python 3.6 and 3.7, allowing for improvements to the build-system that will keep Pact-Python healthy and maintainable long into the future.

Josh is now working on implementing the FFI feature set, in order to deliver v3 and v4 Pact functionality to the Pact-Python project, which can be tracked in the following issue

If you want to get involved, why not reach out via the GitHub repo, or via #Pact-Python Slack channel.

You'll also notice new issue templates, and labelling across the project, which should hopefully make the triaging process slicker for everyone. Please feel free to try it out and give us feedback, good, bad or ugly!

Pact Go​

Stanislav Vodetskyi helped deliver both a fix and an enhancement to Pact-Go

Alex also managed to add a change to our v1 (Ruby-backed) pact-go implementation, which will help him out with running multiple pact verifiers in parallel.

Are you using Pact-Go v2? Fancy lending a hand updating the pact-go workshop, to use pact-go v2?

Let me know, and I'm sure I can dig up some swag!

Pact Mock Service​

As our Pact ruby ecosystem progressed onto Ruby 3.x, it allowed Pact-mock_service to be updated to provide compatibility with Rack 3.

This was kindly provided by provided in this PR via Adam Forsyth.

Pact Broker​

Ben Brugman made his first PR ever :hooray: - This one upgraded Supercronic, which is a core dependency in our Pact Broker Docker image.

Pact in the wild​

Sngular OSS presents PactBuilderDSL for Java users​

PactBuilderDSL is a Java library that automates the generation of DSL for bodies in contract definition.

Do you struggle with writing the body validations for contract testing? If you're working with Java... I'm pretty sure you do.

It's pretty common to have huge methods with very similar code to generate them.

This is a need the Sngular team have detected many times not only in the community but also with our clients.

If all this is familiar to you, and you're interested in learning more, watch their talk on πŸ“Ί PactBuilderDSL.

Itching to see the code? You can see it in their GitHub repo sngular/pact-annotation-processor and published to the Maven repository.

How we reached Pact Nirvana​

Nathan Deamer, long time friend and Pact advocate, works over at GoCity where he looks after a team of incredible engineers.

We remember Barry Irvine's post from February about his adventures with Pact & Android.

Nathan shows us Pact through a wider lense at GoCity, as he shows us how they reached Pact Nirvana. It's a great read and motivating if you are on your own Pact journey yourself.

Check it out here

Community Corner - Jo Laing​

If you have tuned in you the Pactober events, you'll probably be bored of my voice, so how about hearing from the lovely Jo Laing, your Pact community manager.

Hello Jo, without further ado, you’ve been getting to know the Pact community this year, how’s it all been going?

I can’t deny on being a little apprehensive having come from managing the Cucumber community group where I am super comfortable and familiar, so it was a relief when I realised this community was actually a very similar space and I even recognised some of the member names from the Cucumber community which has helped me join some dots between Cucumber/BDD and Pact/Contract Testing (win, win). Having the support of the amazing team at Pact has been a big bonus too. I’ve also had to face my fear of GitHub and am happy to say it’s honestly not as bad as I thought πŸ˜‰

Can you tell us anything about what’s coming up for the Pact community?

We’ve started hosting a weekly maintainers community meeting (Check out the open agenda here) which a few maintainers attend. I’d love to see more attendee’s at those meetings and foster those relationships to build a healthy core maintainer group.

GitHub triage is the next big focus for the group. Pact has many repositories so we need to do some housekeeping and get a process in place for managing those.

Looking forward to 2024, there will also be a focus on improving and sharing the educational material we have around Pact and contract testing to help guide people who are interested/starting out.

I’d also love to host more Fireside Chat type sessions too, as the session we held at Pactober was just getting juicy when we had to call time. Reach out to me if this appeals to you.

We worked together to deliver the Pactober event this month πŸ™Œ what were your highlights from the event?

Oh so many! Jamming with you on the organisation of the event was fun! I really enjoyed the freedom we had to manage the whole event end to end. Meeting the speakers was awesome too, what a lovely bunch of people. I’d like to give a big thanks and shout out to everyone from the community involved who helped deliver the event.

I’m excited to see what we can all collaborate on in the future.

Your role changed this year to Open Source Community Manager at SmartBear and you now have three open source communities to shepherd – how is that shaping up?

Yes, I’ve been set quite a challenge here! Alongside the Cucumber and Pact open source communities, I’ve also been tasked with trying to establish a new community group for another of SmartBear's open source tools, Swagger. Now the Pactober event is mostly wrapped up, I have more time to focus on the planning and setting up of whatever works for this group - so lots of outreach, asking, listening and experimenting with our Swagger users in order to shape up the right community setting. So much to do!

So much to do indeed Jo, thank you for taking the time to share with the readers! Couldn't have done this event without you, and looking forward to helping share some of the support, in your journey with the Swagger community and beyond.

Community Events​

Are you hosting a Pact event? Let us know and we can feature it in the blog and list it on our events section.

Thats a wrap​

That’s it for this month. Stay safe and carry on coding!

  • Yousaf Nabi β€” Developer Advocate at PactFlow and Community Shepherd at Pact.

Β· 11 min read

πŸ‘‹ Hello, it's September, and we are a week away from Pactober - A celebration of 10 years of Pact.

I'll be letting you know what you can look forward to, recapping this month's activities in our repos, and introducing a new starter to PactFlow, who is living the dream - getting to work on open-source - as their job. Feel inspired? Join us! We are always hiring.

Pactober​

We've been squirrelling away behind the scenes organising Pactober's main event on the 10th October and we are pleased to announce some of our stellar speakers.

Your links for reference:

Want to attend?

We will be providing links in Slack, but for all the latest updates, be sure to fill out our Pactober registration form

Speakers​

Just some of our fantastic line-up that you will hear from over the month.

Sam Newman​

J.B Rainsberger​

Seb Rose​

Bas Dijkstra​

Lewis Prescott​

Dave Farley​

Got something to say?​

Love Pact as much as Jameshd?

Why not shout about it, in whatever way suits you and we will be sure to feature it throughout Pactober’s Birthday session.

Ways you can do this

  • Fill out the Pactober registration form
  • Catch up with us in Slack
  • πŸ‘‹ Send a 30s video wishing Pact a happy birthday, telling us a short story, or a written message to either Matt Fellows, Jo Laing or I (Yousaf) and we'll ❀️ you forever
  • Find us in GitHub, in our DevRel repository

Pactober Builders​

During Pactober, we'd love to invite you to help build something on our roadmap, take part in a Bug-Bash or in our Doc-Drive.

Need some inspiration?

We've got plenty of requests on our Canny roadmap, and although many are not planned, you can see from the votes, as to how well received it may be from the community.

Alternatively, we can look at outstanding issues and PR's as they can often serve as a good source of inspiration, or things that can easily be sewn up.

Finally, don't forget to check out more ways you can help, https://docs.pact.io/contributing if any of these take your fancy?

You can find your fellow builders over in the #pactober-builders channel in Slack.

Pactober Workshops​

We already have a few Pact HTTP based workshops, in a few languages, listed here.

I'll be hosting four sessions throughout Pactober, walking users through the existing workshop, and running some all new ones in the process.

We will need to build out workshops for Message & Plugin Pact, and also our various existing workshops, could do with some love, to utilise the latest features and versions of not only Pact but the client language itself.

We would love any support in helping work on these, but if not, and you just fancy participating along with others during the workshops, then feel free to join me!

OSS Updates​

It has been another busy month in the world of Pact, I've pulled out some changes from the community to showcase in our latest round of Open Source updates.

  • PactFlow's New Starter, and what it means for you
    • Pact Python
  • Pact Rust
  • Pact PHP
  • Pact Plugins
  • Pact Broker
  • Pact Broker Client
  • Pact JS
  • Pact Broker Chart
  • Feature requests
    • Dont Massl the Hoff (Massl based authentication)

PactFlow's New Starter, and what it means for you​

We ❀️ open source. We created Pactflow because we wanted to create a sustainable avenue to work on open source projects, and solve big problems that benefit a global developer community. Instead of the train rides, late nights and weekends where most of our contributions previously originated, this would be our day job.

We said that back in 2021. It would be awesome to work on an open-source project, and get paid for it, as part of your job. For me, its a dream come true. We've wanted to share that opportunity with others, especially as Pact grows in popularity, and gaining active maintainers is a challenge for many an open-source project, even those much larger than our own. Just look at Curls contributor graph!

We also are actutely aware that some of our libraries are suffering from bit-rot, languishing whilst each client implementations native language comes out with new features, and additions, that could be utilised, and they are missing core Pact features, implemented in Rust but not delivered in the client library, which causes struggles in documentating a cohesive Pact experience, in your own multi-language/multi-protocol landscapes.

That being said, we are proud to be able to announce a new starter to the PactFlow family, and by default extension, the Pact Family, who will help alleviate some of that burden. Enter Josh.

Joshua Ellis​

We've been honoured to have Joshua Ellis enter the team, based in Australia, he will be working closely with Beth, Matt and Ron, and comes with a distinguished history, and open source background.

Joshua Ellis

I have an academic background in theoretical particle physics. I am the developer of the LaTeX package TikZ-Feynman to draw Feynman diagrams, and spent the majority of my PhD creating a Rust library to help solve Boltzmann equations to calculate the evolution of particle number densities during the Big Bang. I also did a one year stint in KPMG’s Data & Cloud team, helping architect and build cloud infrastructure, data pipelines, and helping new recruits get up to speed with DevOps and coding.

I'm a big fan of open source software and collaboration, and love to automate everything and anything; even if it sometimes takes me longer to automate the task than to actually do it πŸ˜… Outside of work, my wife and I love finding good food spots in Melbourne. We have a small rescue dog called Cooper (no idea what breed he is), and if I’m not at my computer, you’ll either find me cooking something (perhaps in my smoker), playing piano or trying to learn the cello, or getting a coffee.

So what will Josh be working on?

Proficient in Python and Rust, we will see him help bring Pact-Python up to modern standards, and implement Pact V4 functionality, in a production ready manner, rather than my hack it to get something working xD.

I have recently onboarded with SmartBear, and my focus to begin with will be the Python code. I'm looking forward to working with you all, and improving the Python code! In particular, I will be building upon the amazing work done in #367 to get pact-python working with the Rust core. As a bit of ground work, I have created two issues above to get my feet wet, before tackling the much larger task of supporting V4 fully.

In any case, please feel free to message me with any ideas, or just to say hi :blobwave:

Josh has been tackling the build system and examples for starters, check out the progress, and even better, why not drop us a review, he would love the feedback, and gives him a chance to connect with you all.

Long live Python, Long live pact, long live Pact-Python!

Love Pact? Want to join the team? Why not give us a shout!

Pact Rust​

We were meant to have done some rust stuff, but we've been too busy laughing at this interview with a senior rust developer

But seriously though, what's been happening?

Pact PHP​

Tien Vo has been busy again, bringing more features to the ffi branch

The last one could do with some eyes, and we would still love to know if you have tested this out. Please let us know in the #pact-php channel or via GitHub.

Pact Plugins​

Rohit G Krishnan has been trying out the Pact plugin framework, and raised a PR to fix a bug. Find it, fork it, fix it. The beauty of open-source! Thanks a bunch!

Pact Broker​

Beth introduced a branch endpoint, supporting GET & DELETE in this PR

Expect to see this extend into the Pact Broker client, to let you interrogate the Pact Broker for pacticipants by branch

Pact Broker Client​

Utilising the above change, was the Pact Broker client, for provider-contract publishing.

Whilst the above PR, and pactflow command, is for integrating with closed-source tool PactFlow, please be reminded that this can serve as a useful pointer for implementing your own provider driven contract flow, in an open source broker.

Check out an example repo https://github.com/pactflow/pactflow-jsonschema-example and supporting blog post https://pactflow.io/blog/contract-testing-using-json-schemas-and-open-api-part-2/

With a bit of tinkering, you can agument your workflows with https://github.com/pactflow/swagger-mock-validator, itself a fork of Atlassians original

I've been thinking about how we could potentially create an extendable mechanism, whereby users could provide their own provider schemes, for alternate sources, other than OpenAPI, such as AsyncAPI.

If this floats your boat, why not join us, as a Pactober builder, or just give us a shout.

Pact-JS​

Mat Dodgson delivered a fix: MessageConsumerPact merge pact file correctly

Pact Broker Chart​

Love Kubernetes and Helm?

Chris J Burns & Sherif Ayad have got your back.

Dont Massl the Hoff​

A feature request landed for Providing MASSL based auth support

This is to add the support on adding a 'cert' and a 'key', regarding a self-hosted Broker that requires a 'cert' and a 'key'. This will make the availability to call the 'Pact::VerificationTask' adding the 'cert' and 'key' to interact with the Self-Hosted Broker.

As an example: -

--cert /path/to/client/cert.pem --key /path/to/client/key.pem

NB:- - I don't think it will be cli opts, but rather environment variables, to match the existing conventions for using TLS

PR's

Thanks to LluΓ­s Xavier Casals Garcia for raising and Gerald Molina for the PR's

Pact in the wild​

Open edX​

Open edX is a community-driven, open-source project powering edX.org and thousands of other online education sites around the world.

We couldn't be more proud to see they are using Pact in their projects, and have written a brilliant post for their engineers. You can read it here

It also features Dawoud Sheraz, who we mentioned earlier in the year about his talk at Python Web Conf. The video is referenced in the above post, but you can watch it here

GitLab​

GitLab are using Pact and have written some great documentation to support its use in their project.

If you haven't tried about GitLab, why not look at testing it out, you can run the community edition for free, on your local machine, see the existing Pact tests (and run them) for yourself.

Community Events​

Are you hosting events about Pact? Why not let us know?

We can't wait for you to get involved, whether you attend one of the sessions throughout the month of Pactober, or you decide to host something yourself. Long live Pact and its awesome community!

Dont forget that throughout October, we will be providing links in Slack, but for all the latest updates, be sure to fill out our Pactober registration form

Thats a wrap​

That’s it for this month. Stay safe and carry on coding!

  • Yousaf Nabi β€” Developer Advocate at PactFlow and Community Shepherd at Pact.

Β· 7 min read

πŸ‘‹ Hello, its August, hope you've had a great summer so far, and enjoyed a nice well-deserved break.

However if you've been in the office, not worrying about your deployments because you use Pact, huzzah.

Whatever you've been up to, the community has been busy as well, so we've rounded up some of the latest happenings in the world of Pact to sink your teeth into.

OSS Updates​

It has been another busy month in the world of Pact, I've pulled out some changes from the changes from community to showcase in our latest round of Open Source updates.

  • Pact Docs
  • Pact Getting started
  • Pact Go
  • Pact Broker
  • Pact Rust
  • Pact JVM
  • Pact Ruby
  • Pact Python
  • Pact PHP
  • Pact Erlang
  • Pact CLI Tooling

Pact Docs​

MUnit (Mule4) with Pact Recipe​

Are you an MuleSoft user running MUnit? If so, check out the latest recipe on our site, kindly provided by Grace Sandford!

Got something you want to share? Why not drop in a pull request. You can find out ways you can help here

Pact Getting Started​

Our Pact getting started guide has been updated to the latest pact-js version, which prepackages the pact ffi runtime, meaning it will be even easier for users with only a current version of node to get up and running.

https://github.com/pact-foundation/pact-5-minute-getting-started-guide

Fancy creating one in your favourite Pact client language? What's stopping you?

Pact-Go​

Thanks Boreyuk for picking up this golintci task in the following pull request

A great quality of life improvement for maintainers and contributors of pact-go, and a better user experience, with some of the changes made.

It just goes to show that not all improvements need to be big, and you can drop in and help out maintainers anywhere. If you don't know where to start, just ask!

Pact-Broker​

Beth making us all laugh again with this comment whilst she took some time out on cold Aussie Saturday arvo to bust out a beast of a feature, improving performance of the matrix when multiple selectors are specified.

Pact Rust​

Beth did Rust!

https://github.com/pact-foundation/pact-reference/pull/312

Looking to improve on the error messages returned in various scenarios during provider verification.

Why not hop into Slack or GitHub and let us know what would be on your wish list, to help you when it goes wrong.

Pact-JVM​

  • The maintainer of Kotlin-Logging Osad Shai, dropped in and upgraded his library in Pact-JVM in this PR. It's awesome to see some real-world testing from a package maintainer, I like doing the same when I am fixing up open source projects. The best subjects are the one's already using your libraries. It is also why I get stoked to see public repos showcasing Pact.

  • Victor Enaud spotted a bug in Pact-JVM, applied a fix which ultimately was rejected in favour of another solution, but we are super grateful for both the excellent report, and an attempted solution!

Pact-Ruby​

Pact-Python​

Checkout a sample of the PactV3 interface, powered by the Pact FFI in the following pull request

You can also find more V3 examples here and a grpc example here

I'm inviting Pythonistas who are itching for that V3 and V4 functionality to collaborate with me on the aforementioned PR to help bring your Python projects up to speed with all the latest pact features.

"""pact test for product service client"""

import logging
import os

import pytest
from pact import PactV3
from pact.ffi.native_mock_server import MockServerStatus
from pact.matchers_v3 import Like, Format
from src.consumer import ProductConsumer

log = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)
print(Format().__dict__)

PACT_MOCK_HOST = '127.0.0.1'
PACT_MOCK_PORT = 8888
PACT_DIR = os.path.dirname(os.path.realpath(__file__))


@pytest.fixture
def consumer():
Β  Β  return ProductConsumer(
Β  Β  Β  Β  'http://{host}:{port}'
Β  Β  Β  Β  .format(host=PACT_MOCK_HOST, port=PACT_MOCK_PORT)
Β  Β  )


@pytest.fixture(scope='session')
def pact(request):
Β  Β  pact = PactV3(
Β  Β  Β  Β  'pactflow-example-consumer-python-v3',
Β  Β  Β  Β  'pactflow-example-provider-python-v3',
Β  Β  Β  Β  hostname=PACT_MOCK_HOST,
Β  Β  Β  Β  port=PACT_MOCK_PORT,
Β  Β  Β  Β  pact_dir="./pacts",
Β  Β  )

Β  Β  return pact

def test_get_product(pact: PactV3, consumer):
Β  Β  expected = {
Β  Β  Β  Β  'id': "27",
Β  Β  Β  Β  'name': 'Margharita',
Β  Β  Β  Β  'type': 'Pizza'
Β  Β  }

Β  Β  (pact
Β  Β  Β .new_http_interaction('interaction')
Β  Β  Β .given('a product with ID 10 exists')
Β  Β  Β .upon_receiving('a request to get a product')
Β  Β  Β .with_request('GET', '/product/10')
Β  Β  Β .will_respond_with(200, body=Like(expected), headers=[{"name": 'content-type', "value": 'application/json'}]))

Β  Β  with pact:
Β  Β  Β  Β  pact.start_service()
Β  Β  Β  Β  user = consumer.get_product('10')
Β  Β  Β  Β  assert user.name == 'Margharita'
Β  Β  Β  Β  result = pact.verify()
Β  Β  Β  Β  assert MockServerStatus(result.return_code) == MockServerStatus.SUCCESS

Pact-PHP​

Tien Vo has been working hard in the pact-php ffi branch, introducing an auto-installing plugins feature in this PR.

You can pick this up in the latest alpha from packagist. See the release here

Have you tried this out in your project? Why not let us know in #pact-php in Slack.

Pact-Erlang​

Srijan Choudhary announced pact_erlang version 0.2.0 has been released with the new map-based DSL: https://github.com/greyorange-labs/pact_erlang

PactRef = pact:v4(<<"myapp">>, <<"animal_service">>),
AnimalObject = #{<<"name">> => <<"Mary">>, <<"type">> => <<"alligator">>},
{ok, Port} = pact:interaction(PactRef,
#{
Β  Β  given => <<"an alligator with the name Mary exists">>,
Β  Β  upon_receiving => <<"a request to GET an animal: Mary">>,
Β  Β  with_request => #{
Β  Β  Β  Β  method => <<"GET">>,
Β  Β  Β  Β  path => <<"/animals/Mary">>
Β  Β  },
Β  Β  will_respond_with => #{
Β  Β  Β  Β  status => 200,
Β  Β  Β  Β  headers => #{
Β  Β  Β  Β  Β  Β  <<"Content-Type">> => <<"application/json">>
Β  Β  Β  Β  },
Β  Β  Β  Β  body => thoas:encode(AnimalObject)
Β  Β  }
}),
?assertMatch({ok, AnimalObject}, animal_service_interface:get_animal(Port, "Mary")),
{ok, matched} = pact:verify(PactRef),
pact:write(PactRef, <<"./pacts">>),
pact:cleanup(PactRef).

Pact CLI tooling​

Would you want to see all our pact CLI tooling, in a single place?

Is file size a concern to you?

I had a go at a consolidated bundle of our ruby/rust tooling, to aid migration.

Why not take a look at this PR and let us know your thoughts?

What about getting them all in a single file? :O

Hop onto Slack, or drop us a message in GitHub and provide your input!

Community Events​

Are you hosting events about Pact? Why not let us know?

DevOps Playground: Get hands-on with Pact, Mule 4 and MUnit (London) - August 31, 2023​

The DevOps Playground meetup event is hosting another event showcasing Pact at the end of August.

https://www.meetup.com/devopsplayground/events/295147445/

You can check out the one they performed last year Pact-NET and dotnet.

Youtube: https://www.youtube.com/watch?v=VDigIOV7lzM

How to avoid common pitfalls with modern microservices testing (Boston,MA) - September 14, 2023​

Eric Deandrea who has been touring the conference circuit this year, is on fire and hosting a meeting local at his local Java Users Group about Pact & contract testing with Quarkus.

If your based in Boston, MA, you should pop over.

https://www.meetup.com/nejug1/events/294642505/

Pacto - A blast from the past​

Have you ever heard of Pacto?

Nope, that's not a typo, Pacto is another Ruby implementation of a library that provides a mock service and provider verification using consumer driven contracts, originally cooked up at ThoughtWorks.

It's now fallen out of maintenance, but many of our long-standing community contributors both remember and tip our hats to Pacto and its champions, for helping raise contract-testing awareness.

Marthinus Engelbrecht updated our docs to reflect this in this PR

Pactober​

We've been squirrelling away organising an awesome lineup for Pactober's main event on the 10th October. You can see the updated pages in the below links.

Add your own event!

We can't wait for you to get involved, whether you attend one of the sessions throughout the month, or you decide to host something yourself. Long live Pact and its awesome community!

Thats a wrap​

That’s it for this month. Stay safe and carry on coding!

  • Yousaf Nabi β€” Developer Advocate at PactFlow and Community Shepherd at Pact.

Β· 12 min read

πŸ‘‹ Hello, its July, it's scorching so I hope you've got an ice cream to accompany you this episode or maybe a brolly if you are stuck in a rain-shower!

For the keener of our readers, you may note we missed our June episode. I was on holiday ( a rare treat! ) which was spent mainly away from the keyboard, with the exception of a little flurry in pact-python.

Never fear, a double-dose of Pact Open Source updates are here!

OSS Updates​

It has been a busy two months in the world of Pact, read on for updates on

  • Pact Docs
  • Pact Reference
  • Pact Net
  • Pact Go
  • Pact JS
  • Jest Pact
  • NestJS Pact
  • Pact Broker
  • Pact Python
  • Pact PHP
  • Pact in the community

Pact Docs​

The path to Pact Nirvana guide is now updated to cover

  • Branches
  • Recording Deployments
  • can-i-deploy --to-environment
  • contract_requiring_verification_published webhook
  • New diagrams courtesy of MermaidJS

Want to see can-i-merge functionality incorporated into the broker? Vote on this feature request

Pact-Reference​

A raft of bug-fixes and features have been applied across the pact-reference project.

Features

Fixes

Latest Releases

Pact-Net​

The PactNet 5.0 RFC is complete with PactNet 5.0.0.beta.1 now released.

This bring in the ability to generate V4 Specification Pact's using the same API as V3 sync and async pacts and utilise combined pact files for both http and message based interactions. This removes the limitation requiring services which comprise of both http and message-based interactions to be named differently.

See the migration guide for upgrading to PactNet 5.x

Pact-Go​

Pact-Go V2 has officially been released, following an extended beta period. We are very grateful to our many early users who provided invaluable feedback.

You can check out the full release notes here

and for those migrating from v1, you can check out the migration guide here

This update replaces the pact-ruby core, with the pact-rust core, utilized through the pact_ffi library, bringing support for V3 and V4 Pact specifications and the ability to load pact-plugins to extend the capabilities of pact-go.

  • Supported platforms.
    • Linux x86_64 / arm64
    • MacOS x86_64 / arm64
    • Windows x86_64

Please note that Alpine Linux is not supported at this time.

New Features​

Pact-JS​

JavaScripters/TypeScripters/Nodemads

We listened to our community, who struggled with requiring python to install pact-js in order to get at that lovely rust pact-core functionality in pact-js v10 & v11 and pact-js-core v13

You can now find they both come fully charged with batteries included, meaning that supported platforms can use pact js v12 and pact-js-core v14 with --ignore-scripts true and no additional install time build requirements

In addition, the new releases now support versions of Node 16 and greater, CI testing has been dropped for earlier versions, and we explicitly set the engines value in the package.json of both pact-js and pact-js-core to honour this restriction. We would advise updating your projects to an in support LTS version, (Node 18 LTS is probably most sensible at this point and node 16 is due to EOL on 11th Sept 2023)

New Features​

  • Support for eachKey and eachValue matchers has been added to pact-js via pull #1303 which closes issue #952

Jest-Pact​

Updated to reference peer-dep of pact-js 12.x

NestJs-Pact​

Updated to reference peer-dep of pact-js 11.x and nest-js 10.x

Pact-Broker​

Pagination support was added via pull #622

You can find the current documentation and supported endpoints here

A few performance enhancements were made at the same time.

Pact-Python​

Pact-Python 2.0.0 has been released

  • What does it contain?
    • ARM64 for both Linux & MacOS is now natively supported by Pact Python
    • Linux Support for x86 platforms (32-bit) has been dropped
    • The ruby standalone now runs the latest ruby 3.2.2 (big bump - from a deprecated Ruby 2.4)
    • Plus a few other fixes and enhancements from the community and maintainers.
  • Release notes
  • PyPi Release

Whats next for Pact-Python?

Pact-PHP​

Pact-PHP 9.0.0 has been released

  • What does it contain?
    • ARM64 for both Linux & MacOS is now natively supported by Pact PHP
    • Linux Support for x86 platforms (32-bit) has been dropped
    • The ruby standalone now runs the latest ruby 3.2.2 (big bump from a deprecated Ruby 2.4)
    • Plus a few other fixes and enhancements from the community and maintainers.
    • The CI Pipeline has dependabot hooked up, to ensure our dependencies stay up to date
    • Release documentation has been added to aid future maintainers
    • Support for PHP 7.4 has been dropped. You should be on 8 by now though, surely
  • Release Notes
  • Packagist Release

Whats next for Pact-PHP?

Oh Hi FFI :blobwave:

#326 Support for V3 / V4 + Plugins Via FFI

What is the current status​

Pact-PHP does not currently support v3+ features of the rust core, in the mainline branch.

V3+ features are now available for beta testing in ffi branch, in a view to stabilise and release into the mainline.

We would <3 your support

How can I test this today​

Anyone can start testing pact-php with pact_ffi code by updating their composer.json

"pact-foundation/pact-php": "dev-ffi as 10.0.0"

How can I submit feedback​

All feedback is gratefully received, positive feedback is great, as it allows us to ascertain how well the package is doing for users. Constructive criticism is okay too, but see the next section

  • Reply in this issue
  • Raise a new issue, clearly stating you are using the ffi branch

How can I contribute​

If you want to help improve Pact-PHP, read the DEVELOPING.md documentation, fork the repo and have a play!

Pact in the community​

Pact-graph-network​

We mentioned Guillaume Camus's pact-graph-network tool back in December. It's just been updated to support multiple target architectures, and now supports authentication mechanisms whether you have a basic auth protected Pact Broker, or a Bearer token protected PactFlow Broker.

So what are waiting for? Go forth and generate some broker charts, and why not share us your graphs via https://twitter.com/@pact_up or pact-slack.

Hello Jo​

I imagine you've heard of Cucumber, the testing tool, not the veggie, If not, Cucumber is a tool for running automated acceptance tests guided by a technique called BDD (Behaviour-Driven Development), written in plain language called Gherkin. It has strong overlaps with our principles of contract testing and the Pact DSL, and is often part of a development teams tool-set alongside Pact for developing robust, quality systems. The similarities don't end there, it also has a thriving community which has been spearheaded by Jo Laing, across Slack and in many events across the globe.

That leads us nicely into what has Jo been up to this week!

Jo volunteered at AgileConf Scotland, where she was tasked with speaker support duties for a workshop.

A principles-based approach to create test automation strategies that work at scale, hosted by none other than Antonello Caboni (a Pact community speaker) & Nicola Sedgwick (a former CukenFest speaker). It's a smΓΆl ol' world.

The penny dropped as slides for contact testing appeared and Jo had to declare her new role in the Pact community.

jo_anton_agilescotland


So that leads me to announce to you, that I have the pleasure of inviting her to join me in my role as community shepherd, and know she will be helping to bring some organisation to the fold, including things like maintainer sessions and training, she has worked on the Cucumber school which is an incredible free resource to help those learn about BDD, I would ❀️ a Pact School - if such a thing would float users boats.

Community Corner - Olivier Picaud​

Autonomy within development teams is really valuable, tied with standardisation and goverance in an organisation, it can empower your teams. However it isn't all roses, it can also lead to fragmented tooling across the landscape, especially when developing microservice-based architectures in the dream of multiple protocols and languages all working in harmony. The landscape is always moving quickly but we are going to shine the spotlight on how open-source, both in terms of its tools, its users and contributors are helping to push things forward.

gRPC makes it easier to build high-performance microservices by providing generated service entrypoints in a variety of different languages. Bazel complements these efforts with a capable and fast polyglot build environment. Pact now offers the ability to test gRPC services via its extensible plugin mechanism, and it complements both gRPC and Bazel well, affording engineers the confidence to build applications in a stable repeatable manner, all whilst gaining that rich feedback from contract-testing.

We caught up with Olivier Picaud, who felt the draw, and utilised the power of open-source not only to power his journey of learning, but to share his progress, so that others can follow along. You can find his pull request showcasing his work here

Olivier Picaud

To learn monorepos, i put in place some grpc microservices using pact to validate interactions. Also, to facilitate the monorepo building, i am using Bazel and so i "bazelify" protobuf-plugin and pact-reference to get a >pact_verifier_cli and protobuf-plugin compiled from source --> Today, local consumer/provider testing is working well.

From Docker (and then from Kubernetes) i am trying to use the image you provide https://hub.docker.com/r/you54f/pact_verifier_cli, with the addition of protobuf-plugin from Bazel :) (still currently in dev)

EDIT1: Docker is not used anymore, it has been replaced by OCI images

EDIT2: Tests are not running from Docker images anymore, but directly from the build via pact_verifier_cli and pact-protobuf-plugins. To ensure a deterministic build, pact_verifier_cli and pact-protobuf-plugin are compiled "just in time" during build process (or use cache if already built).

EDIT3: Idea for the community : providing a "rules_pact" Bazel rule --> to use directly Pact from Bazel projects with pact_verifier_cli and other Pact tools as embedded toolchains ?

See here:

What I learned and still learning is :

  • improving cohesion of teams by pulling them in a monorepo structure
  • improving local development and determinism by providing one tool and the necessary toolchains for different platforms coming with the monorepo --> pact-reference and pact-protobuf-plugin was "bazelifed" for this purpose
  • optimizing test strategy (and notably with pact-grpc) to provide enough confidence to just run health checks when products are deployed. providing an unique pipeline to build / test / release and deploy using gitops magic monorepo's components in less than 10 minutes to accelerate feedback (incremental builds are amazed for this purpose)
  • I am currently migrating to bazel 6.0 because they use a new way of dealing with dependencies and then i will need to realign my fork to your master to pull out few updates that you made guys :) and then continuing to provide an end-to-end flow (i do not have an cli for instance to "play" with the entire product)

It's also very nice to participate to the community, i've participate to few others bazel-project by testing PR, providing feedback and red tests :)

Thanks Olivier for taking the time to share with us. It's exciting to hear about pull requests dropping in other areas outside of Pact as part of this effort. I hope this empowers others to take on journeys of discovery through code, through collaboration, as that is how our open source ecosystem is enriched.

Are you using Bazel in your organisation? Are you building tooling on top of pact-reference? Why not let us know! We could bring it into the codebase as part of an external builds directory as suggested by Ron so don't by shy!

Pactober​

Celebrating Pact's 10 Year Milestone

2023 marks 10 years of Pact Open Source. To celebrate, during the month of October – which we’ve coined Pactober – we’re facilitating community events across the globe to celebrate and acknowledge the journey and look forward to the future of Pact.

Be sure to bookmark our Pactober event page where you can register to keep up to date, or to join us in hosting an event. We want to bring you all in to the celebrations, and help bring more contributors to the Pact family and help it live for another 10 years and beyond

Thats a wrap​

That’s it for this month. Stay safe and carry on coding!

  • Yousaf Nabi β€” Developer Advocate at PactFlow and Community Shepherd at Pact.

Β· 9 min read

It's May, the sunshine β˜€οΈ is upon us, and you might be reading this in the park 🏞️. If you are, watch out, theres a cyclist 🚴coming. πŸ›ŽοΈ πŸ›ŽοΈ

Phew, that was close. Right, well now we are sorted, we've got some goodies lined up for this month, as the city of open-source never sleeps.

OSS Updates​

Pact-Net​

Repo Slack

V4 of Pact-Net is about to support V4 of the Pact-Specification.

The OCD gods have been appeased. You can all rest easy now, thanks to Adam Rodger.

Pact-PHP​

  • pact-php ffi-dev branch
    • Tien Vo has been working hard on ffi support in pact-php and we are grateful to have had a couple more reviewers join the party. We've wanted to make it easier to consume, for beta testing, in order to get feedback from users, who may be more familiar in their own codebase, than pact-php's. You can read more details about it in this PR on how you can get involved.

Pact-Python​

  • pact-python has put out a deprecation notice, noting that CI testing will soon be switched off for Python 3.6.
    • You can check the Python EOL dates and get prepared. 3.7 will be dropping support shortly, so you might as well take the time to jump up to 3.11 whilst you are there.

Pact-JS​

  • pact-js & pact-js-core have put out deprecation notices, noting that CI testing will soon be switched off for Node 14.
    • You can check the Node EOL dates and get prepared. 16 will be dropping support shortly, so you might as well take the time to jump up to 18 which is the latest LTS but also check that you are compatible with 20, the upcoming LTS
  • pact-js-core will soon come will batteries included - PR
    • All supported platform/arch combo's for libpact_ffi will come pre-packaged in pact-js-core and pact-js, this means users will be able to
    • npm install @pact-foundation/pact --ignore-scripts
    • Not require a full developer tool-chain included Python to run node-gyp in order to generate the required node bindings. We'll do the grunt work, so you don't have to.

Pact-Broker​

pulls stars

As the Pact-Broker nears its birthday, it decided that it better get ready. You'll now find the latest pact_broker and pact_broker-docker projects have been upgrades to support Ruby 3.2, and pact_broker-docker now comes in the following flavours via this PR.

size: amd64 size: arm64 size: arm

New Tagging Format​

On 3 May 2023, the format of the docker tag changed from starting with the Pact Broker gem version (2.107.0.1), to ending with the Pact Broker gem version (2.107.1-pactbroker2.107.1). Read about the new versioning scheme here.

Docker Multi-Arch Info​

You'll be able to pull multi-arch builds for arm/arm64 machines soon, by adding the -multi flag to your pact_broker tag.

By default, vanilla tags, are built only for amd64

docker run --platform=linux/amd64 --rm -it --entrypoint /bin/sh pactfoundation/pact-broker:latest -c 'uname -sm'

returns

Linux x86_64

We need some binfmt emulators, to run multi-arch. - Thanks to tonistiigi for his project.

Note: You only need the binfmt emulators, if you plan on running a non-native image. Unless you are testing, you wouldn't normally want to do this :)

docker run --privileged --rm tonistiigi/binfmt --install all

We can now run multi-arch images

docker run --platform=linux/arm64 --rm -it --entrypoint /bin/sh pactfoundation/pact-broker:latest-multi -c 'uname -sm'
docker run --platform=linux/amd64 --rm -it --entrypoint /bin/sh pactfoundation/pact-broker:latest-multi -c 'uname -sm'
docker run --platform=linux/arm/v7 --rm -it --entrypoint /bin/sh pactfoundation/pact-broker:latest-multi -c 'uname -sm'

returns

Linux aarch64
Linux x86_64
Linux armv7l

Armageddon - Go Forth and multi-manifest​

info

Why not drop into your favourite repo, and see if you can help them build multi-platform images, it's simpler than you might think.

Prepare your docker builder

docker buildx create --platform linux/arm64,linux/arm/v8,linux/amd64 --name multi_arch_builder
docker buildx use multi_arch_builder

Building your own multi-arch images

Note: (this will push the multi-manifest image to Dockerhub), remove push=true if you don't want to.

  • Replace DOCKER_IMAGE_ORG_AND_NAME & TAG with your required values
docker buildx build --platform=linux/amd64,linux/arm64,linux/arm \
--output=type=image,push=true \
-t ${DOCKER_IMAGE_ORG_AND_NAME}:${TAG} .

Pact-Ruby-Cli​

pulls stars

Not to be outshone, by the Pact Broker Docker, Pact Ruby Cli now comes in the following flavours

size: amd64 size: arm64 size: arm

New Tagging Format​

On 23rd May 2023, introduced in this PR , the format of the docker tag changed from ending with the Pact Cli Gem version (0.51.0.4), where .4 noted a change to the one of the packaged gems, to ending with the Pact Cli gem version (0.52.0-pactcli0.52.0). Read about the new versioning scheme here.

Alpine 3.18 & Ruby 3.2.2​

Alpine 3.18 is out, and Pact-Ruby-Cli is now up to date

Pact-Ruby-Standalone​

pact-ruby-standalone 2.0.1 is out!

but most importantly, the latest Ruby runtime, and native arm64 architecture.

Supported Platforms​

Ruby is not required on the host platform, Ruby 3.2.2 is provided in the distributable.

OSRubyArchitectureSupported
MacOS3.2.2x86_64βœ…
MacOS3.2.2aarch64 (arm64)βœ…
Linux3.2.2x86_64βœ…
Linux3.2.2aarch64 (arm64)βœ…
Windows3.2.2x86_64βœ…
Windows3.2.2x86βœ…
Windows3.2.2aarch64 (arm64)🚧

🚧 - Tested under emulation mode x86 / x86_64 in Windows on ARM

You'll see the roll out of improved CLI documentation on our main site, more distribution methods and a slicker experience overall soon.

Pact FFI​

Pact Plugins​

Pact Erlang​

Oh yeah, you heard that right!

With thanks to community contributor Priyaranjan Mudliar, Pact-Erlang is alive.

It describes itself as

An OTP library for contract testing using pact and generating consumer pacts

and is proudly using the new Pact Rust core, via the FFI. We've been pleased to help guide Priyaranjan along the journey, its a first pass and doesn't contain a full feature-set. Be sure to drop him a ⭐ on his repo to show your support, and even better, if your an Erlang user, why not give it a go.

Check out the repo here https://github.com/silverblaze404/pact-erlang

Pact Broker Client​

Cucumber community contributor David Goss paid us a visit and dropped a fix in whilst he was there.

If you are like Homer and often leave a trailing slash on your PACT_BROKER_BASE_URL or --broker-base-url values, consider yourself sorted.

You may notice some improved next steps when publishing provider contracts, and highlighted URL's, hopefully indicating to the user, useful next steps.

We hope this helps, please try it out and let us know!

Pact Ecosystems​

I've been introducing a fellow Dev Rel colleague to the history of Pact and vastness of the estate. We've been working through a few things, so we thought it would be awesome to share some of the outcomes so far.

Aim​

  • Identify all Ruby codebases which need updating to Ruby 3.1 or higher
  • Identify all consumers of ruby codebases
  • Document "Rube Goldberg" machine for
    • Pact Ruby Reference Core as referenced here in the dependency graph of doom
    • Pact Rust Reference Core
  • Update to at least, Ruby 3.1, preferably Ruby 3.2 across all affected repos
  • Update all affected repos
  • Test all affected repos

Why?​

  • Users of our pact-ruby-standalone project, have been stuck on a packaged Ruby 2.4 run-time due to the build system traveling-ruby, being out-of-maintainence. It has been revived by your very own Devo Avo, into the 21st century with
    • Update to Ruby 3.1.2 & 3.2.2
    • Support for Arm64 Darwin
    • Support for Aarch64 Linux
    • Support for x86 and x64 windows

Rube Goldberg​

Beth often refers to the Ruby Goldberg machine, in a nod to Rube Goldberg.

image

Wondered what it looks like?

You can see our newly published Pact Ecosystem page here

Pacticipate in our Ecosystem​

Sorry Beth!

Did you know, we've used many CI systems here at Pact, now using GitHub Actions extensively, after migrating from Travis CI when they stopped being so friendly towards open-sourcerers. That has been great for x86_64 / Intel Architectures, but we've had a missing link, namely Arm64/Aarch64 architecture, for those of use with shiny new Macs, or perhaps using some cheaper cloud hardware like AWS Graviton's or Oracle clouds free tier offering.

We've documented some details about our CI systems in a new contributing page, on our docs site, you can check them out here

did you know?

You can drop into any repository with a .github/workflows/*.yml or .cirrus.yml file and run the CI systems workflows ephemerally on your own machine.

πŸ±β€πŸ’» Local Machine - GitHub Actions​

  1. Download Act
  2. Download Docker (or Podman)

Linux workflows​

act --container-architecture linux/amd64

πŸ±β€πŸ’» Local Machine - Cirrus CLI​

  1. Download Cirrus CLI
  2. Download Docker (or Podman)
  3. If on an arm64 mac, download tart.run

Linux or MacOS workflows​

cirrus run --output github-actions

Community Corner - Adam Cox​

Adam Cox

If you've been around our GitHub repos or Slack, over the last couple of months, you can be sure to have seen Adam Cox's name pop up.

Well this month, we have an absolute treat. We have the pleasure of opening a new community corner section on our site, dedicated to your voice.

We are equally as honoured to help the community put a name to the face, as we speak to Adam Cox about his journey at Sky, from introducing Pact to the team, to adventures with embedded devices, websockets, and how the Pact Plugin framework is helping them push the envelope.

Be sure to check it our here

Thats a wrap​

That’s it for this month. Stay safe and carry on coding!

  • Yousaf Nabi β€” Developer Advocate at PactFlow and Community Shepherd at Pact.