Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Requesting not to update the CIRRUS_LAST_GREEN_CHANGE after builds with no tasks, nor after builds with all tasks skipped #1233

Open
DeeDeeG opened this issue Sep 11, 2023 · 1 comment
Labels

Comments

@DeeDeeG
Copy link

DeeDeeG commented Sep 11, 2023

Description

It would be really nice, in my opinion, for builds with no tasks, or builds where all tasks are SKIPPED, for the CIRRUS_LAST_GREEN_CHANGE not to be updated or changed by these builds. (That the CIRRUS_LAST_GREEN_CHANGE would remain the same as before the build with only skipped tasks, or no tasks, had run.)

This aids in the ability to filter most build types/build triggers to safeguard credits, and follow-up with a cron rule to actually build the repo every so often.

Context

  • Builds with no tasks can happen due to the use of only_if: in .cirrus.yml.
  • Builds with all skipped tasks can happen due to use of skip: in .cirrus.yml.

For example, our real-world use-case: we are using only_if: to skip PR and branch push builds, and instead only build our default branch every few days with cron builds. And we are using skip: based on checking CIRRUS_LAST_GREEN_CHANGE to skip if the current commit has already been built before. (We could do both via only_if:, but the result seems to be the same, from some quick testing. I didn't test doing all the skipping logic in skip:, but I expect no difference?) But the cron builds see the skipped branch push builds to our default branch as successful, in terms of the fact that they update CIRRUS_LAST_GREEN_CHANGE. So these cron builds are now skipping as well! We have effectively no builds ever, with our current setup.

Basically I consider it (subjectively) a bug that CIRRUS_LAST_GREEN_CHANGE updates to the commit of these builds which have no tasks scheduled due to only_if:, or all tasks skipped due to skip:.

If there is any concern about breaking existing workflows, then perhaps the info should be presented in a new env var? Perhaps called: CIRRUS_LAST_GREEN_CHANGE_WITH_TASKS?

Anything Else

Similar to previous issue I found, #891.

But unlike that issue, I'm referring to situations where the overall build is reporting asCOMPLETED aka successful, but there were no tasks or all skipped tasks. Whereas I suppose #891 was just about if the entire build was SKIPPED.

@DeeDeeG
Copy link
Author

DeeDeeG commented Sep 11, 2023

By the way, we have found a (rather hacky feeling) workaround for this... A task designed to execute as quickly as possible and mark the overall build as technically "failed", if we would have skipped all its tasks.

We would rather have a way that feels officially supported in Cirrus rather than a hack or workaround, ideally though. Thank you for considering.

silently_mark_skipped_or_no_scheduled_task_builds_as_failed_task:
  skip_notifications: true
  only_if: $CIRRUS_CRON == "" && $CIRRUS_TAG == ""
  container:
    image: alpine:latest
    cpu: 1
  clone_script: |
    exit 0
  mark_task_as_failed_script: |
    exit 1
  timeout_in: 6s
The same task definition as above, annotated with a lot of comments (click to expand):
silently_mark_skipped_or_no_scheduled_task_builds_as_failed_task:
  skip_notifications: true
  # "skip_notifications: true" makes GitHub see the build as successful, for cleaner statuses on GitHub.
  only_if: $CIRRUS_CRON == "" && $CIRRUS_TAG == ""
  # Only mark the "skipped" or "no-tasks-cheduled" builds as failed. "Cron" builds and "tag push" builds should be allowed to succeed.
  # !!! Don't forget to update the "only_if:" for this task to match, if you update the "only_if:" logic in the other tasks. !!!
  container:
    image: alpine:latest
    # A light and minimal image, to save Cirrus some resources, why not?
    cpu: 1
    # Set CPU cores used by the VM to 1. Otherwise, we burn double the CPU-seconds per IRL second, due to 2 CPU cores being provisioned by default.
  clone_script: |
    exit 0
    # Fake "clone repo" script that overrides the default, actual clone script.
    # Actually cloning the repo isn't necessary for this task. But if cloning fails, it triggers an automatic re-run.
    # So, we have to provide this fake clone script to override the real one, if we want to save any IRL time versus an actual clone.
    # Saves ~2 CPU-seconds vs a real, clone_depth 1 clone. Saves ~2 minutes IRL time vs a clone script that deliberately fails or times out.
  mark_task_as_failed_script: |
    exit 1 # This script does nothing but mark the build as failed, protecting the CIRRUS_LAST_GREEN_CHANGE from being updated when it shouldn't be.
  timeout_in: 6s
  # Avoid wasting any more than 6 seconds, or up to 12 seconds if an automatic re-run is triggered. 2 seconds is typical for the whole task, though.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant