Skip to content

Conversation

@zakisk
Copy link
Contributor

@zakisk zakisk commented Dec 7, 2025

When a PipelineRun is deleted while it is in 'Running' or 'Queued' state (i.e., not yet completed), the status on the Git provider (e.g., GitHub) remained stuck in 'Pending' or 'Running'.

This commit adds logic to the Finalizer to detect when a PipelineRun is being deleted (finalized) while in an active state. It now:

  1. Reports a "cancelled" status to the Git provider, ensuring the commit status is correctly updated to "cancelled" instead of hanging.
  2. Added unit test case to confirm that status is reported cancelled.

This improves the user experience by accurately reflecting the PipelineRun lifecycle events on the Git provider UI.

https://issues.redhat.com/browse/SRVKP-8318

📝 Description of the Change

👨🏻‍ Linked Jira

🔗 Linked GitHub Issue

Fixes #

🚀 Type of Change

  • 🐛 Bug fix (fix:)
  • ✨ New feature (feat:)
  • 💥 Breaking change (feat!:, fix!:)
  • 📚 Documentation update (docs:)
  • ⚙️ Chore (chore:)
  • 💅 Refactor (refactor:)
  • 🔧 Enhancement (enhance:)
  • 📦 Dependency update (deps:)

🧪 Testing Strategy

  • Unit tests
  • Integration tests
  • End-to-end tests
  • Manual testing
  • Not Applicable

🤖 AI Assistance

  • I have not used any AI assistance for this PR.
  • I have used AI assistance for this PR.

If you have used AI assistance, please provide the following details:

Which LLM was used?

  • GitHub Copilot
  • ChatGPT (OpenAI)
  • Claude (Anthropic)
  • Cursor
  • Gemini (Google)
  • Other: ____________

Extent of AI Assistance:

  • Documentation and research only
  • Unit tests or E2E tests only
  • Code generation (parts of the code)
  • Full code generation (most of the PR)
  • PR description and comments
  • Commit message(s)

Important

If the majority of the code in this PR was generated by an AI, please add a Co-authored-by trailer to your commit message.
For example:

Co-authored-by: Gemini gemini@google.com
Co-authored-by: ChatGPT noreply@chatgpt.com
Co-authored-by: Claude noreply@anthropic.com
Co-authored-by: Cursor noreply@cursor.com
Co-authored-by: Copilot Copilot@users.noreply.github.com

**💡You can use the script ./hack/add-llm-coauthor.sh to automatically add
these co-author trailers to your commits.

✅ Submitter Checklist

  • 📝 My commit messages are clear, informative, and follow the project's How to write a git commit message guide. The Gitlint linter ensures in CI it's properly validated
  • ✨ I have ensured my commit message prefix (e.g., fix:, feat:) matches the "Type of Change" I selected above.
  • ♽ I have run make test and make lint locally to check for and fix any
    issues. For an efficient workflow, I have considered installing
    pre-commit and running pre-commit install to
    automate these checks.
  • 📖 I have added or updated documentation for any user-facing changes.
  • 🧪 I have added sufficient unit tests for my code changes.
  • 🎁 I have added end-to-end tests where feasible. See README for more details.
  • 🔎 I have addressed any CI test flakiness or provided a clear reason to bypass it.
  • If adding a provider feature, I have filled in the following and updated the provider documentation:
    • GitHub App
    • GitHub Webhook
    • Gitea/Forgejo
    • GitLab
    • Bitbucket Cloud
    • Bitbucket Data Center

@gemini-code-assist
Copy link

Summary of Changes

Hello @zakisk, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request addresses a bug where the status of a PipelineRun on Git providers (like GitHub) would remain stuck in 'Pending' or 'Running' if the PipelineRun was deleted before completion. The changes introduce a mechanism to ensure that when a PipelineRun is deleted, its status is accurately updated to 'cancelled' on the Git provider, providing a more precise reflection of the PipelineRun's lifecycle and improving user experience.

Highlights

  • Cancelled Status Reporting: Implemented logic within the PipelineRun finalizer to detect when a PipelineRun is deleted while still in an active (Running or Queued) state, and subsequently reports a 'cancelled' status to the Git provider.
  • Git Provider Client Initialization Refactor: Extracted the common Git provider client initialization logic into a new, reusable helper function initGitProviderClient to streamline code and improve maintainability.
  • Enhanced Unit Testing: Added a dedicated unit test case to verify that the 'cancelled' status is correctly reported to the Git provider when a PipelineRun is finalized prematurely.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request addresses an issue where deleting a 'Running' or 'Queued' PipelineRun would leave its status stuck on the Git provider. The fix introduces logic in the finalizer to report a 'cancelled' status in this scenario, which is a good approach. The related refactoring to extract initGitProviderClient is also a positive change that improves code reuse.

My review includes a critical fix for an error handling issue where a failure to initialize the Git provider client is silently ignored, which could prevent the 'cancelled' status from being reported. I've also included suggestions to improve logging style and to strengthen the new unit test to make it more robust and less brittle.

@zakisk
Copy link
Contributor Author

zakisk commented Dec 8, 2025

/test

@pipelines-as-code
Copy link

pipelines-as-code bot commented Dec 8, 2025

🔍 PR Lint Feedback

Note: This automated check helps ensure your PR follows our contribution guidelines.

⚠️ Items that need attention:

🤖 AI attribution

The following commits lack an explicit AI attribution footer:

  • 73bd006 fix: report cancelled status when PipelineRun is deleted

If no AI assistance was used for a commit, you can ignore this warning.
Otherwise add an Assisted-by: or Co-authored-by: footer referencing the AI used.


ℹ️ Next Steps

  • Review and address the items above
  • Push new commits to update this PR
  • This comment will be automatically updated when issues are resolved
🔧 Admin Tools (click to expand)

Automated Issue/Ticket Creation:

  • /issue-create - Generate a GitHub issue from this PR content using AI
  • /jira-create - Create a SRVKP Jira ticket from this PR content using AI

⚠️ Important: Always review and edit generated content before finalizing tickets/issues.
The AI-generated content should be used as a starting point and may need adjustments.

These commands are available to maintainers and will post the generated content as PR comments for review.

🤖 This feedback was generated automatically by the PR CI system

@pipelines-as-code pipelines-as-code bot added the fix label Dec 8, 2025
@zakisk zakisk force-pushed the SRVKP-8318-prevent-zombie-pipeline-status branch from 4969c51 to c3861d4 Compare December 8, 2025 05:44
@zakisk zakisk force-pushed the SRVKP-8318-prevent-zombie-pipeline-status branch 2 times, most recently from 573f95a to 8cfdc21 Compare December 9, 2025 05:10
When a PipelineRun is deleted while it is in 'Running' or 'Queued' state
(i.e., not yet completed), the status on the Git provider (e.g., GitHub)
remained stuck in 'Pending' or 'Running'.

This commit adds logic to the Finalizer to detect when a PipelineRun
is being deleted (finalized) while in an active state. It now:
1. Reports a "cancelled" status to the Git provider, ensuring the
   commit status is correctly updated to "cancelled" instead of hanging.
2. Added unit test case to confirm that status is reported cancelled.

This improves the user experience by accurately reflecting the
PipelineRun lifecycle events on the Git provider UI.

https://issues.redhat.com/browse/SRVKP-8318

Signed-off-by: Zaki Shaikh <zashaikh@redhat.com>
@zakisk zakisk force-pushed the SRVKP-8318-prevent-zombie-pipeline-status branch from 8cfdc21 to 73bd006 Compare December 9, 2025 05:12
Copy link
Member

@aThorp96 aThorp96 left a comment

Choose a reason for hiding this comment

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

This will help the reliability a lot. Thanks! A couple suggestions and thoughts

return nil
}

func (r *Reconciler) reportPipelineRunAsCancelled(ctx context.Context, logger *zap.SugaredLogger, repo *v1alpha1.Repository, pr *tektonv1.PipelineRun) error {
Copy link
Member

Choose a reason for hiding this comment

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

In other functions we use logger := logging.FromContext(ctx) instead of passing in a logger. Any reason we're not doing that here?

Comment on lines +66 to +71
// report the PipelineRun as cancelled as it was queued or started but it is deleted
// but its status is still in progress or queued on git provider
if err := r.reportPipelineRunAsCancelled(ctx, logger, repo, pr); err != nil {
logger.Errorf("failed to report started pipeline run as cancelled: %w", err)
return err
}
Copy link
Member

@aThorp96 aThorp96 Dec 9, 2025

Choose a reason for hiding this comment

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

Can this be defered as soon as we confirm the Repository? SInce there are some fast-returns inside this if-statement there's several happy paths and failure paths which could cause this to get skipped

// but its status is still in progress or queued on git provider
if err := r.reportPipelineRunAsCancelled(ctx, logger, repo, pr); err != nil {
logger.Errorf("failed to report started pipeline run as cancelled: %w", err)
return err
Copy link
Member

Choose a reason for hiding this comment

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

I'm not sure if return err is the right move here, since it will block the finalizer from being cleared. On one hand, that will help ensure the status is updated. On the other hand though, if for example a repository CR's API key expires or is rate limited, its PLRs effectively can't be deleted. WDYT?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

yeah, I was also skeptic about it that whether we should error out on api failure or not 🤔 but now I'm more inclined towards to not returning error. I will update this

}
detectedProvider.SetPacInfo(&pacInfo)

if event.InstallationID > 0 {
Copy link
Member

Choose a reason for hiding this comment

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

Non-blocking suggestion

Suggested change
if event.InstallationID > 0 {
// installation ID indicated Github App installation
if event.InstallationID > 0 {

if event.InstallationID > 0 {
event.Provider.WebhookSecret, _ = pac.GetCurrentNSWebhookSecret(ctx, r.kinteract, r.run)
} else {
// secretNS is needed when git provider is other than Github.
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
// secretNS is needed when git provider is other than Github.
// secretNS is needed when git provider is other than Github App.

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

Development

Successfully merging this pull request may close these issues.

3 participants