Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
204 commits
Select commit Hold shift + click to select a range
a9aa0bd
Silence spurious ERROR log from zypperpkg search on exit code 104 (#6…
ggiesen Jul 26, 2026
a819992
Support dnf5 group list/info in pkg.group_list/group_info (backport o…
ggiesen Jul 28, 2026
4b04c3e
Update bootstrap script to v2026.07.23 (#69864)
twangboy Jul 28, 2026
1897432
Add test for issue #69893
lkubb Jul 28, 2026
8cabca1
Account for PKCS#7 being unordered
lkubb Jul 28, 2026
8597828
Add test for issue #69895
lkubb Jul 28, 2026
f507366
Don't delete symlinks in test mode
lkubb Jul 28, 2026
662f96b
Minor doc fixes
lkubb Jul 28, 2026
863c1d1
Add test for issue #69896
lkubb Jul 28, 2026
ed5fdca
Require `signing_cert`
lkubb Jul 28, 2026
8feb733
Add tests for issue #69898
lkubb Jul 28, 2026
2ebfcdf
Fix tracebacks and output inconsistencies
lkubb Jul 28, 2026
7765af7
Support `otherName` in `x509_v2`
lkubb Jul 29, 2026
649ada8
Update relenv to 0.22.18
twangboy Aug 3, 2026
3478c0f
Merge pull request #69929 from twangboy/update_relenv
dwoz Aug 3, 2026
b29046a
Merge pull request #69894 from lkubb/fix-509v2
dwoz Aug 3, 2026
689bb60
Add Python 3.9 upper caps for 3.9-dropping deps and fix pip-compile h…
dwoz Jul 14, 2026
696868c
Fix zenoss.monitored returning None for changes
ggiesen Jul 10, 2026
2d8d831
Fix TypeError in file clean when a require ID contains "file"
ggiesen Jul 10, 2026
c7a5d71
Fix saltclass literal '^' list-override marker for single class
ggiesen Jul 10, 2026
7d709d0
Catch UnicodeError in is_reachable_host for overlong names
ggiesen Jul 10, 2026
db1b0d1
Re-pack proxy loader __pillar__ on pillar refresh
ggiesen Jul 10, 2026
9288b00
Refresh proxy exec-module loaders after pillar rebind
ggiesen Jul 10, 2026
2a0382b
Drop unnecessary lambda in proxy pillar-refresh tests
ggiesen Jul 10, 2026
0321d45
Use target minion id for pillar-render execution modules on the master
ggiesen Jul 10, 2026
812ebad
Fix test_pillar_match_filter_by_minion_id expectation for the documen…
ggiesen Jul 11, 2026
282efbb
Add functional API tests for the env and yaml sdb backends
ggiesen Jul 10, 2026
fd37126
Match filter_by keys exactly before treating them as globs
ggiesen Jul 10, 2026
44e2148
Coerce keysize to int in wheel key.gen
ggiesen Jul 10, 2026
4cdf561
Fix file state UnicodeDecodeError on encoding mismatch
ggiesen Jul 4, 2026
0c1c4e8
Add direct and inverse regression tests for file state encoding misma…
ggiesen Jul 6, 2026
5ea5f95
Drop redundant utf-8 argument from str.encode()
ggiesen Jul 10, 2026
fe2c663
Add encoding and encoding_errors params to file comment/append/prepend
ggiesen Jul 10, 2026
f85e760
Fix thorium reg.list crash on non-string add value
ggiesen Jul 4, 2026
be5c411
Reject unusable reg.list 'add' types instead of crashing or silently …
ggiesen Jul 15, 2026
0cbe138
Honour allow_updates for pkg.installed sources installs
ggiesen Jul 4, 2026
10a6ec6
Add direct and inverse regression tests for pkg.installed sources all…
ggiesen Jul 6, 2026
ec6a7dd
Make custom grains override built-in grains of the same name (#54694)
ggiesen Jul 16, 2026
09a6878
Isolate the active-HighState stack per execution context (#63056)
ggiesen Jul 11, 2026
09e472b
Move active-stack accessors to BaseHighState so SSHHighState keeps pu…
ggiesen Jul 13, 2026
ada0f64
Bundle typing_extensions in the salt-ssh thin for py3.6 targets
ggiesen Jul 15, 2026
be57e88
Guard the contextvars import for py3.6 salt-ssh; revert thin typing_e…
ggiesen Jul 15, 2026
27df296
Fix import for WinRM version check
lubinatien Feb 25, 2026
29b2a5b
Fix winrm detection bug in salt-cloud
lubinatien Feb 26, 2026
67ef766
Add cross-platform regression test for pywinrm dist-name lookup
dwoz Jun 6, 2026
b8a6081
Allow libyaml-linked PyYAML wheel in Linux onedir builds
dwoz Aug 4, 2026
5219b25
Update bootstrap script to v2026.08.03
twangboy Aug 3, 2026
8385bca
Add SyncWrapper.__del__ ResourceWarning shim (3006.x)
dwoz Aug 9, 2026
546d192
Fix PubServer wedge on slow subscriber (3006.x)
dwoz Aug 9, 2026
bd8ff52
Raise publish_drain_timeout default from 5s to 60s
dwoz Aug 11, 2026
6b51de0
Fix loader race that poisoned OS-specific virtualnames
dwoz Aug 5, 2026
b34eab6
Cache RSA verifier/signer bridge and PublicKey.from_file (3006.x)
dwoz Aug 9, 2026
899bee9
Update tests for PublicKey.from_file cache indirection
dwoz Aug 11, 2026
9654b60
Fix minion crash when grains config option is empty
BrianHa94 Jul 28, 2026
11400b5
Narrow empty grains check and fix log_file ordering in test
BrianHa94 Jul 28, 2026
1455390
Accept any non-dict grains value and document required shape
BrianHa94 Aug 10, 2026
480f0f5
Fix cmd.script bg=True deleting tempfile before child runs
twangboy Aug 6, 2026
95f745d
Fix POSIX cmd.script bg wrapper skipping tempfile cleanup
twangboy Aug 6, 2026
ab743c2
Fix some lint
twangboy Aug 7, 2026
23178f0
Fix silent truncation of large HTTP downloads in cp/fileclient
twangboy Aug 10, 2026
54e478d
Reset event-bus pusher on failed fire_event send (#69914)
twangboy Aug 3, 2026
0563a55
Add functional test for event-bus pusher recovery (#69914)
twangboy Aug 4, 2026
e8c94d7
Give each deltaproxy sub-proxy its own schedule and beacon storage (#…
ggiesen Jul 12, 2026
92e71e7
test: migrate rh_ip unit tests from TestCase to pytest
ggiesen Jul 1, 2026
f55cfe0
Add nm_ip NetworkManager provider for network.managed (#54791)
ggiesen Jul 1, 2026
2fc318a
Bump nm_ip versionadded to 3006.28
ggiesen Jul 2, 2026
ee9736b
Add direct and inverse regression tests for nm_ip test-flag and rh_ip…
ggiesen Jul 6, 2026
149f343
Expand nm_ip NetworkManager keyfile coverage and harden keyfile write
ggiesen Jul 11, 2026
0e99738
Address review: atomic keyfile write, semicolon _listify, clearer bon…
ggiesen Jul 14, 2026
15e78f4
Use salt.utils.files.fopen in the keyfile write test (test-lint W8470)
ggiesen Jul 15, 2026
2ed6766
Make whitelist_modules only apply to remote dispatch
dwoz Aug 9, 2026
14eb2db
Fix docstring :param: names that do not match the signatures
darkdi Aug 6, 2026
ca283a9
Fix nested SyncWrapper deadlock in tcp.TCPPublishServer.publish (3006.x)
dwoz Aug 9, 2026
b668a8a
Address twangboy review: re-resolve active publisher inside lock
dwoz Aug 12, 2026
1b3b09f
Add onedir package test for libyaml-linked PyYAML
dwoz Aug 9, 2026
7011905
Fix yamlloader attribute name in libyaml onedir test
dwoz Aug 10, 2026
12a638c
Skip libyaml onedir test on downgrade flavor
dwoz Aug 11, 2026
ddf673f
test_libyaml: version-conditional assertions across install/upgrade/d…
dwoz Aug 12, 2026
6b373eb
test_libyaml: key on install_salt.use_prev_version, not artifact version
dwoz Aug 12, 2026
c21f76a
Fix pem_finger so PEM strings match file fingerprints
twangboy Aug 11, 2026
6a3e0f4
Disable pip's periodic version check in salt-pip
dwoz Aug 13, 2026
6c1d1d5
Add functional test for salt-pip PIP_DISABLE_PIP_VERSION_CHECK
dwoz Aug 13, 2026
95c4666
Add configurable/cgroup-aware minion memory headroom check
dwoz Aug 13, 2026
f52cede
Update aiohttp to version 3.14.3
twangboy Aug 13, 2026
1ae9e23
Add scenario tests for minion memory headroom (#69884)
dwoz Aug 14, 2026
160e62f
Fix handling of specific x509_v2 GeneralNames
lkubb Aug 14, 2026
da45305
Account for issuer's basicConstraints pathlen in CA certs
lkubb Aug 14, 2026
cff853e
Respect `get_encoding` param
lkubb Aug 14, 2026
b82635c
Minor lint fixes
lkubb Aug 14, 2026
99cc5e5
Fix Junos timeout wrappers crashing on dev_timeout=None (#58108)
ggiesen Jul 12, 2026
d467ae5
Strip reserved __kwarg__ marker before forwarding Junos RPC options (…
ggiesen Jul 16, 2026
e7e4b3b
Fix NTP/SNMP/probe config on NAPALM proxy minions (bare-name templates)
ggiesen Jul 12, 2026
cde89ca
Add changelog for #69793
ggiesen Jul 12, 2026
7fd38d8
Drop unused salt.utils.napalm import from the napalm tests
ggiesen Jul 12, 2026
b862e2c
Remove legacy test_napalm_probes.py superseded by the pytest tests
ggiesen Jul 12, 2026
082dc0a
Serialize concurrent NAPALM calls on a shared device connection (#55332)
ggiesen Jul 16, 2026
a20cbf5
Fix crash/mutation/log bugs in the shared napalm utils and proxy
ggiesen Jul 12, 2026
8e05b7a
Add changelog for #69796
ggiesen Jul 12, 2026
77e8378
Fix functional tests after pathlen fix
lkubb Aug 15, 2026
f5b2880
Widen retry window for salt-minion service re-registration race
twangboy Aug 11, 2026
bf939d3
Update GitPython to 3.1.59 and pyasn1 to 0.6.4
twangboy Aug 12, 2026
bf17a04
Merge branch '3006.x' into fix-55332-napalm-cli-race
twangboy Aug 17, 2026
31770c5
Stop the loader from shadowing top-level imports via sys.path (#69139)
ggiesen Jul 11, 2026
248eb32
Add functional regression test for the loader sys.path shadow (#69139)
ggiesen Jul 13, 2026
03014ce
Revert PR #69622 (mis-merge of 3008.x content onto 3007.x)
dwozniak-collab Aug 18, 2026
ac92dec
Merge pull request #69819 from ggiesen/fix-55332-napalm-cli-race
dwoz Aug 18, 2026
d043b42
Merge pull request #70047 from lkubb/fix-x509v2-nameconstraints
dwoz Aug 18, 2026
3c620bc
Merge pull request #70038 from dwoz/dwoz/fix/69884-memory-headroom-co…
dwoz Aug 18, 2026
1ece064
Merge remote-tracking branch 'origin/3006.x' into merge/3006.x/3007.x…
dwozniak-collab Aug 18, 2026
f3ffc8f
Constrain git-describe tag match to v3007.* on 3007.x
dwozniak-collab Aug 18, 2026
34759af
Rewrite salt.ext.tornado imports to plain tornado in metaproxy tests
dwozniak-collab Aug 18, 2026
752bdd6
Ship Python 3.11.15 in 3007.x onedir packages
dwozniak-collab Aug 19, 2026
8616e3c
Fix test_schema assertions for jsonschema 4.x error wording
dwozniak-collab Aug 20, 2026
915b4c8
Retry chocolatey installer download on transient HTTP errors
dwoz Aug 20, 2026
28e25c9
Restore several dropped 3006.x fixes + adapt tests for py3.11 deps
dwoz Aug 20, 2026
dfdb211
Restore junos/linux_shadow fixes dropped by the botched-merge revert
dwoz Aug 20, 2026
4838a87
Restore more dropped 3006.x fixes on the merge-forward
dwoz Aug 20, 2026
5c701bc
Include minion id on rejected-auth log + guard pillar_refresh functio…
dwoz Aug 20, 2026
9ed7f75
Merge pull request #70105 from dwoz/fix/nightly-chocolatey-504
dwoz Aug 21, 2026
8b88ad7
Rename nightly-stress-test.yml to run-stress-test.yml, add branch input
charzl Aug 19, 2026
362cebc
Add nightly-stress-test.yml dispatcher (byte-identical to master's)
charzl Aug 19, 2026
df0ca24
Drop branch input's default -- callers must pass it explicitly
charzl Aug 19, 2026
d0da26e
Merge run-stress-test.yml back into a single nightly-stress-test.yml
charzl Aug 20, 2026
d5fbd3e
Drop branch input's default and all hardcoded '3006.x' fallbacks
charzl Aug 20, 2026
fa1a228
Drop the branch-input comment
charzl Aug 20, 2026
758d00e
Discard non-dict frames in tcp.PublishClient.recv
dwoz Aug 21, 2026
7a81922
Restore Amazon-Linux-2 / CentOS-7 skip on test_ansible_playbook
dwoz Aug 21, 2026
781be86
Add changelog entry for 3006.x nightly stress test enablement
charzl Aug 21, 2026
7ab5c7c
Avoid asyncio.wait_for cancel-after-consume in transport recv paths
dwoz Aug 21, 2026
96d13fe
Make set_umask/get_umask thread safe
geoffberger Jul 21, 2026
c61c285
Fix changelog entry to describe what this PR actually changes
charzl Aug 21, 2026
14ae27f
Trim changelog entry -- state the effect, not the implementation detail
charzl Aug 21, 2026
46f393d
Narrow the previous transport recv fix; revert breaking bits
dwoz Aug 21, 2026
03fda2b
Fix _lint() to resolve platform-specific requirements lock file
BrianHa94 Jul 28, 2026
452be62
Fix remaining duplicate-key hook bugs and add yamllint regression guard
BrianHa94 Jul 29, 2026
7bd2adb
Give lint.lock per-platform variants and trim it to lint-only deps
BrianHa94 Jul 31, 2026
7ea4061
Skip lint-lock checks that require a Linux host, fix stale doc reference
BrianHa94 Aug 3, 2026
8567cd8
Re-sync darwin/windows boto3 pin with linux/cloud after rebasing onto…
BrianHa94 Aug 22, 2026
db3bdea
Re-sync freebsd boto3 pin with linux/cloud/darwin/windows
BrianHa94 Aug 22, 2026
161b714
Fix ZeroMQSocketMonitor teardown race causing Windows libzmq abort
dwoz Aug 22, 2026
3e6e9a1
Cap Cython < 3.3 for onedir source builds
dwoz Aug 22, 2026
2d2dd52
Merge pull request #70099 from saltstack/feature/run-stress-test
dwoz Aug 22, 2026
12f7174
Merge pull request #69933 from BrianHa94/fix-69932-lint-pre-commit-cr…
dwoz Aug 22, 2026
a35f4cd
Pin Cython<3.3 for pyzmq source-build compat
dwoz Aug 22, 2026
c74f105
Merge pull request #70121 from dwoz/dwoz/fix/cython-3.3-pin-3006x
dwoz Aug 23, 2026
e89b0d0
Fix RequestClient close/_send_recv teardown race causing Windows libz…
twangboy Aug 24, 2026
beb5acd
Fix _handle_signals TypeError when SIGTERM hits a forked child
dwoz Aug 23, 2026
74472db
Rename changelog to PR number 70123
dwoz Aug 23, 2026
cf91558
Normalize FileserverUpdate process title casing
dwoz Aug 22, 2026
cf93e4c
Rename changelog entry to PR number
dwoz Aug 22, 2026
3791704
Scope the pyzmq<26 cap to non-Windows; Windows stays on pyzmq>=27.1.0
twangboy Aug 24, 2026
491de19
Retry chocolatey installer download on transient HTTP errors
dwoz Aug 24, 2026
1788450
Regenerate remaining lock files for windows-scoped pyzmq pins
dwoz Aug 25, 2026
df27f95
test_windows_env_handling: stop relying on duplicate-case env entries
dwoz Jun 26, 2026
d612dde
Merge pull request #70063 from dwoz/merge/3006.x/3007.x-08-14-26
dwoz Aug 25, 2026
e9f2d14
Merge pull request #70123 from dwoz/dwoz/fix/handle-signals-default-i…
dwoz Aug 25, 2026
495f0ee
Merge pull request #70111 from dwoz/dwoz/fix/fileserverupdate-name-co…
dwoz Aug 25, 2026
17c1f44
Merge remote-tracking branch 'origin/3007.x' into merge/3007.x/3008.x…
dwoz Aug 25, 2026
f85447b
Merge pull request #69842 from geoffberger/fix-umask-thread-safety
dwoz Aug 25, 2026
1fde51d
Bump relenv to 0.22.23
dwoz Aug 25, 2026
6072117
Bump onedir Python point versions to match relenv 0.22.23 assets
dwoz Aug 25, 2026
299ce6f
Preserve EventPublisher setproctitle across MasterPubServerChannel re…
dwoz Aug 23, 2026
4db0a57
Rename changelog to PR number
dwoz Aug 23, 2026
a919896
Merge remote-tracking branch 'origin/3008.x' into merge/3007.x/3008.x…
dwoz Aug 25, 2026
b755971
Fix isolated-FS cluster serving stale cluster.pub after join-reply
dwoz Aug 26, 2026
5c6a3fd
Add HAProxy-fronted scenario test for isolated-FS cluster (#70090)
dwoz Aug 26, 2026
27a5130
Bump cryptography, pyopenssl, msgpack, requests, setuptools; add attr…
dwoz Aug 21, 2026
98f2ed4
Add zc.lockfile to --only-binary allow-list
dwoz Aug 25, 2026
a4d130d
Cap cryptography <49 on Windows for win32 wheel availability
dwoz Aug 26, 2026
20f5bd8
Make tls module refuse to load on pyOpenSSL 26+
dwoz Aug 26, 2026
5202ff4
Bump relenv to 0.22.25
dwoz Aug 26, 2026
1e9472d
Add unit + scenario coverage for cluster.pem cache refresh (#70090)
dwoz Aug 26, 2026
a17fee9
Merge remote-tracking branch 'origin/3006.x' into merge/3006.x/3007.x…
dwoz Aug 26, 2026
2bca722
Merge remote-tracking branch 'origin/3008.x' into merge/3007.x/3008.x…
dwoz Aug 26, 2026
e67c307
Fix Combine Code Coverage job on 3007.x
dwoz Aug 25, 2026
34aa5c9
Merge pull request #70146 from dwoz/merge/3006.x/3007.x-08-26-26
dwoz Aug 26, 2026
2a32200
Merge pull request #70145 from dwoz/dwoz/fix/70090-cluster-isolated-h…
dwoz Aug 26, 2026
6d935cb
Merge remote-tracking branch 'origin/3007.x' into merge/3007.x/3008.x…
dwoz Aug 26, 2026
c432617
Fix python_version and regen freebsd locks
dwoz Aug 26, 2026
19f1de7
Force -undefined dynamic_lookup for macOS onedir C-ext builds
dwoz Aug 26, 2026
1369526
Add regression tests for PubServer drain-task cap and Unpacker/ipc_wr…
dwoz Aug 26, 2026
49939ce
Cap in-flight drain tasks per subscriber in PubServer.publish_payload
dwoz Aug 26, 2026
b8f2622
Widen PubServer drain queue default and defer QueueFull to watchdog
dwoz Aug 26, 2026
6d062bf
Merge remote-tracking branch 'origin/3008.x' into merge/3007.x/3008.x…
dwoz Aug 26, 2026
9e68e51
Resync every drifted requirements lock to 3008.x
dwoz Aug 27, 2026
08c307e
Raise SRP floors so lock regen does not drop 3007.x pins
dwoz Aug 27, 2026
ca4f736
Bump setuptools floor to 82.0.1 to match SRP baseline
dwoz Aug 27, 2026
b1c6a42
Merge pull request #70132 from dwoz/merge/3007.x/3008.x-08-25-26
dwoz Aug 27, 2026
1bf1157
nightly: sign RPM packages with whichever key is in the signing secret
dwoz Aug 26, 2026
162c55c
Merge pull request #70155 from dwoz/dwoz/backport/70141-to-3008.x
dwoz Aug 27, 2026
8fcd6c2
templates/build-packages: pass secrets: inherit for nightly too
dwoz Aug 27, 2026
ca4940b
Merge pull request #70160 from dwoz/dwoz/backport/70159-to-3008.x
dwoz Aug 27, 2026
54e8259
version: mark ARGON (3008) as released
dwoz Aug 27, 2026
972deae
Merge pull request #70162 from dwoz/dwoz/backport/70161-to-3008.x
dwoz Aug 27, 2026
20f5ba4
ci: skip CI on saltstack/salt-nightlies (duplicate of upstream)
dwoz Aug 14, 2026
774dfdc
nightly: sign DEB packages with debsigs, mirroring RPM signing path
dwoz Aug 27, 2026
bbab41b
Merge pull request #70166 from dwoz/dwoz/backport/70165-to-3008.x
dwoz Aug 27, 2026
08bed8b
test_version: assert current_release() contract, not a hardcoded code…
dwoz Aug 27, 2026
bef560b
Merge pull request #70163 from dwoz/dwoz/backport/70043-to-3008.x
dwoz Aug 27, 2026
fd8241a
Merge pull request #70167 from dwoz/dwoz/fix/test-current-release-arg…
dwoz Aug 27, 2026
2afdc78
version: constrain git-describe --match to v3008.* on 3008.x
dwoz Aug 28, 2026
4ae4bf9
Merge pull request #70170 from dwoz/dwoz/fix/git-describe-match-3008-…
dwoz Aug 28, 2026
1d7ebeb
Quote scp paths in salt-ssh to support paths with spaces
twangboy Aug 18, 2026
e99900f
DEBUG: trace argv size in Shell._run_cmd (temporary, do not merge)
twangboy Aug 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 42 additions & 2 deletions .github/workflows/build-packages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ on:
type: boolean
default: false
description: Sign RPM Packages
sign-deb-packages:
type: boolean
default: false
description: Sign DEB Packages (via debsigs, using SIGNING_GPG_KEY)
sign-macos-packages:
type: boolean
default: false
Expand Down Expand Up @@ -66,6 +70,7 @@ jobs:

build-deb-packages:
name: DEB
environment: ${{ inputs.environment }}
if: ${{ toJSON(fromJSON(inputs.matrix)['linux']) != '[]' }}
runs-on:
- ${{ matrix.arch == 'x86_64' && 'ubuntu-24.04' || inputs.linux_arm_runner }}
Expand Down Expand Up @@ -113,6 +118,10 @@ jobs:
apt-get install -y devscripts
# Installing patchelf for relenv ELF binary patching
apt-get install -y patchelf
# Installing debsigs for DEB signing (invoked by tools pkg
# build deb --key-id=<id>). Cheap install even when signing is
# off so the toolchain is always ready.
apt-get install -y debsigs

- name: Download Onedir Tarball as an Artifact
if: inputs.source == 'onedir'
Expand Down Expand Up @@ -155,6 +164,30 @@ jobs:
salt-version: "${{ inputs.salt-version }}"
cwd: pkgs/checkout/

- name: Setup GnuPG
if: ${{ inputs.sign-deb-packages }}
env:
SIGNING_GPG_KEY: ${{ secrets.SIGNING_GPG_KEY }}
SIGNING_PASSPHRASE: ${{ secrets.SIGNING_PASSPHRASE }}
run: |
install -d -m 0700 -o "$(id -u)" -g "$(id -g)" /run/gpg
GNUPGHOME="$(mktemp -d -p /run/gpg)"
export GNUPGHOME
echo "GNUPGHOME=${GNUPGHOME}" >> "$GITHUB_ENV"
cat <<EOF > "${GNUPGHOME}/gpg.conf"
batch
no-tty
pinentry-mode loopback
passphrase-file ${GNUPGHOME}/passphrase
EOF
echo "${SIGNING_PASSPHRASE}" > "${GNUPGHOME}/passphrase"
echo "${SIGNING_GPG_KEY}" | gpg --import -
# Discover the imported key's fingerprint so `tools pkg build
# deb --key-id=<id>` (and the debsigs call it makes) uses
# whatever key material was provided rather than a hardcoded id.
SIGN_KEY_ID=$(gpg --list-secret-keys --with-colons | awk -F: '$1=="fpr" {print $10; exit}')
echo "SIGN_KEY_ID=${SIGN_KEY_ID}" >> "$GITHUB_ENV"

- name: Configure Git
if: ${{ startsWith(github.event.ref, 'refs/tags') == false }}
working-directory: pkgs/checkout/
Expand All @@ -175,7 +208,7 @@ jobs:
format('--onedir=salt-{0}-onedir-linux-{1}.tar.xz', inputs.salt-version, matrix.arch)
||
format('--arch={0}', matrix.arch)
}}
}} ${{ inputs.sign-deb-packages && format('--key-id={0}', env.SIGN_KEY_ID) || '' }}

- name: Cleanup
run: |
Expand Down Expand Up @@ -278,6 +311,13 @@ jobs:
EOF
echo "${SIGNING_PASSPHRASE}" > "${GNUPGHOME}/passphrase"
echo "${SIGNING_GPG_KEY}" | gpg --import -
# Discover the fingerprint of the just-imported signing key so
# Build RPM can pass it to rpmsign without hardcoding a specific
# key id. Lets each repo (saltstack/salt, saltstack/salt-nightlies)
# provide its own key material via SIGNING_GPG_KEY and have the
# workflow use whatever's in the resulting keyring.
SIGN_KEY_ID=$(gpg --list-secret-keys --with-colons | awk -F: '$1=="fpr" {print $10; exit}')
echo "SIGN_KEY_ID=${SIGN_KEY_ID}" >> "$GITHUB_ENV"

- name: Configure Git
if: ${{ startsWith(github.event.ref, 'refs/tags') == false }}
Expand All @@ -296,7 +336,7 @@ jobs:
format('--onedir=salt-{0}-onedir-linux-{1}.tar.xz', inputs.salt-version, matrix.arch)
||
format('--arch={0}', matrix.arch)
}} ${{ inputs.sign-rpm-packages && '--key-id=64CBBC8173D76B3F' || '' }}
}} ${{ inputs.sign-rpm-packages && format('--key-id={0}', env.SIGN_KEY_ID) || '' }}

- name: Set Artifact Name
id: set-artifact-name
Expand Down
32 changes: 12 additions & 20 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ jobs:
name: Prepare Workflow Run
runs-on: ubuntu-22.04
environment: ci
if: vars.SKIP_CI != 'true'
outputs:
changed-files: ${{ steps.process-changed-files.outputs.changed-files }}
salt-version: ${{ steps.setup-salt-version.outputs.salt-version }}
Expand Down Expand Up @@ -175,17 +176,8 @@ jobs:

- name: Get Hash For Nox Tarball Cache
id: nox-archive-hash
shell: bash
run: |
HASH=$(python3 .github/scripts/hash-files.py \
'requirements/**/*.txt' \
'requirements/**/*.in' \
'requirements/**/*.lock' \
'cicd/golden-images.json' \
'noxfile.py' \
'pkg/common/env-cleanup-rules.yml' \
'.github/workflows/build-deps-ci-action.yml')
echo "nox-archive-hash=${HASH}" | tee -a "$GITHUB_OUTPUT"
echo "nox-archive-hash=${{ hashFiles('requirements/**/*.txt', 'requirements/**/*.lock', 'cicd/golden-images.json', 'noxfile.py', 'pkg/common/env-cleanup-rules.yml', '.github/workflows/build-deps-ci-action.yml') }}" | tee -a "$GITHUB_OUTPUT"

- name: Write Changed Files To A Local File
run:
Expand Down Expand Up @@ -474,8 +466,8 @@ jobs:
with:
cache-seed: ${{ needs.prepare-workflow.outputs.cache-seed }}
salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}"
relenv-version: "0.22.18"
python-version: "3.14.6"
relenv-version: "0.22.25"
python-version: "3.14.7"
ci-python-version: "3.14"
matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }}
linux_arm_runner: ${{ fromJSON(needs.prepare-workflow.outputs.config)['linux_arm_runner'] }}
Expand All @@ -491,8 +483,8 @@ jobs:
with:
salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}"
cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}
relenv-version: "0.22.18"
python-version: "3.14.6"
relenv-version: "0.22.25"
python-version: "3.14.7"
ci-python-version: "3.14"
source: "onedir"
matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }}
Expand All @@ -508,8 +500,8 @@ jobs:
with:
salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}"
cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}
relenv-version: "0.22.18"
python-version: "3.14.6"
relenv-version: "0.22.25"
python-version: "3.14.7"
ci-python-version: "3.14"
source: "src"
matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }}
Expand All @@ -524,10 +516,10 @@ jobs:
with:
nox-session: ci-test-onedir
nox-version: 2022.8.7
python-version: "3.14.6"
python-version: "3.14.7"
ci-python-version: "3.14"
salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}"
cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.14.6
cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.14.7
nox-archive-hash: "${{ needs.prepare-workflow.outputs.nox-archive-hash }}"
matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }}
linux_arm_runner: ${{ fromJSON(needs.prepare-workflow.outputs.config)['linux_arm_runner'] }}
Expand All @@ -545,7 +537,7 @@ jobs:
salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}"
nox-version: 2022.8.7
ci-python-version: "3.14"
cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.14.6
cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.14.7
skip-code-coverage: ${{ fromJSON(needs.prepare-workflow.outputs.config)['skip_code_coverage'] }}
testing-releases: ${{ needs.prepare-workflow.outputs.testing-releases }}
matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['pkg-test-matrix']) }}
Expand All @@ -564,7 +556,7 @@ jobs:
ci-python-version: "3.14"
testrun: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['testrun']) }}
salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}"
cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.14.6
cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.14.7
skip-code-coverage: ${{ fromJSON(needs.prepare-workflow.outputs.config)['skip_code_coverage'] }}
workflow-slug: ci
default-timeout: 180
Expand Down
145 changes: 2 additions & 143 deletions .github/workflows/nightly-stress-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,6 @@ on:
jobs:
stress-test:
runs-on: ubuntu-latest
# ``contents: write`` lets the ``Publish panels to stress-snapshots
# branch`` step push the rendered PNGs to an orphan branch so the
# step summary can embed them via raw.githubusercontent.com URLs.
permissions:
contents: write
steps:
- uses: actions/checkout@v4

Expand All @@ -59,15 +54,6 @@ jobs:
- name: Build and Start Environment
run: |
cd tests/monitoring
# The prometheus container runs as ``nobody`` (uid 65534) and
# writes its TSDB to ``/prometheus``. Without pre-creating the
# bind-mount source with that ownership, Docker auto-creates
# it owned by root and prometheus fails to start with
# "permission denied" on /prometheus -- which then surfaces
# downstream as a bare ConnectionRefusedError when
# analyze_stats.py tries to query http://localhost:19090.
mkdir -p prometheus_data
sudo chown -R 65534:65534 prometheus_data
docker compose build
docker compose up -d
sleep 30 # Wait for initialization
Expand Down Expand Up @@ -126,42 +112,8 @@ jobs:
fi

- name: Verify Connections
# The salt CLI returns exit 0 even when the master returns an
# error string (the legacy ``'str' object has no attribute
# 'pop'`` failure path surfaces this way), so we have to inspect
# the JSON output ourselves to fail the step.
run: |
out=$(docker exec salt-master salt --out=json '*' test.ping)
echo "$out"
python3 - "$out" <<'PY'
import json, sys
payload = sys.argv[1].strip()
decoder = json.JSONDecoder()
idx = 0
bad = []
while idx < len(payload):
while idx < len(payload) and payload[idx].isspace():
idx += 1
if idx >= len(payload):
break
try:
obj, end = decoder.raw_decode(payload, idx)
except ValueError as exc:
bad.append(f" non-JSON at offset {idx}: {exc}")
break
idx = end
if isinstance(obj, dict):
for mid, val in obj.items():
if val is not True:
bad.append(f" minion {mid!r} returned {val!r}")
else:
bad.append(f" unexpected payload type: {type(obj).__name__}={obj!r}")
if bad:
print("Verify Connections failed:", file=sys.stderr)
for b in bad:
print(b, file=sys.stderr)
sys.exit(1)
PY
docker exec salt-master salt '*' test.ping

- name: Run Aggressive Stress Test
run: |
Expand Down Expand Up @@ -189,19 +141,6 @@ jobs:
sleep 30
python3 analyze_stats.py

- name: Render Dashboard Panels
# Render BEFORE Snapshot Metrics stops prometheus. We *only*
# produce the PNGs here; the markdown step-summary that links
# to them runs after the upload so it can embed a real URL.
# Runs even if Analyze Results failed -- the graphs are usually
# the most useful diagnostic for a failed run.
if: always()
run: |
cd tests/monitoring
python3 -m pip install --quiet matplotlib
PANELS_DIR="${GITHUB_WORKSPACE}/artifacts/panels" \
python3 render_panels.py

- name: Snapshot Metrics
if: always()
run: |
Expand All @@ -216,93 +155,13 @@ jobs:
mkdir -p artifacts
docker logs salt-master > artifacts/salt-master.log
docker logs salt-minion-1 > artifacts/salt-minion-1.log
cp tests/monitoring/event_log.txt artifacts/ || true
# Always grab prometheus' own log so we can tell whether the
# connection refused was a startup issue (bind mount permissions
# etc.) vs. a runtime crash.
docker logs prometheus > artifacts/prometheus.log 2>&1 || true
cp monitoring/event_log.txt artifacts/ || true

- name: Upload Artifacts
id: upload-artifacts
if: always()
uses: actions/upload-artifact@v4
with:
name: stress-test-results
path: |
artifacts/
prometheus-data.tar.gz

- name: Publish panels to stress-snapshots branch
# GitHub's step-summary sanitizer strips ``data:`` URIs but
# allows real ``https:`` image URLs, so we push the rendered
# PNGs to a dedicated ``stress-snapshots`` branch and let the
# summary embed them via ``raw.githubusercontent.com``. The
# branch is orphan-style: it never merges anywhere and is
# auto-pruned 14 days back so it stays small. Skipped silently
# when no PNGs exist (e.g. early-stage failures).
id: publish-snapshots
if: always() && hashFiles('artifacts/panels/*.png') != ''
env:
GH_TOKEN: ${{ github.token }}
run: |
set -e
REPO_URL="https://x-access-token:${GH_TOKEN}@github.com/${{ github.repository }}.git"
BRANCH=stress-snapshots
RUN_DIR="runs/${{ github.run_id }}"

if git ls-remote --exit-code --heads "$REPO_URL" "$BRANCH" >/dev/null 2>&1; then
git clone --depth=1 --branch="$BRANCH" "$REPO_URL" snaps
else
git clone --depth=1 "$REPO_URL" snaps
cd snaps
git switch --orphan "$BRANCH"
git rm -rf . >/dev/null 2>&1 || true
cd ..
fi

mkdir -p "snaps/$RUN_DIR"
cp artifacts/panels/*.png "snaps/$RUN_DIR/"

cd snaps
# Drop any run directory older than 14 days so the branch
# never accumulates unbounded.
find runs -mindepth 1 -maxdepth 1 -type d -mtime +14 -exec rm -rf {} + 2>/dev/null || true

git config user.email "actions@github.com"
git config user.name "github-actions[bot]"
git add -A
if ! git commit -m "Stress run ${{ github.run_id }}"; then
echo "nothing to commit"
else
# Tiny retry loop in case two runs raced. Cron is nightly
# so this is essentially defensive.
for attempt in 1 2 3; do
if git push origin "$BRANCH"; then
break
fi
echo "push attempt $attempt failed; rebasing"
git fetch origin "$BRANCH"
git rebase "origin/$BRANCH"
done
fi

URL_PREFIX="https://raw.githubusercontent.com/${{ github.repository }}/${BRANCH}/${RUN_DIR}/"
echo "url-prefix=${URL_PREFIX}" >> "$GITHUB_OUTPUT"
echo "Published panels under ${URL_PREFIX}"

- name: Panel Summary
# Build the workflow step summary from the PNGs the Render
# step already produced, NOT by re-querying prometheus -- by
# this point ``Snapshot Metrics`` has stopped the prometheus
# container, so every range query would return no data.
# ``--image-url-prefix`` points at the stress-snapshots branch
# so each panel renders inline; without it the summary falls
# back to listing the artifact bundle.
if: always()
run: |
cd tests/monitoring
PANELS_DIR="${GITHUB_WORKSPACE}/artifacts/panels" \
python3 render_panels.py --summary --from-existing \
--artifact-name stress-test-results \
--artifact-url "${{ steps.upload-artifacts.outputs.artifact-url }}" \
--image-url-prefix "${{ steps.publish-snapshots.outputs.url-prefix }}"
Loading
Loading