-
Notifications
You must be signed in to change notification settings - Fork 79
FIPS 140-3 validated password hashing — ADR, packaging, and build pipeline #8469
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Draft
aaronlippold
wants to merge
197
commits into
master
Choose a base branch
from
feature/fips-compliant-password-hashing
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Draft
Changes from 16 commits
Commits
Show all changes
197 commits
Select commit
Hold shift + click to select a range
973d0eb
docs: add ADR-006 FIPS password hashing (pre-review draft)
aaronlippold d98b269
docs: rewrite ADR-006 after adversarial review — verified sources only
aaronlippold 35d47de
build: import RPM packaging from saf-packaging
aaronlippold 381d00b
docs: restore NOTICE.md
aaronlippold 9bfff1e
Revert "docs: restore NOTICE.md"
aaronlippold ac593eb
docs: bump LICENSE.md copyright to 2026
aaronlippold b6a1228
docs: use the MITRE SAF license for hdf-converters
aaronlippold 7f11961
docs: normalize licensing across all monorepo workspaces
aaronlippold de204f7
chore: complete package.json metadata across workspaces
aaronlippold ff16bc2
fix: make the pack-time manifest rewrite crash-safe
aaronlippold cb40f42
docs: add SECURITY.md and CONTRIBUTING.md
aaronlippold 3be0814
docs: revise ADR-006 — correct the FIPS-mode approach, add credential…
aaronlippold d2fca99
build: repair RPM build inputs after the move into this repo
aaronlippold 7fb6156
build: resolve RPM version from the repository, not rpmspec
aaronlippold 987bfff
ci: build RPMs for el8/el9 on x86_64 and aarch64, attach to releases
aaronlippold a8b1f1c
docs: add the distribution model to ADR-006
aaronlippold 647536b
ci: bootstrap make alongside git in the RPM build container
aaronlippold ed3ff63
docs: fold in Will's review — correct module version, CLI claims, pre…
aaronlippold c1140e1
docs: settle ADR-006 open designs — KDF limiter, write-gate triggers,…
aaronlippold 66a921d
feat: add OpenTofu module for FIPS-enabled RHEL 9 EC2 test host
aaronlippold 404a550
docs: user-space session-manager-plugin install — brew cask needs blo…
aaronlippold 5b38daa
docs: rebuild-proof SSH-over-SSM config — wildcard i-* + Name-tag alias
aaronlippold f7173af
feat: bake tmux into the test host — long jobs must survive SSM idle …
aaronlippold 0e0675b
feat: idle auto-stop — CloudWatch alarm stops the box after 45 min be…
aaronlippold 1691d36
feat: fips-box pause/wake/status — deliberate stop and ssh-ready wake
aaronlippold 0c1f180
feat: single identity knob — TF_VAR_name drives tofu, fips-box, and t…
aaronlippold 20674fc
research: FIPS-host spike findings — provider activates in-container,…
aaronlippold 4de0e26
feat: add @heimdall/password-hash-vectors workspace with malformed-ha…
aaronlippold 3dd3db9
feat: add known-good vectors + FORMAT_VERSION to @heimdall/password-h…
aaronlippold df31125
feat: add pure hashPassword with PHC encoding (apps/backend/src/crypt…
aaronlippold 8e41ad2
fix: complete the Multer mock file in the evaluations controller spec
aaronlippold b6d6465
feat: add verifyPassword with the FIPS gate and a KDF concurrency lim…
aaronlippold f97b625
feat: add PasswordService and CryptoModule
aaronlippold 7223795
feat: add compare-and-swap rehash writers and migrate the verify-only…
aaronlippold ac36c60
feat: migrate the login path to PBKDF2 verification with lazy rehash
aaronlippold ea22956
feat: hash the bootstrap administrator with PBKDF2
aaronlippold 043a944
feat: add the §12 write gate, FIPS boot assertions, and marker migration
aaronlippold b13c4a7
feat: migrate remaining bcrypt sites to PasswordService
aaronlippold ebc5a78
feat: add §17 rehash audit logging and the lifecycle regression suite
aaronlippold caed841
feat: add the health/readiness surface and admin migration report
aaronlippold fb853b5
feat: harden RPM packaging for FIPS hosts
aaronlippold a669c00
chore: modernize the dev workflow — self-selecting start:dev, per-app…
aaronlippold 84fcda6
fix: import CryptoModule in the evaluations spec harness
aaronlippold a790b7c
feat: wire health probes into compose and the RPM runbook
aaronlippold d29c2c5
fix: pin the Tailwind generator and guard its committed output
aaronlippold a1beccb
feat: scaffold the isolated VitePress documentation site
aaronlippold f12ff86
docs: separate internal records from the published docs tree
aaronlippold c2816ef
feat(docs): add canonical environment-variables reference
aaronlippold 54dd1df
fix(auth): accept GITLAB_CLIENTSECRET for the GitLab client secret
aaronlippold 41a9422
chore(lint): repair the lint configuration and adopt Prettier
aaronlippold 3bdd1f1
style(backend): apply lint autofixes and repair what they broke
aaronlippold 83f0ea5
fix(docs): document CYPRESS_TESTING and UV_THREADPOOL_SIZE
aaronlippold 564374a
feat(docs): write the getting-started section
aaronlippold 81982a8
ci: report lint without blocking until the backlog is cleared
aaronlippold 3affb93
chore(lint): apply the full rule triage — fix the config, not the count
aaronlippold 47777a9
chore(lint): remove stale disable directives
aaronlippold c7b1c75
style: apply layout-type autofixes across the monorepo
aaronlippold aa99a3e
chore(lint): never lint standards files; drop the link-breaking fixer
aaronlippold 84f6123
style: use dot notation for literal string property access
aaronlippold 6bcdb4c
style: use bracket array syntax consistently
aaronlippold d0d1e5d
style: remove type assertions the compiler proves redundant
aaronlippold 238b861
style: use Record for index signatures
aaronlippold 1ea920e
style: put constructor generics on the constructor
aaronlippold de3cbbc
style: drop zero fractions from number literals
aaronlippold bbe0b2d
style: name every catch binding `error`
aaronlippold f7a5ada
style: make length checks explicit comparisons
aaronlippold 7420f12
style: use replaceAll for global string replacement
aaronlippold f98fb84
style: group digits with numeric separators
aaronlippold 2f92686
style: pass a limit to split when only a prefix is used
aaronlippold 2bcc665
style: use includes for membership tests
aaronlippold b5d6d2b
style: use new when constructing builtins
aaronlippold 7c1b6e5
style: use at(-1) for last-element access
aaronlippold ce6b381
style: drop redundant explicit undefined
aaronlippold 4b1b85c
style: use non-null assertions where only nullability is asserted
aaronlippold 2c4e6d7
fix(security): eliminate computed-key access at the logging trust bou…
aaronlippold ae19329
feat(docs): WIP — serve the built documentation in-app at /docs
aaronlippold b864d89
fix(security): Map-backed lookups and caches for scan-file-derived keys
aaronlippold 56860f7
fix(security): remove computed-key access from grouping and descripti…
aaronlippold d0c0ba3
fix(security): Map-backed resource accumulation in the AWS Config mapper
aaronlippold a5b1a43
fix(security): finish computed-key elimination across hdf-converters …
aaronlippold ac03440
chore(lint): object-injection cannot apply to spec fixtures
aaronlippold bf6948c
fix(security): eliminate computed-key access across the frontend
aaronlippold cc6383f
fix(security): close the object-injection stream in inspecjs
aaronlippold 406c5bf
fix(backend): three floating promises, two of them live bugs
aaronlippold 14c13a0
fix(frontend): stop losing async flow in stores and routing
aaronlippold 462daf7
fix(frontend): restore the concrete theme shape in gen_visibilities
aaronlippold 0574168
fix(frontend): stop losing async flow in Vue components
aaronlippold 535fdba
refactor(frontend): convert promise chains to async/await in stores a…
aaronlippold 91905e4
refactor(frontend): convert the evaluations store to async/await
aaronlippold d7f4cfe
refactor(frontend): finish the mechanical promise-chain conversions
aaronlippold 7460763
refactor(frontend): give each vuex action construct its honest form
aaronlippold 7b394c1
refactor(frontend): replace tenable_util's hand-rolled timeout races …
aaronlippold e2689db
fix(frontend): stop stranding the registration button spinner
aaronlippold 2ebb6ea
fix(hdf-converters): make every template interpolation string-typed
aaronlippold f8a7d41
fix(lint): string-type the winston printf and snackbar interpolations
aaronlippold 7084de9
style: use utf8 for every text encoding identifier
aaronlippold b889d52
style: split type-only imports with import type
aaronlippold c3368ac
chore(lint): execute the Phase D triage decisions
aaronlippold 2b7ae49
refactor: rename code files to their measured case conventions
aaronlippold 30fed7b
fix(lint): clear no-unused-vars with the underscore convention honored
aaronlippold 2689e48
fix(lint): honest test assertions and audited TLS material reads
aaronlippold 1866e5f
fix(security): eliminate dynamic regex construction where a literal o…
aaronlippold b99728e
fix(lint): chain caught errors as cause and use Object.hasOwn
aaronlippold cf443bc
fix(lint): declare the checklist fallthrough and drop dead initializers
aaronlippold 001d8de
fix(lint): compare status enums by member, not raw literal
aaronlippold a324ca7
fix(lint): wrap method references in arrows to pin their receiver
aaronlippold fb35422
fix(lint): import CJS module members as named imports instead of defa…
aaronlippold 9c513cd
fix(auth): return the validated user from LDAP validate instead of ca…
aaronlippold 30e4535
fix(splunk): make trackJob actually await search job completion
aaronlippold 61c6724
fix(lint): give async-less functions their honest synchronous or prom…
aaronlippold 43ccf3e
fix(lint): unwrap single-element Promise.all in migration transactions
aaronlippold 0da5686
fix(lint): replace then/catch chaining with await where a caller alre…
aaronlippold a182243
fix(lint): name awaited values instead of member access on await expr…
aaronlippold 6036e67
fix(lint): clear the promise/vitest false-positive tail on Cypress an…
aaronlippold 9287886
fix(lint): hoist function-local regexes to module scope as named cons…
aaronlippold 110da1d
fix(lint): conform type declarations to each package's measured majority
aaronlippold 4ba4b29
fix(lint): use spread over concat, Array.from and slice for array bui…
aaronlippold 05cfd03
fix(lint): drop template-literal wraps that add nothing to their expr…
aaronlippold b15c1d4
fix(lint): state conditions positively instead of branching on negations
aaronlippold d368edb
fix(lint): merge consecutive push calls into single multi-argument calls
aaronlippold d23d5b0
fix(lint): resolve require() usage by module-system contract
aaronlippold 8d0c40b
fix(lint): disambiguate break and continue inside nested loops
aaronlippold e143437
fix(lint): drop regex flags the patterns cannot use
aaronlippold ac493d4
fix(lint): conform regex literals to strict-mode escaping
aaronlippold 5ed3557
docs(lint): clear the markdown family across prose, templates, and ma…
aaronlippold 9742c10
fix(lint): call exec on the regex instead of match on the string
aaronlippold a1eacff
fix(lint): initialize collections with their contents instead of muta…
aaronlippold edbc79a
fix(lint): stop leaning on push's return value
aaronlippold 6c66f89
fix(lint): use slice for string extraction, preserving each site's ed…
aaronlippold bed3ec3
fix(lint): pass Boolean directly where a callback only restates it
aaronlippold e92de94
fix(lint): stop mutating module-scope state from inside functions
aaronlippold 751df51
fix(frontend): type tenable executions as the ScanResults they hold
aaronlippold 0494e50
fix(lint): name non-function values without function-style verbs
aaronlippold 3b235d5
style: order class members canonically (statics, fields, constructor,…
aaronlippold edf0466
style: use at(-1) for last-element access via slice and length arithm…
aaronlippold 248162f
style: name regex capture groups for what they capture
aaronlippold 9e434f0
style: use Set membership and structuredClone for lookups and deep co…
aaronlippold de11287
fix(lint): pass replacements as functions and collapse same-operand t…
aaronlippold 3532197
style: replace reduce with the shape each site was building
aaronlippold bdb2d89
style: pass plain strings to replaceAll where the pattern is one literal
aaronlippold 2104fa3
fix(lint): sort with toSorted instead of mutating in place
aaronlippold 3c6351b
fix(lint): declare the dependencies each package actually imports
aaronlippold 57ded5f
style: drop type annotations that restate literal initializers
aaronlippold 53f7e6b
test: give duplicated suite titles the names of what they actually test
aaronlippold 53e96d0
style: guard and return early instead of wrapping whole bodies in if
aaronlippold ba8c0a2
style: reference browser globals bare instead of through window
aaronlippold ee3e8d0
fix(lint): scope n/no-missing-import off the published libs' TS sources
aaronlippold f15a990
style: coerce with Number and continue early in loops
aaronlippold fb512ab
style: chain optional accesses instead of guarding each step
aaronlippold f5d0e9f
style: call array callbacks through explicit arrows
aaronlippold 09d9a2b
style: name intermediates instead of nesting calls four deep
aaronlippold 0d14b7f
style: bound quantifiers explicitly and declare after early exits
aaronlippold b9bb5c3
style: replace the removed ban-types rule's leftovers
aaronlippold 9222b12
style: flatten with flatMap and compare against undefined directly
aaronlippold fac57c9
style: export types as types and return booleans directly
aaronlippold fc032e2
chore(lint): scope four rules to the trees their model actually descr…
aaronlippold 3be0c67
style: hoist shared branch tails and drop redundant coercions
aaronlippold 6bcecdd
fix(frontend): stop valueToSeverity accepting any string as a severity
aaronlippold 94c6a72
style: hoist closures that capture nothing and drop dead spec exports
aaronlippold 16466e8
chore(lint): let Vue install its plugins and fixtures keep their URLs
aaronlippold bb6d7ad
fix(tests): run the store-sharing specs sequentially and await their …
aaronlippold 1c113e4
fix: render structured values instead of [object Object]
aaronlippold 545680a
chore(lint): let chai state assertions as properties in the e2e tree
aaronlippold 92a6a6f
style: make the flattening worklist explicit and re-export namespaces…
aaronlippold ab232e3
chore(lint): keep Vue 2's reactive writes and the password rules as t…
aaronlippold e5bafbd
fix(hdf): stop reversing the source controls in place and throw a rea…
aaronlippold 1b6541e
style: read files through Blob#text and use the modern DOM insertion API
aaronlippold b10cc42
style: test membership with includes and name what was implicit
aaronlippold b3caed1
style: prefer the direct array and regex forms across the converters
aaronlippold 0cbf555
fix(auth): restore the disabled-callback fallback and stop leaking a …
aaronlippold 3987161
chore(lint): treat the OIDC mock server as the CJS entry shell it is
aaronlippold cf217e7
fix(hdf): match a literal decimal point in the attestation frequency
aaronlippold 5b26fab
chore(lint): defer regex safety to the analyzer that models backtracking
aaronlippold 24a7833
test: fail loudly instead of asserting inside a narrowing check
aaronlippold 3cd35e9
fix(evaluations): await the group attachment instead of dropping its …
aaronlippold 1e57fee
ci: make lint blocking now that the repo is clean
aaronlippold 8694cd7
test: pin the two behavior fixes that shipped without coverage
aaronlippold 197e3dc
test: pin the remaining disclosed behavior changes
aaronlippold ed92b1f
docs(lint): rewrite the ESLint decisions record against the current c…
aaronlippold ea56457
docs(adr-005): mark the closed phases and record the reformat dependency
aaronlippold edc89ae
docs(adr-006): describe the crypto module as built
aaronlippold 42b8049
docs(plan): record the PR charter, execution order and effort
aaronlippold 46cb0fd
docs(plan): record where the Playwright migration already lives
aaronlippold 977025c
fix(groups): restore /groups/my ahead of /:id — GUI login was broken
aaronlippold 40e29b5
test(lint-sweep): pin three behavior changes the sweep shipped untested
aaronlippold 3090a5f
docs: regenerate LICENSE.md from the SAF template (disa, ai_assisted)
aaronlippold d52f618
docs(adr): accept ADR-008 — un-block login at the choke point (path A)
aaronlippold 80d0180
fix(frontend): stop login blocking on application data
aaronlippold 3a09a58
feat(backend): seed stable dev/test users behind a production guard
aaronlippold c7532b7
feat(backend): seed a demo group with owner and member
aaronlippold b01a7b6
fix(backend): require an authenticated session for the Tenable proxy
aaronlippold 3bcb788
fix(tenable): reject hosts absent from the configured allowlist
aaronlippold e2964ec
fix(tenable): stop following redirects on outbound requests
aaronlippold 2a4ea0a
docs: record the backend security workstream as in-scope for review
aaronlippold 55285eb
fix(tenable): filter outbound connections at connect time
aaronlippold b96cc25
docs: document the Tenable allowlist and address settings
aaronlippold 6c69c3c
docs(authn): cite the tracking card for the LDAP prefer-at disable
aaronlippold File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,204 @@ | ||
| name: Build RPM | ||
|
|
||
| # One workflow for both purposes, following redis/memtier_benchmark: | ||
| # every PR and master push proves the RPM still builds and installs, and a | ||
| # published release additionally uploads the artifacts. Publishing steps are | ||
| # gated on the event rather than split into a second workflow, so the thing | ||
| # that ships is the thing CI exercised. | ||
|
|
||
| on: | ||
| pull_request: | ||
| paths: | ||
| - 'packaging/**' | ||
| - 'VERSION' | ||
| - '.github/workflows/build-rpm.yml' | ||
| push: | ||
| branches: [master] | ||
| paths: | ||
| - 'packaging/**' | ||
| - 'VERSION' | ||
| - '.github/workflows/build-rpm.yml' | ||
| release: | ||
| types: [published] | ||
| workflow_dispatch: | ||
| inputs: | ||
| heimdall_cli_ref: | ||
| description: 'heimdall-cli ref to build against (tag, branch, or SHA)' | ||
| required: false | ||
| default: 'main' | ||
|
|
||
| permissions: | ||
| contents: read | ||
|
Check warning on line 31 in .github/workflows/build-rpm.yml
|
||
|
|
||
| env: | ||
| # Release builds must pin a tag. Everything else tracks main. | ||
| # This value is what the RPM records as the CLI it shipped. | ||
| HEIMDALL_CLI_REF: ${{ inputs.heimdall_cli_ref || 'main' }} | ||
|
|
||
| jobs: | ||
| build: | ||
| name: ${{ matrix.distro }} / ${{ matrix.arch }} | ||
| runs-on: ${{ matrix.runner }} | ||
| container: ${{ matrix.image }} | ||
| strategy: | ||
| fail-fast: false | ||
| matrix: | ||
| include: | ||
| - distro: el8 | ||
| image: rockylinux:8 | ||
| arch: x86_64 | ||
| runner: ubuntu-latest | ||
| - distro: el9 | ||
| image: rockylinux:9 | ||
| arch: x86_64 | ||
| runner: ubuntu-latest | ||
| # Native ARM runners — free for public repositories, and roughly | ||
| # 5-10x faster than QEMU emulation for a Node + Go build. The Go CLI | ||
| # is compiled natively here rather than cross-compiled. | ||
| - distro: el8 | ||
| image: rockylinux:8 | ||
| arch: aarch64 | ||
| runner: ubuntu-24.04-arm | ||
| - distro: el9 | ||
| image: rockylinux:9 | ||
| arch: aarch64 | ||
| runner: ubuntu-24.04-arm | ||
|
|
||
| steps: | ||
| - name: Install git (required before checkout in a bare container) | ||
| run: | | ||
| dnf install -y git | ||
| git --version | ||
|
|
||
| - uses: actions/checkout@v6 | ||
| with: | ||
| # Full history and tags: `make sources` archives the tag matching the | ||
| # VERSION file. A shallow clone has no tags and the build would fail. | ||
| fetch-depth: 0 | ||
| fetch-tags: true | ||
|
|
||
| - name: Mark workspace safe | ||
| run: git config --global --add safe.directory "$GITHUB_WORKSPACE" | ||
|
|
||
| - name: Install build dependencies | ||
| working-directory: packaging/rpm | ||
| run: make deps | ||
|
|
||
| - name: Install Go (for the heimdall-cli build) | ||
| run: dnf install -y golang | ||
|
|
||
| - name: Verify spec and repository versions agree | ||
| working-directory: packaging/rpm | ||
| run: make check-version | ||
|
|
||
| # Releases build from the tag matching VERSION. CI builds from HEAD, | ||
| # because on a feature branch the tag for an in-progress version does not | ||
| # exist yet. DEV=1 makes that explicit rather than silently producing an | ||
| # RPM that claims to be a release. | ||
| - name: Build RPM | ||
| working-directory: packaging/rpm | ||
| env: | ||
| HEIMDALL_CLI_REF: ${{ env.HEIMDALL_CLI_REF }} | ||
| run: | | ||
| if [ "${GITHUB_EVENT_NAME}" = "release" ]; then | ||
| make rpm | ||
| else | ||
| make rpm DEV=1 | ||
| fi | ||
|
|
||
| - name: Lint the built packages (advisory) | ||
| working-directory: packaging/rpm | ||
| continue-on-error: true | ||
| run: make lint-rpm | ||
|
|
||
| - name: Record what was built | ||
| working-directory: packaging/rpm | ||
| run: | | ||
| find rpmbuild/RPMS rpmbuild/SRPMS -name '*.rpm' -printf '%f\n' | sort | ||
| echo "heimdall-cli ref: ${HEIMDALL_CLI_REF}" | ||
|
|
||
| - uses: actions/upload-artifact@v7 | ||
| with: | ||
| name: rpm-${{ matrix.distro }}-${{ matrix.arch }} | ||
| path: | | ||
| packaging/rpm/rpmbuild/RPMS/**/*.rpm | ||
| packaging/rpm/rpmbuild/SRPMS/*.rpm | ||
| retention-days: 7 | ||
| if-no-files-found: error | ||
|
|
||
| # The highest-value check: install into a clean container with NO build | ||
| # dependencies pre-installed, so a missing Requires: fails here rather than on | ||
| # a customer's host. Verifies %files claims via rpm -ql. | ||
| smoke-test: | ||
| name: install ${{ matrix.distro }} / ${{ matrix.arch }} | ||
| needs: build | ||
| runs-on: ${{ matrix.runner }} | ||
| container: ${{ matrix.image }} | ||
| strategy: | ||
| fail-fast: false | ||
| matrix: | ||
| include: | ||
| - {distro: el8, image: rockylinux:8, arch: x86_64, runner: ubuntu-latest} | ||
| - {distro: el9, image: rockylinux:9, arch: x86_64, runner: ubuntu-latest} | ||
| - {distro: el8, image: rockylinux:8, arch: aarch64, runner: ubuntu-24.04-arm} | ||
| - {distro: el9, image: rockylinux:9, arch: aarch64, runner: ubuntu-24.04-arm} | ||
|
|
||
| steps: | ||
| - uses: actions/download-artifact@v8 | ||
| with: | ||
| name: rpm-${{ matrix.distro }}-${{ matrix.arch }} | ||
| path: rpms | ||
|
|
||
| - name: Install the package and its dependencies | ||
| run: | | ||
| dnf install -y epel-release || true | ||
| rpm_file=$(find rpms -name "heimdall-server-*.${{ matrix.arch }}.rpm" | head -1) | ||
| test -n "$rpm_file" || { echo "::error::no binary RPM found"; exit 1; } | ||
| echo "Installing $rpm_file" | ||
| dnf install -y "$rpm_file" | ||
|
|
||
| - name: Verify the package contents match its manifest | ||
| run: | | ||
| rpm -q heimdall-server | ||
| rpm -V heimdall-server || true # config file changes are expected | ||
| echo "--- files ---" | ||
| rpm -ql heimdall-server | head -40 | ||
| echo "--- heimdall-cli is present and reports provenance ---" | ||
| test -x /usr/bin/heimdall-cli | ||
| /usr/bin/heimdall-cli --version | ||
|
|
||
| - name: Verify the unit file is valid | ||
| run: | | ||
| dnf install -y systemd | ||
| systemd-analyze verify /usr/lib/systemd/system/heimdall-server.service || true | ||
|
|
||
| publish: | ||
| name: Attach RPMs to the release | ||
| needs: [build, smoke-test] | ||
| if: github.event_name == 'release' | ||
| runs-on: ubuntu-latest | ||
| permissions: | ||
| contents: write # upload release assets | ||
| id-token: write # build provenance attestation | ||
| attestations: write | ||
| steps: | ||
| - uses: actions/download-artifact@v8 | ||
| with: | ||
| pattern: rpm-* | ||
| path: rpms | ||
| merge-multiple: true | ||
|
|
||
| - name: List artifacts | ||
| run: find rpms -name '*.rpm' -printf '%f\n' | sort | ||
|
|
||
| # The modern equivalent of GPG-signing in CI: a signed, verifiable | ||
| # statement of what built these artifacts and from where. Same | ||
| # supply-chain story as npm provenance, without a release key in secrets. | ||
| - uses: actions/attest-build-provenance@v4 | ||
| with: | ||
| subject-path: 'rpms/**/*.rpm' | ||
|
|
||
| - uses: softprops/action-gh-release@v3 | ||
|
Check failure on line 201 in .github/workflows/build-rpm.yml
|
||
|
github-advanced-security[bot] marked this conversation as resolved.
Fixed
|
||
| with: | ||
| files: rpms/**/*.rpm | ||
| fail_on_unmatched_files: true | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.