Skip to content

feat: onboard FullSend JIRA integration - #324

Open
samanthajayasinghe wants to merge 2 commits into
openshift:masterfrom
samanthajayasinghe:fix/323-jira-integration
Open

feat: onboard FullSend JIRA integration#324
samanthajayasinghe wants to merge 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

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

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

Review profile: CHILL

Plan: Enterprise

Run ID: 9bc16d9d-aed2-4b71-be9e-2d940d22a608

📥 Commits

Reviewing files that changed from the base of the PR and between 5550879 and 64280d0.

⛔ Files ignored due to path filters (3)
  • boilerplate/_data/last-boilerplate-commit is excluded by !boilerplate/**
  • build/Dockerfile is excluded by !build/**
  • build/Dockerfile.olm-registry is excluded by !build/**
📒 Files selected for processing (1)
  • .tekton/ocm-agent-operator-agentic-sdlc-check-pull-request.yaml

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
@openshift-ci

openshift-ci Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: 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

@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
Comment thread .github/workflows/fullsend-poll-jira.yaml
Comment thread .github/workflows/fullsend-poll-jira.yaml
@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.03%. Comparing base (6f8340c) to head (64280d0).

Additional details and impacted files

Impacted file tree graph

@@           Coverage Diff           @@
##           master     #324   +/-   ##
=======================================
  Coverage   65.03%   65.03%           
=======================================
  Files          23       23           
  Lines        1570     1570           
=======================================
  Hits         1021     1021           
  Misses        471      471           
  Partials       78       78           
🚀 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

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

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 (2)

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 (3)

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
@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 →

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

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@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 →

@openshift-ci

openshift-ci Bot commented Aug 11, 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.

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

GH_TOKEN: ${{ github.token }}
run: |
gh release download --repo fullsend-ai/fullsend -p 'fullsend_*_linux_amd64.tar.gz' -O - | tar xz
sudo mv fullsend /usr/local/bin/

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[high] supply-chain

Unpinned third-party binary download and execution. The workflow downloads the fullsend binary from fullsend-ai/fullsend GitHub releases using a glob pattern without pinning to a specific version or verifying a checksum/signature. This binary runs with access to JIRA_TOKEN and JIRA_USER_EMAIL secrets. A compromised release could exfiltrate credentials. The existing fullsend.yaml pins its reference with a SHA, making this inconsistency more concerning.

Suggested fix: 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.

done
if [[ -z "$WORKFLOW_NAME" ]]; then
echo "::warning::No workflow found for stage ${STAGE}, skipping ${RESOURCE_KEY}"
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.

[medium] injection

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.

Suggested fix: Sanitize RESOURCE_KEY before interpolating into workflow commands by stripping or encoding :: sequences, %0A/%0D, and control characters.

[[ -f "$wf" ]] || continue
if grep -qxF "# fullsend-stage: ${STAGE}" "$wf"; then
WORKFLOW_NAME=$(basename "$wf")
break

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[medium] runtime mechanism failure

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.

Suggested fix: Either add workflow files with '# fullsend-stage: ' comments for each role defined in .fullsend/config.yaml, or document that this is scaffolding that depends on future stage-specific workflow files.

workflow_dispatch: {}

permissions:
actions: write

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] permission-expansion

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.

ISSUE_ID=$(echo "$record" | jq -r '.iid // 0')

ISSUE_KEY="${RESOURCE_KEY#issue-}"
ISSUE_URL="${JIRA_BASE_URL}/browse/${ISSUE_KEY}"

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] error-handling-gap

ISSUE_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.

Suggested fix: Use --arg instead of --argjson if the downstream consumer can accept a string, or add explicit type coercion.

@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 →

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ROSAENG-62420: Onboard FullSend JIRA Integration

2 participants