Skip to content

feat: onboard FullSend JIRA integration - #324

Merged
krishvoor merged 2 commits into
openshift:masterfrom
samanthajayasinghe:fix/323-jira-integration
Aug 25, 2026
Merged

feat: onboard FullSend JIRA integration#324
krishvoor merged 2 commits into
openshift:masterfrom
samanthajayasinghe:fix/323-jira-integration

Conversation

@samanthajayasinghe

@samanthajayasinghe samanthajayasinghe commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Adds scheduled GitHub Actions workflow (.github/workflows/fullsend-poll-jira.yaml) that polls JIRA every 5 minutes for ocm-agent-operator issues
  • Uses the JQL query from ROSAENG-62420: Onboard FullSend JIRA Integration #323 to filter for Bug/Story/Feature types in ROSAENG project
  • Excludes security-sensitive issues (Vulnerability/Weakness types, security/cve/embargo labels)

Prerequisites

The following secrets/variables must be configured in the repo (Settings > Secrets and variables > Actions):

Name Type Value
JIRA_TOKEN Secret Jira API token
JIRA_USER_EMAIL Secret Email associated with the token
JIRA_BASE_URL Variable Jira instance URL (e.g. https://issues.redhat.com)

Test plan

  • Verify JIRA secrets/variables are configured in repo settings
  • Trigger workflow manually via workflow_dispatch and confirm it runs without errors
  • Verify security-sensitive issues are excluded from polling results

Closes #323

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • Added automated Jira polling every five minutes, with support for manual execution.
    • Added processing to identify eligible work items and trigger the appropriate stage workflows.
    • Added safeguards for empty results and unavailable workflows, along with dispatch tracking and serialized execution.
    • Improved automated pipeline consistency by updating its underlying workflow configuration.

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Changes

Fullsend Jira integration

Layer / File(s) Summary
Workflow triggers and Jira polling
.github/workflows/fullsend-poll-jira.yaml
Adds scheduled and manual triggers, permissions, concurrency, Fullsend installation, Jira credentials, and the configured JQL filter.
Stage workflow dispatch
.github/workflows/fullsend-poll-jira.yaml
Processes dispatch records, builds issue metadata, resolves fullsend-stage workflows, skips missing stages, and dispatches matching workflows through GitHub CLI.
Tekton pipeline revision
.tekton/ocm-agent-operator-agentic-sdlc-check-pull-request.yaml
Updates the referenced boilerplate pipeline revision.

Estimated code review effort: 3 (Moderate) | ~15–30 minutes

Sequence Diagram(s)

sequenceDiagram
  participant GitHubActions
  participant Fullsend
  participant Jira
  participant GitHubCLI
  GitHubActions->>Fullsend: Run Jira poll with credentials and JQL
  Fullsend->>Jira: Query matching issues
  Jira-->>Fullsend: Return issue records
  Fullsend-->>GitHubActions: Write dispatches.json and .fullsend
  GitHubActions->>GitHubCLI: Resolve workflows by fullsend-stage marker
  GitHubCLI-->>GitHubActions: Return matching workflows
  GitHubActions->>GitHubCLI: Dispatch stage workflows with issue metadata
Loading

Suggested reviewers: ravitri, theundeadking, dustman9000


Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (1 error, 1 warning)

Check name Status Explanation Resolution
Ote Binary Stdout Contract ❌ Error Process-level code writes to stdout: main.go configures zap with os.Stdout, and fips.go init() calls fmt.Println. Redirect the main logger and the FIPS startup message to os.Stderr, or remove the startup message, before any process-level logging.
Out of Scope Changes check ⚠️ Warning The Tekton boilerplate revision update is unrelated to the FullSend JIRA integration objectives. Move the boilerplate revision update to a separate pull request or link it to a relevant objective.
✅ Passed checks (13 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly identifies the main change: onboarding the FullSend JIRA integration.
Linked Issues check ✅ Passed The workflow configures scheduled and manual FullSend polling with the specified ROSAENG query and security exclusions.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Stable And Deterministic Test Names ✅ Passed The pull request adds no Ginkgo test declarations or test-title changes; its changed lines update pipeline/image references only.
Test Structure And Quality ✅ Passed The pull request changes only workflow and Tekton YAML; no Ginkgo test files, It blocks, or test assertions are added or modified, so this check is not applicable.
Microshift Test Compatibility ✅ Passed The complete PR diff adds only workflow and configuration files; it contains no Go, e2e, or Ginkgo test changes, so MicroShift compatibility is not applicable.
Single Node Openshift (Sno) Test Compatibility ✅ Passed The PR diff adds no Go or Ginkgo test files and no It/Describe/Context/When constructs; it changes only workflow and boilerplate configuration.
Topology-Aware Scheduling Compatibility ✅ Passed The pull request changes a GitHub Actions workflow and a Tekton pipeline reference only; neither adds deployment scheduling constraints, replicas, affinity, taints, node selectors, topology spread,...
Ipv6 And Disconnected Network Test Compatibility ✅ Passed The pull request adds no Ginkgo or e2e tests; changed files are configuration and Dockerfiles, so this compatibility check is not applicable.
No-Weak-Crypto ✅ Passed The PR adds workflow orchestration only; no MD5, SHA1, DES, RC4, 3DES, Blowfish, ECB, custom crypto, or secret comparisons are present.
Container-Privileges ✅ Passed The PR adds no privileged, hostPID, hostNetwork, hostIPC, SYS_ADMIN, or allowPrivilegeEscalation settings; changed Dockerfiles run final containers as UID 1001.
No-Sensitive-Data-In-Logs ✅ Passed Workflow logs only dispatch status, workflow names, stages, and Jira issue keys; JIRA_TOKEN, email, URL, and payload are not echoed or traced.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands.

@openshift-ci
openshift-ci Bot requested review from TheUndeadKing and ravitri August 5, 2026 23:08
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 5, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 11:09 PM UTC · Completed 11:26 PM UTC
Commit: c9dd50d · View workflow run →

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/fullsend-poll-jira.yaml:
- Line 19: Update the actions/checkout step in the workflow to reference a
reviewed full commit SHA instead of the floating v4 tag, while preserving the
existing checkout configuration.
- Line 19: Update the actions/checkout step in the workflow to set
persist-credentials to false and replace the floating `@v4` reference with the
full commit SHA for the selected checkout release.
- Around line 28-42: Add a pinned SAST/SCA scanner action or reusable security
workflow between the “Poll Jira” and “Dispatch agent workflows” steps. Configure
it to scan the checked-out repository and fail the job when vulnerabilities or
scan errors are detected, while preserving the existing dispatch step only after
a successful scan.
- Around line 73-89: Add a workflow with a `workflow_dispatch` trigger and mark
it using `# fullsend-stage: <stage>` so the discovery loop in the dispatcher can
find it. Define dispatch inputs named `event_type`, `source_repo`, and
`event_payload`, matching the values passed by `gh workflow run`; use the
appropriate stage marker expected by the Jira records.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Enterprise

Run ID: 7fde4b81-670d-4d6a-9c12-a30dcd8e5681

📥 Commits

Reviewing files that changed from the base of the PR and between 7f9e641 and c9dd50d.

📒 Files selected for processing (1)
  • .github/workflows/fullsend-poll-jira.yaml

Comment thread .github/workflows/fullsend-poll-jira.yaml Outdated
Comment thread .github/workflows/fullsend-poll-jira.yaml
Comment thread .github/workflows/fullsend-poll-jira.yaml Outdated
@codecov-commenter

codecov-commenter commented Aug 5, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 65.39%. Comparing base (0245772) to head (8689dbd).

Additional details and impacted files

Impacted file tree graph

@@           Coverage Diff           @@
##           master     #324   +/-   ##
=======================================
  Coverage   65.39%   65.39%           
=======================================
  Files          23       23           
  Lines        1598     1598           
=======================================
  Hits         1045     1045           
  Misses        473      473           
  Partials       80       80           
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@fullsend-ai-review

fullsend-ai-review Bot commented Aug 5, 2026

Copy link
Copy Markdown

Review

Findings

Medium

  • [protected-path] .github/workflows/fullsend-poll-jira.yaml — This file is under .github/, a protected path. The PR links to issue ROSAENG-62420: Onboard FullSend JIRA Integration #323 and explains the rationale for the change. Human approval is always required for protected-path changes, regardless of context.

Low

  • [edge-case] .github/workflows/fullsend-poll-jira.yaml:104 — When a dispatch record has a null or missing iid field, the expression (.iid // 0) | tonumber silently falls back to 0, producing issue.number = 0 in the event payload. While issue_key is the primary routing identifier and is validated, passing an invalid numeric ID to downstream consumers may cause confusion.
    Remediation: Add a validation check that skips the record (with a warning) if issue_id is 0 after coercion.

  • [logic-error] .github/workflows/fullsend-poll-jira.yaml:130grep -qF "# fullsend-stage: ${stage}" performs a fixed-string substring match. If two workflow files contain stage markers with a prefix relationship (e.g., plan and plan-review), the shorter stage name could incorrectly match the longer one. Currently no consumer workflows exist, making this theoretical.
    Remediation: Use a regex with a word boundary or end-of-line anchor for exact matching.

  • [supply-chain] .github/workflows/fullsend-poll-jira.yaml:51 — The fullsend binary checksum verification downloads checksums.txt from the same release as the binary. This guards against download corruption but not upstream compromise — consistent with the existing trust model (the repo already trusts fullsend-ai/fullsend via SHA-pinned reusable workflow).
    Remediation: Consider pinning a known-good SHA256 hash directly in the workflow.

  • [naming-convention] .github/workflows/fullsend-poll-jira.yaml — Workflow display name fullsend jira poll uses a different naming pattern from the existing fullsend workflow. Minor inconsistency.

Previous run

Review

Findings

Medium

  • [dead code / runtime logic error] .github/workflows/fullsend-poll-jira.yaml:76 — The "Dispatch agent workflows" step searches all workflow files for a line matching # fullsend-stage: ${STAGE} (via grep -qxF), but no workflow file in the repository currently contains any fullsend-stage: comment. Every dispatch record will hit the "No workflow found" warning branch and be skipped. The dispatch feature is non-functional until stage-comment-annotated workflows are added.
    Remediation: Either add # fullsend-stage: <stage-name> comments to the workflow files that should handle each stage, or document the follow-up dependency explicitly so this PR is not merged prematurely.

  • [Supply chain / unpinned dependency] .github/workflows/fullsend-poll-jira.yaml:26 — The fullsend binary is downloaded from fullsend-ai/fullsend GitHub releases using a glob pattern (fullsend_*_linux_amd64.tar.gz) with no version pin, tag reference, or checksum verification. Any new release — including one from a compromised maintainer account — would be automatically pulled and executed with the workflow's permissions (actions: write, contents: read, plus github.token access).
    Remediation: Pin the download to a specific release tag (e.g., gh release download v<version> --repo ...) and verify the artifact against a known checksum or cosign signature.

  • [protected-path] .github/workflows/fullsend-poll-jira.yaml — This PR adds a file under the protected .github/ path. The PR links to issue ROSAENG-62420: Onboard FullSend JIRA Integration #323 and provides rationale for the change, but human approval is always required for modifications to governance and infrastructure paths regardless of context.

Low

  • [GHA workflow command injection] .github/workflows/fullsend-poll-jira.yaml:84 — The ::warning:: workflow command interpolates ${STAGE} and ${RESOURCE_KEY}, both derived from Jira data via dispatches.json. An attacker influencing Jira fields could inject workflow commands, though practical impact is limited — dangerous commands like ::set-env:: are disabled by default since 2020, leaving only ::add-mask:: and annotation commands as vectors.

  • [error handling gap] .github/workflows/fullsend-poll-jira.yaml:66ISSUE_ID falls back to 0 when .iid is absent or null (jq -r '.iid // 0'). This 0 is passed as issue.number in the event payload. Downstream consumers may silently treat number: 0 as a valid issue identifier.

  • [Injection via untrusted data] .github/workflows/fullsend-poll-jira.yaml:87EVENT_TYPE from Jira-sourced data is passed directly to gh workflow run -f. Downstream workflows receiving this value may use it unsafely. Validate EVENT_TYPE against an expected allowlist and ensure ISSUE_KEY matches the Jira key format ([A-Z]+-[0-9]+).

  • [shell-idiom-consistency] .github/workflows/fullsend-poll-jira.yaml:24 — The "Install fullsend" step omits set -euo pipefail, while the "Dispatch agent workflows" step includes it. The pipe (gh release download ... | tar xz) could silently swallow download failures without pipefail.

  • [yaml-formatting] .github/workflows/fullsend-poll-jira.yaml:1 — The existing fullsend.yaml uses a YAML document separator --- after its header comment block. The new workflow omits this separator, creating a minor inconsistency between the two fullsend-related workflows.

  • [naming-consistency] .github/workflows/fullsend-poll-jira.yaml:1 — Mixed capitalization: workflow name uses "Jira" while environment variables use "JIRA" (JIRA_TOKEN, JIRA_BASE_URL) and the PR title uses "JIRA". Atlassian officially rebranded to "Jira" in 2017, so the workflow name is correct, but consistency within the file is worth noting.

  • [missing-documentation] .claude/agents/ci-agent.md:22 — The CI Agent documentation enumerates CI/CD components (Tekton Pipelines) but does not mention GitHub Actions workflows. This is partly a pre-existing gap (the existing fullsend.yaml is also not listed).

  • [missing-documentation] .github/workflows/fullsend-poll-jira.yaml — Required repository secrets/variables (JIRA_TOKEN, JIRA_USER_EMAIL, JIRA_BASE_URL) are documented in the PR body but not in any in-repo documentation file.


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run (2)

Review

Findings

High

  • [supply-chain] .github/workflows/fullsend-poll-jira.yaml:26 — Unpinned third-party binary download and execution. The workflow downloads the fullsend binary from fullsend-ai/fullsend GitHub releases using a glob pattern (fullsend_*_linux_amd64.tar.gz) without pinning to a specific version or verifying a checksum/signature. This binary then runs with access to JIRA_TOKEN and JIRA_USER_EMAIL secrets. A compromised release could exfiltrate credentials. Notably, the existing fullsend.yaml pins its reference with a SHA (3cfa255ab4cc8190670585ea42da529119251632), making this inconsistency more concerning.
    Remediation: Pin to a specific release tag (e.g., gh release download v0.32.0 --repo fullsend-ai/fullsend) AND verify checksum against a known-good hash before execution.

Medium

  • [injection] .github/workflows/fullsend-poll-jira.yaml:83 — GHA workflow command injection via unsanitized RESOURCE_KEY. RESOURCE_KEY is extracted from Jira-sourced data and interpolated directly into a ::warning:: workflow command without sanitization. If a Jira resource_key contains %0A/%0D sequences or :: delimiters, an attacker with write access to the ROSAENG Jira project could inject workflow commands.
    Remediation: Sanitize RESOURCE_KEY before interpolating into workflow commands by stripping or encoding :: sequences, %0A/%0D, and control characters: RESOURCE_KEY=$(echo "$RESOURCE_KEY" | tr -d '\n\r' | sed 's/:://g')

  • [runtime mechanism failure] .github/workflows/fullsend-poll-jira.yaml:78 — The dispatch loop searches for workflow files containing a comment matching exactly # fullsend-stage: ${STAGE} (grep -qxF), but no existing workflow file in the repository contains any fullsend-stage: comment. This means the dispatch loop will always hit the "No workflow found" warning and skip every record, making the poll-and-dispatch pipeline a no-op until stage-specific workflow files are added.
    Remediation: Either add workflow files with # fullsend-stage: <stage> comments for each role defined in .fullsend/config.yaml (triage, coder, review, fix, retro, prioritize), or document that this is scaffolding that depends on future stage-specific workflow files.

Low

  • [permission-expansion] .github/workflows/fullsend-poll-jira.yaml:9 — New workflow grants actions:write permission on a schedule trigger. While needed for gh workflow run dispatches and consistent with the existing fullsend.yaml (which has even broader permissions), noted for awareness.

  • [error-handling-gap] .github/workflows/fullsend-poll-jira.yaml:66ISSUE_ID is extracted with jq -r '.iid // 0' and passed via --argjson. If .iid holds a non-numeric value, --argjson will fail to parse it, causing the script to abort under set -euo pipefail and skipping all remaining dispatches in the batch.
    Remediation: Use --arg instead of --argjson if the downstream consumer can accept a string, or add explicit type coercion.


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run (3)

Review

Findings

High

  • [supply-chain] .github/workflows/fullsend-poll-jira.yaml:26 — The fullsend binary is downloaded from the latest release of fullsend-ai/fullsend without version pinning or checksum verification (gh release download --repo fullsend-ai/fullsend -p 'fullsend_*_linux_amd64.tar.gz'). If the upstream repository is compromised, a malicious binary would execute with access to JIRA_TOKEN, JIRA_USER_EMAIL, and github.token (actions:write + contents:read). The existing fullsend.yaml workflow pins its reusable workflow reference to a specific SHA (@3cfa255ab4cc8190670585ea42da529119251632), establishing a project convention of pinning fullsend dependencies. This unpinned download also violates the project's "prefer deterministic tooling" and "use fixed versions" guidelines.
    Remediation: Pin the download to a specific release tag (e.g., gh release download v0.32.0 --repo fullsend-ai/fullsend ...) and verify the binary checksum against a known-good value.

Medium

  • [injection] .github/workflows/fullsend-poll-jira.yaml:83 — GHA workflow command injection via unsanitized Jira-derived values. STAGE and RESOURCE_KEY are extracted from dispatches.json (Jira issue data) and interpolated into ::warning:: (line 83) and echo (line 86) commands without sanitization. An attacker with write access to JIRA issues in the ROSAENG project with the ocm-agent-operator component could craft values containing %0A::add-mask:: or %0A::error:: sequences. GitHub Actions scans all stdout for :: command patterns. Verified safe: dispatched counter (line 95, integer), WORKFLOW_NAME (constrained by basename).
    Remediation: Sanitize STAGE, RESOURCE_KEY, and ISSUE_KEY after extraction from JSON by stripping ::, %0A, %0D, and control characters (e.g., STAGE=$(echo "$record" | jq -r '.stage' | tr -d '\n\r' | sed 's/:://g')). Alternatively, write messages to $GITHUB_STEP_SUMMARY instead of using ::warning::/::notice:: workflow commands.

  • [protected-path] .github/workflows/fullsend-poll-jira.yaml — PR modifies a file under .github/, a protected path requiring human approval. The PR links to issue ROSAENG-62420: Onboard FullSend JIRA Integration #323 and explains the rationale for the change (onboarding FullSend JIRA integration). Human approval is always required for protected-path changes, regardless of context.

Low

  • [naming-convention] .github/workflows/fullsend-poll-jira.yaml:1 — Workflow name fullsend Jira poll uses a different naming style from the existing fullsend workflow. With only one existing workflow the convention is weak, but aligning naming style would improve consistency as the workflow count grows.

  • [permissions-scope] .github/workflows/fullsend-poll-jira.yaml:8actions: write and contents: read are set at the workflow level. With a single job, this is functionally identical to job-level permissions, but job-level scoping is the more precise pattern used by the existing workflow's secondary job.


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run (4)

Review

Findings

Medium

  • [injection] .github/workflows/fullsend-poll-jira.yaml:81 — GHA workflow command injection via unsanitized Jira-sourced data. STAGE and RESOURCE_KEY from dispatches.json are interpolated into ::warning:: and ::notice:: workflow commands without sanitization for GHA command delimiters (::) or encoded newlines (%0A/%0D). An attacker who can create matching Jira issues could inject arbitrary workflow annotations.
    Remediation: Sanitize variables before interpolating into workflow commands, or use $GITHUB_STEP_SUMMARY instead of inline ::warning:: syntax.

  • [injection] .github/workflows/fullsend-poll-jira.yaml:75 — Jira-sourced data flows into gh workflow run dispatch without input validation. STAGE selects which workflow to dispatch, EVENT_TYPE is passed as a -f parameter, and ISSUE_URL is constructed from unvalidated JIRA_BASE_URL + ISSUE_KEY. An attacker who can create matching Jira issues could trigger dispatches with controlled event_type values.
    Remediation: Validate STAGE against an allowlist of known stage names. Validate EVENT_TYPE against expected values. Validate ISSUE_KEY matches ^[A-Z]+-[0-9]+$ format.

  • [supply-chain] .github/workflows/fullsend-poll-jira.yaml:25 — The fullsend binary is installed by downloading the latest release from fullsend-ai/fullsend without version pinning or checksum verification. A compromised upstream repository would result in executing an attacker-controlled binary with access to JIRA_TOKEN, JIRA_USER_EMAIL, and github.token. The existing fullsend.yaml pins its reusable workflow to a specific SHA, establishing a precedent for pinning.
    Remediation: Pin to a specific release tag (gh release download v<version>) and verify the binary's checksum.

  • [secret-exposure] .github/workflows/fullsend-poll-jira.yaml:30JIRA_TOKEN and JIRA_USER_EMAIL secrets are exposed to the Poll Jira step which runs the unpinned fullsend binary. Same root cause as the supply-chain finding — pin the binary to mitigate.
    Remediation: Pin the fullsend binary version and verify its integrity.

  • [consumer-completeness] .github/workflows/fullsend-poll-jira.yaml:75 — No workflow file in the repository contains a # fullsend-stage: comment. The dispatch loop will always emit warnings and dispatch zero workflows — the feature is inert as shipped.
    Remediation: Either add stage-annotated workflow files in this or a prerequisite PR, or document that consuming workflows will land separately.

  • [logic-error] .github/workflows/fullsend-poll-jira.yaml:75grep -qxF uses -x (match entire line), requiring the # fullsend-stage: comment to be the complete line with no leading/trailing whitespace. If target workflows indent this comment (common in YAML), the match silently fails.
    Remediation: Remove the -x flag: grep -qF "# fullsend-stage: ${STAGE}" "$wf".

  • [protected-path] .github/workflows/fullsend-poll-jira.yaml — This PR modifies a file under the protected path .github/. The PR links to issue ROSAENG-62420: Onboard FullSend JIRA Integration #323 and explains the rationale. Human approval is always required for protected-path changes regardless of context.

Low

  • [permission-expansion] .github/workflows/fullsend-poll-jira.yaml:9actions:write at the top level applies to all steps including the one running the unpinned fullsend binary. GHA does not support per-step permissions; splitting into two jobs would add complexity.

  • [naming-convention] .github/workflows/fullsend-poll-jira.yaml:1 — The existing fullsend.yaml includes a header comment block and YAML document separator (---). This workflow has neither, creating inconsistency. Note: a descriptive comment (not a copy of the auto-generated header) would be appropriate.

  • [error-handling] .github/workflows/fullsend-poll-jira.yaml:86 — Under set -e, a transient gh workflow run failure aborts the entire step, preventing remaining dispatches from being processed.

  • [edge-case] .github/workflows/fullsend-poll-jira.yaml:64ISSUE_KEY derived via ${RESOURCE_KEY#issue-} only strips an issue- prefix. Resource keys with other prefixes produce potentially invalid Jira URLs.

  • [fail-open] .github/workflows/fullsend-poll-jira.yaml:32JIRA_BASE_URL from vars.JIRA_BASE_URL is not validated. If empty or malformed, malformed URLs propagate into dispatched workflows.

  • [shell-variable-naming] .github/workflows/fullsend-poll-jira.yaml:59 — Local loop variables (STAGE, RESOURCE_KEY, etc.) use UPPER_CASE while other locals (dispatched, count, record) use lowercase. Convention reserves UPPER_CASE for environment variables.

  • [error-handling-idiom] .github/workflows/fullsend-poll-jira.yaml:33 — The Poll Jira step omits set -euo pipefail, unlike the Dispatch step and existing fullsend.yaml convention.


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run (5)

Review

Findings

High

  • [logic-error] .github/workflows/fullsend-poll-jira.yaml:75 — The dispatch loop searches all workflow files for a # fullsend-stage: ${STAGE} comment using grep -qxF, but no workflow file in this repository contains any fullsend-stage comment. Every dispatch record will hit the "No workflow found" branch and be skipped — the entire dispatch mechanism is non-functional. The workflow will poll Jira every 5 minutes but never dispatch anything.
    Remediation: Either add # fullsend-stage: <stage-name> comments to the target workflow files that should receive dispatches, or if target workflows will be added in a follow-up PR, document this dependency and consider guarding the workflow until consumers exist.

Medium

  • [consumer-completeness] .github/workflows/fullsend-poll-jira.yaml:88 — Even if fullsend-stage comments were added, gh workflow run passes -f event_type, -f source_repo, and -f event_payload. No workflow in this repository defines a workflow_dispatch trigger with these input parameters. The existing fullsend.yaml triggers on issues, issue_comment, pull_request_target, and pull_request_review — not workflow_dispatch.
    Remediation: Ensure target workflows define workflow_dispatch with inputs for event_type, source_repo, and event_payload.

  • [supply-chain] .github/workflows/fullsend-poll-jira.yaml:26 — The workflow downloads and executes a binary from fullsend-ai/fullsend releases using a glob pattern without version pinning or checksum verification. A compromise of the upstream repo could deliver a malicious binary with access to JIRA_TOKEN, JIRA_USER_EMAIL, and github.token. This contradicts the repo's convention — fullsend.yaml pins its reusable workflow to a specific SHA (@3cfa255...).
    Remediation: Pin the download to a specific release tag (gh release download v0.32.0 --repo fullsend-ai/fullsend ...) and verify the binary's checksum.

  • [workflow-command-injection] .github/workflows/fullsend-poll-jira.yaml:82 — The ::warning:: command (line 82) and echo (line 87) interpolate unsanitized Jira-derived variables (STAGE, RESOURCE_KEY/ISSUE_KEY). If Jira metadata contains %0A or :: sequences, an attacker could inject GitHub Actions workflow commands.
    Remediation: Sanitize Jira-derived variables before interpolating — strip newlines and replace :: sequences, or use printf '%s\n' instead of workflow commands.

  • [version-pinning] .github/workflows/fullsend-poll-jira.yaml:19 — The existing fullsend.yaml pins external actions to full commit SHAs. This file uses actions/checkout@v4 (mutable tag), inconsistent with the repo's pinning convention.
    Remediation: Pin to full SHA, e.g., actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2.

  • [protected-path] .github/workflows/fullsend-poll-jira.yaml — This PR modifies files under the .github/ protected path. The PR links to issue ROSAENG-62420: Onboard FullSend JIRA Integration #323 and explains the rationale. Human approval is always required for protected-path changes, regardless of context.

Low

  • [error-handling] .github/workflows/fullsend-poll-jira.yaml:65ISSUE_ID is set via jq -r '.iid // 0'. If .iid is present but non-numeric, --argjson number "$ISSUE_ID" will fail. Defensive coding: use jq -r '(.iid // 0) | tonumber'.

  • [document-structure] .github/workflows/fullsend-poll-jira.yaml:1 — Existing fullsend.yaml uses --- YAML document start marker and places permissions before on. This file omits the marker and reverses key order.

  • [error-handling] .github/workflows/fullsend-poll-jira.yaml:69 — If vars.JIRA_BASE_URL is not configured, ISSUE_URL becomes /browse/${ISSUE_KEY} (missing scheme/host), producing an invalid URL in the event payload.

  • [header-comment] .github/workflows/fullsend-poll-jira.yaml:1 — Existing fullsend.yaml has a header comment block explaining purpose, security model, and routing logic. This file has no comments.

  • [naming-convention] .github/workflows/fullsend-poll-jira.yaml:1 — Existing workflow name is fullsend (lowercase). New workflow is fullsend Jira poll with mixed case. Consider consistent naming.

  • [stale-doc] CLAUDE.md — CI described as exclusively Tekton-based but does not mention FullSend GitHub Actions workflows.

  • [stale-doc] .claude/agents/ci-agent.md — CI agent documentation only lists Tekton components, not GitHub Actions workflows.


Labels: PR adds new feature: JIRA polling integration workflow


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR

fullsend-ai-review[bot]

This comment was marked as outdated.

@openshift-ci openshift-ci Bot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Aug 6, 2026
@samanthajayasinghe
samanthajayasinghe force-pushed the fix/323-jira-integration branch from 5d9b69c to 69f620c Compare August 6, 2026 23:21
@openshift-ci openshift-ci Bot removed the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Aug 6, 2026
@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

@fullsend-ai-review

fullsend-ai-review Bot commented Aug 6, 2026

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Started 11:22 PM UTC · Ended 11:25 PM UTC
Commit: 5d9b69c · View workflow run →

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/fullsend-poll-jira.yaml:
- Line 37: Update the JQL generated for the FullSend Jira poll so the label
exclusion condition also matches issues with no labels by grouping the existing
labels-not-in filter with an OR labels-is-EMPTY clause. Apply this in the
generator or template that produces the workflow, preserving the other project,
issue type, and status filters.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Enterprise

Run ID: 22753c41-081c-4b65-9f27-53eb09531d1c

📥 Commits

Reviewing files that changed from the base of the PR and between 6f8340c and 69f620c.

📒 Files selected for processing (1)
  • .github/workflows/fullsend-poll-jira.yaml

Comment thread .github/workflows/fullsend-poll-jira.yaml Outdated
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 6, 2026

Copy link
Copy Markdown

🤖 Review · ❌ Terminated · Started 11:26 PM UTC · Ended 11:45 PM UTC
Commit: 69f620c · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

@fullsend-ai-review

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 11:26 PM UTC · Completed 11:44 PM UTC
Commit: 69f620c · View workflow run →

@fullsend-ai-review

fullsend-ai-review Bot commented Aug 11, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 3:01 AM UTC · Completed 3:17 AM UTC

Commit: 5550879 · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

@fullsend-ai-review

fullsend-ai-review Bot commented Aug 11, 2026

Copy link
Copy Markdown

🤖 Review · ❌ Terminated · Started 3:29 AM UTC · Ended 3:46 AM UTC

Commit: 64280d0 · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

@fullsend-ai-review

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 3:29 AM UTC · Completed 3:45 AM UTC

Commit: 64280d0 · View workflow run →

@fullsend-ai-review

fullsend-ai-review Bot commented Aug 24, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 5:29 AM UTC · Completed 5:48 AM UTC

Commit: cc06bd7 · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

@fullsend-ai-review

fullsend-ai-review Bot commented Aug 24, 2026

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Started 6:10 AM UTC · Ended 6:15 AM UTC

Commit: ee32bfe · View workflow run →

@fullsend-ai-review

fullsend-ai-review Bot commented Aug 24, 2026

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Started 6:16 AM UTC · Ended 6:21 AM UTC

Commit: 9342d73 · View workflow run →

Adds a scheduled GitHub Actions workflow that polls JIRA for
issues matching the ocm-agent-operator component in ROSAENG,
excluding security-sensitive issues (Vulnerability, Weakness
types and security/cve/embargo labels).

Closes openshift#323

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Pin actions/checkout to a full commit SHA (v4.2.2) and set
  persist-credentials: false (supply-chain / artipacked)
- Pin the fullsend binary to v0.36.0 and checksum-verify the download
  before it is granted the Jira credentials (supply-chain)
- Fix the JQL label filter so issues with no labels are included
- Validate every Jira-derived value (stage, event_type, issue key)
  against strict allowlists before it reaches a gh CLI arg, URL, or
  workflow command, blocking GHA command injection
- Drop the grep -x flag so stage markers match at any indentation
- Coerce iid with tonumber, strip a trailing slash from JIRA_BASE_URL,
  validate JIRA_BASE_URL is set, and don't let one dispatch failure
  abort the remaining records
- Add a header comment block, YAML doc marker, and lowercase locals
  for consistency with fullsend.yaml

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 24, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 6:22 AM UTC · Completed 6:37 AM UTC

Commit: 8689dbd · View workflow run →

@fullsend-ai-review
fullsend-ai-review Bot dismissed stale reviews from themself August 24, 2026 06:37

Superseded by updated review

@fullsend-ai-review fullsend-ai-review Bot 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.

See the review comment for full details.

issue_key="${resource_key#issue-}"

# Validate every Jira-derived value against a strict allowlist before
# it reaches a gh CLI arg, URL, or workflow command. This fails

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[low] edge-case

When a dispatch record has a null or missing iid field, the expression (.iid // 0) | tonumber silently falls back to 0, producing issue.number = 0 in the event payload. While issue_key is the primary routing identifier and is validated, passing an invalid numeric ID to downstream consumers may cause confusion.

Suggested fix: Add a validation check that skips the record (with a warning) if issue_id is 0 after coercion.

# "# fullsend-stage: <stage>" marker line at any indentation.
workflow_name=""
for wf in .github/workflows/*.yml .github/workflows/*.yaml; do
[[ -f "$wf" ]] || continue

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[low] logic-error

grep -qF performs a fixed-string substring match on the fullsend-stage marker. If two workflow files contain stage markers with a prefix relationship (e.g., plan and plan-review), the shorter stage name could incorrectly match the longer one. Currently no consumer workflows exist, making this theoretical.

Suggested fix: Use a regex with a word boundary or end-of-line anchor for exact matching.

gh release download "$FULLSEND_VERSION" --repo fullsend-ai/fullsend \
-p "$asset" -p checksums.txt
sha256sum --ignore-missing -c checksums.txt
tar xzf "$asset" fullsend

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[low] supply-chain

The fullsend binary checksum verification downloads checksums.txt from the same GitHub release as the binary. This guards against download corruption but not upstream compromise. Consistent with the existing trust model (the repo already trusts fullsend-ai/fullsend via SHA-pinned reusable workflow).

Suggested fix: Consider pinning a known-good SHA256 hash directly in the workflow rather than relying on the release-hosted checksums.txt.

@fullsend-ai-review fullsend-ai-review Bot added the requires-manual-review Review requires human judgment label Aug 24, 2026
@openshift-ci

openshift-ci Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

@samanthajayasinghe: all tests passed!

Full PR test history. Your PR dashboard.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here.

@krishvoor

Copy link
Copy Markdown
Member

/approve

@krishvoor

Copy link
Copy Markdown
Member

/lgtm

@krishvoor
krishvoor merged commit 272c3cc into openshift:master Aug 25, 2026
45 of 46 checks passed
@openshift-ci openshift-ci Bot added the lgtm Indicates that a PR is ready to be merged. label Aug 25, 2026
@openshift-ci

openshift-ci Bot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: krishvoor, samanthajayasinghe
Once this PR has been reviewed and has the lgtm label, please assign bergmannf for approval. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature lgtm Indicates that a PR is ready to be merged. requires-manual-review Review requires human judgment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ROSAENG-62420: Onboard FullSend JIRA Integration

3 participants