Skip to content

Sync main to release v1.0 - #7

Merged
AhmedSeemalK merged 9 commits into
mainfrom
release-1.0
Sep 7, 2026
Merged

AhmedSeemalK merged 9 commits into
mainfrom
release-1.0

Conversation

@AhmedSeemalK

Copy link
Copy Markdown
Contributor

This pull request introduces several new GitHub Actions workflows to enhance the project's security and code quality automation. It adds workflows for Ansible Lint, Bandit, Checkov, Scorecard, ShellCheck, and Trivy, each carefully pinned to specific tool and action versions for reproducibility and security. Additionally, it updates the project branding in the README.md to use the new "Intel® AI for Enterprise Inference" name.

New security and code quality workflows:

  • Security scanning and code quality automation
    • Added .github/workflows/ansible-lint.yml to lint Ansible roles and publish findings to GitHub Security (soft-fail for initial rollout).
    • Added .github/workflows/bandit.yml for Python security scanning, including scheduled weekly runs and SARIF upload for findings.
    • Added .github/workflows/checkov.yml for Kubernetes, GitHub Actions, and secrets misconfiguration scanning, with findings uploaded to GitHub Security.
    • Added .github/workflows/scorecard.yml to run OpenSSF Scorecard for supply-chain security posture, publishing results to GitHub Security.
    • Added .github/workflows/shellcheck.yml for shell script linting, including custom logic to accurately detect and analyze scripts and helpers.
    • Added .github/workflows/trivy.yml for vulnerability, secret, misconfiguration, and license scanning, with separate scans and SARIF uploads.

Project branding update:

  • Documentation
    • Updated README.md to use the new project name "Intel® AI for Enterprise Inference" and updated related badges and section headers accordingly. [1] [2]

Mushtaq-BGA and others added 8 commits August 27, 2026 18:19
Docs: rename to Intel® AI for Enterprise Inference + release doc fixes
Co-authored-by: release-bot <release-bot@users.noreply.github.com>
Co-authored-by: release-bot <release-bot@users.noreply.github.com>
Add SARIF-publishing security scans for the release branch, following the
pattern already used across the intel org (harden-runner + per-tool
workflow files + OpenSSF Scorecard):

- trivy       vulnerabilities, secrets, misconfig, licenses (filesystem)
- bandit      Python security findings
- checkov     Kubernetes / Actions / secrets IaC checks
- shellcheck  shell script correctness and quoting
- ansible-lint Ansible role and playbook hygiene
- scorecard   OpenSSF supply-chain posture rating

Every action is pinned to a full commit SHA and every tool to an exact
version, so a given commit always scans the same way and version bumps are
explicit, reviewable diffs. ShellCheck is fetched from its upstream release
and checksum-verified rather than installed via apt, whose version drifts
with the runner image.

Each scan was run locally against the tree before landing, and two were
retuned as a result:

- checkov drops the `helm` framework. Checkov renders charts into a random
  temp dir and reports paths relative to it, so all 50 (ai-solutions) / 40
  (inference) findings pointed at files that do not exist in the repo --
  unanchorable in the Security tab and re-reported as new every run. They
  were also entirely in vendored upstream charts. Trivy's misconfig scanner
  covers chart misconfiguration with correct paths.
- ansible-lint skips style-only rule families, which accounted for 1158 of
  1163 findings in ai-solutions and 496 of 502 in inference. name[casing]
  alone fired 350 times against the deliberate `role | action | desc`
  naming convention.

Jobs are soft-fail for the initial rollout: findings surface under
Security -> Code scanning instead of blocking the branch, so the existing
backlog can be triaged before any check is made required.

CodeQL is intentionally not added here - it already runs via code scanning
default setup on both repositories.
Triage of every finding the scans produced, separating defects that cannot be
true from ones worth a maintainer's time. Every remaining finding was checked by
hand against the source and is real.

ShellCheck (33 -> 7)
  Discovery now reads shebangs as well as *.sh suffixes: model_manager/model-
  manager is the largest script in the tree at 1429 lines and a *.sh glob never
  saw it.

  Entry points are linted with -x so the helper scripts they source are
  followed, plus a --source-path list -- the source statements are built from
  "$MM_LIB/..." which ShellCheck cannot resolve unaided, and without it 7
  globals that model_manager/lib/ does set and model-manager does read looked
  unused.

  The helper scripts under model_manager/lib/ are linted on their own.
  ShellCheck sees one file at a time, so a global a helper sets for its caller
  reads as unused: 26 of the 31 SC2034 hits were that. Disabling SC2034 for
  those files was too blunt -- it also hid four globals that genuinely are
  written and never read anywhere. Each hit is now checked individually and
  suppressed only when another file demonstrably reads that variable, limited to
  SHOUTY_CASE names of 3+ characters since a short lowercase name such as a
  loop's `i` collides textually with unrelated files.

  Kept, all verified by grepping the whole tree:
  - config.sh:266  RUNTIME_DEVICE, parsed from the runtime JSON beside five
    siblings that are all consumed, then never read -- cpu/gpu selection is
    read and dropped.
  - nri.sh:82,83   NRI_ADVANCED_MODE and NRI_HIDE_HT, both named in the
    function's own "Sets:" header comment as outputs, neither consumed. The
    Python side reads the MM_NRI_HIDE_HT environment variable, not this.
  - nri.sh:241     NRI_TARGET_NODE, set beside NRI_POLICY_NAME which is used.
  - helpers.sh:244 `local i` in a `for i in $(seq 1 24)` retry loop whose body
    never uses it.
  - helpers.sh:88, routing.sh:288  SC2155.

  No file under model_manager/ was modified.

Bandit (0 -> 0)
  Skips B404 (importing subprocess is not a defect) and B603, which fires on
  the recommended argv-list form and cannot judge whether input is trusted.
  shell=True and friends (B602/B604/B605/B609) stay enabled. Severity is
  deliberately not filtered, since real tests such as B105 report LOW.

Trivy (17 -> 1)
  `limit-severities-for-sarif` defaults to false, and unset it makes the action
  drop --severity for the SARIF run alone -- the table reported 0 findings
  while the uploaded SARIF carried all 17 at LOW/MEDIUM, every one below the
  declared CRITICAL,HIGH threshold. Now split in two: CVEs, secrets and
  licences at CRITICAL,HIGH with the limit applied; misconfiguration at every
  severity, because Trivy rates nearly every Kubernetes check LOW or MEDIUM and
  the same threshold would silence that scanner outright. Noise is controlled
  by scope instead -- vendored charts/litellm-helm accounted for 16 of the 17
  and is now skipped, matching the Checkov workflow.

  Kept: KSV-0106 in roles/llm_services/files/runtimes/vllm-runtime.yaml, the
  one finding in code this repo owns.

ansible-lint, Checkov
  No false positives; the 4 ansible-lint findings stand.

Verified locally against the pinned tool versions, under `bash -e` as Actions
runs it. actionlint clean.
Three points from @mramotowski on #6, applied to both
repos so the two stay identical.

Drop the cross-repo reference in the ansible-lint comment. Justifying a skip
list in one repo by citing another repo's finding count was noise; each file now
carries only its own numbers, measured fresh.

Note that `schedule` only fires from the default branch. Correct, and worth
saying in the file rather than leaving as a trap: the weekly crons stay dormant
until these workflows also land on `main`. The `push` and `pull_request`
triggers are unaffected. Added to all four scheduled workflows.

Scan once in Bandit instead of twice. The second invocation existed only to
print something human-readable, and re-scanned the whole tree to do it. The
summary is now rendered with `jq` from the SARIF the first scan already wrote,
which also keeps the two outputs from ever disagreeing:

    Bandit: 1 finding(s)
      note  B607  roles/postgresql/files/provision_db.py:34  Starting a process
                                                             with a partial
                                                             executable path

No change to what any scan reports. Verified by extracting the generated Bandit
step from the YAML and running it verbatim under `bash -e` in both repos --
1 finding in ai-solutions, 0 in inference, and the summary degrades cleanly to
"0 finding(s)". ansible-lint still reports 5 and 4. actionlint clean.
The counts in the skip-list rationale were measured locally, where
ansible-lint silently skips schema validation because it cannot fetch the
JSON schemas. Two schema[meta] findings therefore only appear in CI:
roles/langfuse and roles/litellm are the only role metas declaring
galaxy_info, and the schema requires 'author' whenever it is present.

Baseline is 501 findings unfiltered and 6 substantive, not 499 and 4.
name[casing] is unchanged at 350. ai-solutions is unaffected -- schema is
an unskippable rule, so CI's filtered run would have surfaced any schema
finding there, and it reported none.

The two schema[meta] findings are left unfixed, consistent with every
other genuine finding this PR reports rather than resolves.
ci: add pinned security scanning workflows

@psurabh psurabh left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@AhmedSeemalK
AhmedSeemalK merged commit e4ea462 into main Sep 7, 2026
15 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants