Skip to content

Commit 79a297a

Browse files
authored
Automate and document release process for Rust, Python, Wireshark, and Zeek components (#248)
* Separate release tags * Add python app release * Add checkout action before creating a release * Fix prefix in release creation action * Filter triggering paths * Use conventional directory name in release archive * Add release process section to documentation * Update release asset names in documentation * Add release instructions to component specific documentation
1 parent 2d64fc4 commit 79a297a

File tree

11 files changed

+168
-29
lines changed

11 files changed

+168
-29
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
name: Python - Release
2+
3+
on:
4+
push:
5+
tags:
6+
- python-v[0-9]+.*
7+
8+
jobs:
9+
release:
10+
runs-on: ubuntu-latest
11+
env:
12+
DISTDIR: ja4-${{ github.ref_name }}
13+
DISTFILE: ja4-${{ github.ref_name }}.tar.gz
14+
steps:
15+
- name: checkout
16+
uses: actions/checkout@v4
17+
- name: create archive
18+
run: tar -czf "$DISTFILE" --transform="s,^python,${DISTDIR}," python
19+
- name: create release
20+
env:
21+
GH_TOKEN: ${{ github.token }}
22+
run: gh release create ${{ github.ref_name }} $DISTFILE

.github/workflows/rust-check.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,12 @@ permissions:
1111
on:
1212
push:
1313
branches: [main]
14+
paths:
15+
- '.github/workflows/rust-check.yml'
16+
- 'rust/**'
1417
pull_request:
1518
paths:
19+
- '.github/workflows/rust-check.yml'
1620
- 'rust/**'
1721

1822
concurrency:

.github/workflows/rust-release.yml

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
name: Rust - Release
22

33
on:
4+
push:
5+
tags:
6+
- rust-v[0-9]+.*
47
workflow_dispatch:
58
inputs:
69
tag:
710
description: 'Tag to build release binaries for'
811
required: true
912
type: string
10-
push:
11-
tags:
12-
- v[0-9]+.*
13-
release:
14-
types: [created]
1513

1614
concurrency:
1715
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
@@ -32,6 +30,7 @@ jobs:
3230
changelog: rust/CHANGELOG.md
3331
token: ${{ secrets.GITHUB_TOKEN }}
3432
allow-missing-changelog: true
33+
prefix: rust-
3534

3635
build-and-upload:
3736
name: ${{ matrix.job.target }}
@@ -58,7 +57,7 @@ jobs:
5857
shell: bash
5958
run: |
6059
is_release=false
61-
if [[ $GITHUB_REF =~ ^refs/tags/v[0-9].* ]]; then
60+
if [[ $GITHUB_REF =~ ^refs/tags/rust-v[0-9].* ]]; then
6261
is_release=true
6362
fi
6463
echo "is_release=$is_release" >> $GITHUB_OUTPUT

.github/workflows/rust-test.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,13 @@ permissions:
1111
on:
1212
push:
1313
branches: [main]
14+
paths:
15+
- '.github/workflows/rust-test.yml'
16+
- 'rust/**'
1417
pull_request:
18+
paths:
19+
- '.github/workflows/rust-test.yml'
20+
- 'rust/**'
1521

1622
concurrency:
1723
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}

.github/workflows/wireshark-release.yml

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
name: Wireshark - Release
2+
23
on:
34
push:
4-
branches: [main]
5-
paths: [wireshark/*, wireshark/source/*, wireshark/build-scripts/*]
6-
workflow_dispatch:
5+
tags:
6+
- wireshark-v[0-9]+.*
77

88
jobs:
99
wireshark-linux:
@@ -99,14 +99,16 @@ jobs:
9999
runs-on: ubuntu-latest
100100
needs: [ wireshark-linux, wireshark-macos, wireshark-windows ]
101101
steps:
102-
- name: set env
103-
run: echo "NOW=$(date +'%Y.%m.%d.%M')" >> $GITHUB_ENV
102+
- uses: actions/checkout@v4
104103
- name: download-artifacts
105104
uses: actions/download-artifact@v4
105+
with:
106+
pattern: '*-ja4'
107+
merge-multiple: true
108+
path: ja4
106109
- name: list files
107-
run: ls -al
110+
run: ls -alR
108111
- name: release
109112
env:
110113
GH_TOKEN: ${{ github.token }}
111-
GH_REPO: ${{ github.repository }}
112-
run: gh release create ja4-wireshark-plugins-${{ env.NOW }} linux-ja4/ja4.so.linux macos-ja4/ja4.so.macos windows-ja4/ja4.dll
114+
run: gh release create ${{ github.ref_name }} ja4/*

.github/workflows/wireshark-test.yml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@ name: Wireshark - Test
22

33
on:
44
push:
5+
branches: [main]
56
paths:
6-
- .github/workflows/wireshark-test.yml
7-
- wireshark/**
7+
- '.github/workflows/wireshark-test.yml'
8+
- 'wireshark/**'
89
pull_request:
910
paths:
10-
- .github/workflows/wireshark-test.yml
11-
- wireshark/**
11+
- '.github/workflows/wireshark-test.yml'
12+
- 'wireshark/**'
1213

1314
jobs:
1415
run-wireshark-tests:

README.md

Lines changed: 57 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ If you love JA4+, consider getting a t-shirt or hoodie:
3232
- [Windows](#windows)
3333
- [Running JA4+](#running-ja4)
3434
- [Database](#database)
35+
- [Release Process](#release-process)
36+
- [How to Create a Release](#how-to-create-a-release)
3537
- [JA4+ Details](#ja4-details)
3638
- [Licensing](#licensing)
3739
- [Q\&A](#qa)
@@ -154,13 +156,17 @@ JA4 binaries are built from the [Rust implementation](rust/README.md) of the sui
154156

155157
### Release Assets
156158

157-
JA4 binaries are provided as compressed archives named according to the target platform, following a pattern like:
158159

159-
```txt
160-
ja4-vX.Y.Z-<architecture>-<platform>.tar.gz
161-
```
160+
Release assets are named according to the component and platform:
161+
162+
- **Rust:**
163+
- `ja4-vX.Y.Z-<architecture>-<platform>.tar.gz` (e.g., `ja4-v0.18.5-x86_64-unknown-linux-musl.tar.gz`)
164+
- **Python:**
165+
- `ja4-python-vX.Y.Z.tar.gz` (contains the full `python/` directory)
166+
- **Wireshark:**
167+
- `ja4.so.linux`, `ja4.so.macos`, `ja4.dll` (attached to a release named like `wireshark-vX.Y.Z`)
162168

163-
For example, `ja4-v0.18.5-x86_64-unknown-linux-musl.tar.gz` for Linux or `ja4-v0.18.5-aarch64-apple-darwin.tar.gz` for macOS ARM64. Choose the appropriate file for your system.
169+
Choose the appropriate file for your system and component.
164170

165171
### Installing tshark
166172

@@ -209,6 +215,52 @@ This database is under very active development. Expect orders of magnitude more
209215

210216
A sample [ja4plus-mapping.csv](./ja4plus-mapping.csv) is also available for quick reference.
211217

218+
## Release Process
219+
220+
221+
JA4+ uses GitHub Actions to automate releases for its Rust, Python, Wireshark, and Zeek components. Releases are created by pushing a tag with a specific prefix to the repository, except for Zeek, which uses a pure semantic version (semver) tag. Release assets are named as follows:
222+
223+
- **Rust:** `ja4-vX.Y.Z-<architecture>-<platform>.tar.gz`
224+
- **Python:** `ja4-python-vX.Y.Z.tar.gz`
225+
- **Wireshark:** `ja4.so.linux`, `ja4.so.macos`, `ja4.dll` (in a release named like `wireshark-vX.Y.Z`)
226+
227+
The following workflows are available:
228+
229+
- **Rust Release:**
230+
Push a tag starting with `rust-`, e.g., `rust-v0.18.5`, to trigger a release of the Rust binaries. The workflow will build and upload release assets automatically.
231+
232+
- **Python Release:**
233+
Push a tag starting with `python-`, e.g., `python-v0.1.0`, to trigger a release of the Python implementation. The workflow will create a tarball of the `python/` directory and publish it as a release asset.
234+
235+
- **Wireshark Plugin Release:**
236+
Push a tag starting with `wireshark-`, e.g., `wireshark-v2025.09.03`, to trigger a release of the Wireshark plugin binaries for all supported platforms.
237+
238+
- **Zeek Release:**
239+
Push a tag that is a pure semantic version (e.g., `v1.2.3`), with no prefix, to trigger a Zeek release. This will automatically create a release on [packages.zeek.org](https://packages.zeek.org/).
240+
241+
### How to Create a Release
242+
243+
1. Ensure your changes are merged into the `main` branch.
244+
245+
2. Create and push a tag for the component you want to release:
246+
- For Rust, Python, or Wireshark, use the appropriate prefix (e.g., `rust-v0.18.5`, `python-v0.1.0`, `wireshark-v2025.09.03`).
247+
- For Zeek, use a pure semver tag (e.g., `v1.2.3`).
248+
249+
Example:
250+
```sh
251+
git tag v1.2.3
252+
git push origin v1.2.3
253+
```
254+
(For Zeek)
255+
256+
Or, for Rust:
257+
```sh
258+
git tag rust-v0.18.5
259+
git push origin rust-v0.18.5
260+
```
261+
262+
3. The corresponding GitHub Actions workflow will run and publish the release assets automatically. For Zeek, the release will appear on [packages.zeek.org](https://packages.zeek.org/).
263+
212264
## JA4+ Details
213265

214266
JA4+ is a set of simple yet powerful network fingerprints for multiple protocols that are both human and machine readable, facilitating improved threat-hunting and security analysis. If you are unfamiliar with network fingerprinting, I encourage you to read my blogs releasing JA3 [here](https://medium.com/salesforce-engineering/tls-fingerprinting-with-ja3-and-ja3s-247362855967), JARM [here](https://medium.com/salesforce-engineering/easily-identify-malicious-servers-on-the-internet-with-jarm-e095edac525a), and this excellent blog by Fastly on the [State of TLS Fingerprinting](https://www.fastly.com/blog/the-state-of-tls-fingerprinting-whats-working-what-isnt-and-whats-next) which outlines the history of the aforementioned along with their problems. JA4+ brings dedicated support, keeping the methods up-to-date as the industry changes.

python/README.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ For more details on JA4+ and its implementations in other open-source tools (Rus
1515
- [Linux](#linux-1)
1616
- [macOS](#macos-1)
1717
- [Windows](#windows-1)
18+
- [Release Assets](#release-assets)
1819
- [Running JA4+](#running-ja4)
1920
- [Usage](#usage)
2021
- [Command-line Arguments](#command-line-arguments)
@@ -24,6 +25,7 @@ For more details on JA4+ and its implementations in other open-source tools (Rus
2425
- [JSON Output Format](#json-output-format)
2526
- [Using a Key File for TLS Decryption](#using-a-key-file-for-tls-decryption)
2627
- [Testing](#testing)
28+
- [Creating a Release](#creating-a-release)
2729
- [License](#license)
2830

2931
## Dependencies
@@ -73,6 +75,14 @@ sudo apt install python3
7375

7476
[Download](https://www.python.org/downloads/windows/) and install Python 3 using the Windows installer.
7577

78+
## Release Assets
79+
80+
Release assets for the Python implementation are named as follows:
81+
82+
- `ja4-python-vX.Y.Z.tar.gz`
83+
84+
This archive contains the full `python/` directory and is attached to a release named like `python-vX.Y.Z`.
85+
7686
## Running JA4+
7787

7888
Once `tshark` and Python 3 are installed, you can run `ja4.py` as follows:
@@ -222,6 +232,15 @@ For details on generating an SSL key log file, see:
222232

223233
Sample PCAP files for testing `ja4.py` are available in the [`pcap`](../pcap/) directory. These files cover various network protocols and scenarios, including TLS, QUIC, HTTP, SSH, and edge cases. They can be used to verify expected output and assess fingerprinting accuracy.
224234

235+
## Creating a Release
236+
237+
To create a Python release, push a tag starting with `python-`, for example:
238+
239+
```sh
240+
git tag python-v0.1.0
241+
git push origin python-v0.1.0
242+
```
243+
225244
## License
226245

227246
See the [Licensing](../README.md#licensing) section in the repo root. We are committed to work with vendors and open source projects to help implement JA4+ into those tools. Please contact [email protected] with any questions.

rust/README.md

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ For more details on JA4+ and its implementations in other open-source tools (Pyt
2323
- [`ja4x` output](#ja4x-output)
2424
- [Using a Key File for TLS Decryption](#using-a-key-file-for-tls-decryption)
2525
- [Testing](#testing)
26+
- [Creating a Release](#creating-a-release)
2627
- [License](#license)
2728

2829
## Dependencies
@@ -60,13 +61,11 @@ Download the latest JA4 binaries from the [Releases](https://github.com/FoxIO-LL
6061

6162
### Release Assets
6263

63-
JA4 binaries are provided as compressed archives named according to the target platform, following a pattern like:
64+
Release assets are named as follows:
6465

65-
```txt
66-
ja4-vX.Y.Z-<architecture>-<platform>.tar.gz
67-
```
66+
- `ja4-vX.Y.Z-<architecture>-<platform>.tar.gz` (e.g., `ja4-v0.18.5-x86_64-unknown-linux-musl.tar.gz` for Linux, `ja4-v0.18.5-aarch64-apple-darwin.tar.gz` for macOS ARM64)
6867

69-
For example, `ja4-v0.18.5-x86_64-unknown-linux-musl.tar.gz` for Linux or `ja4-v0.18.5-aarch64-apple-darwin.tar.gz` for macOS ARM64. Choose the appropriate file for your system.
68+
These files are attached to a release named like `rust-vX.Y.Z`. Choose the appropriate file for your system.
7069

7170
## Building
7271

@@ -189,6 +188,15 @@ Run automated tests with:
189188
cargo test
190189
```
191190

191+
## Creating a Release
192+
193+
To create a Rust release, push a tag starting with `rust-`, for example:
194+
195+
```sh
196+
git tag rust-v0.18.5
197+
git push origin rust-v0.18.5
198+
```
199+
192200
## License
193201

194202
See the [Licensing](../README.md#licensing) section in the repo root. We are committed to work with vendors and open source projects to help implement JA4+ into those tools. Please contact [email protected] with any questions.

wireshark/README.md

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ For more details on JA4+ and its implementations in other open-source tools (Pyt
3131
- [Usage in TShark](#usage-in-tshark)
3232
- [Using a Key File for TLS Decryption](#using-a-key-file-for-tls-decryption)
3333
- [Testing](#testing)
34+
- [Creating a Release](#creating-a-release)
3435
- [License](#license)
3536

3637
## Binaries
@@ -39,7 +40,13 @@ Download the latest JA4+ Wireshark plugin binaries from the [Releases](https://g
3940

4041
### Release Assets
4142

42-
Plugin binaries are provided as dynamic libraries named according to the target platform. For example, `ja4.so.linux` for Linux or `ja4.dll` for Windows. Choose the appropriate file for your system.
43+
Release assets are named as follows:
44+
45+
- `ja4.so.linux` (Linux)
46+
- `ja4.so.macos` (macOS)
47+
- `ja4.dll` (Windows)
48+
49+
These files are attached to a release named like `wireshark-vX.Y.Z`. Choose the appropriate file for your system.
4350

4451
### Previous Wireshark Versions
4552

@@ -261,6 +268,15 @@ cd wireshark/test
261268
pytest
262269
```
263270

271+
## Creating a Release
272+
273+
To create a Wireshark plugin release, push a tag starting with `wireshark-`, for example:
274+
275+
```sh
276+
git tag wireshark-v2025.09.03
277+
git push origin wireshark-v2025.09.03
278+
```
279+
264280
## License
265281

266282
See the [Licensing](../README.md#licensing) section in the repo root. We are committed to work with vendors and open source projects to help implement JA4+ into those tools. Please contact [email protected] with any questions.

0 commit comments

Comments
 (0)