With the Zuul upgrade earlier today ( 2.0.0-327-g3ebedde-wmf2precise1 ) , changes which are Verified:+1 no more enter gate-and-submit.
The workaround is to vote Verified+2 and CR+2 which let Zuul accept the patch.
I think the root cause is when I changed the label to be upper case with: https://gerrit.wikimedia.org/r/#/c/226220/1/zuul/layout.yaml . That unbroke a feature that never worked previously which is that Zuul looks at the change submit record to verify whether a patch can actually be merged. If not, Zuul does not bother entering the change in the pipeline.
An example for a job having Verified: +1 (edited):
gerrit query 223572 --submit-records change I265913dcb28a09b2ba803a226ee03b96fc543ab9 project: mediawiki/core branch: master url: https://gerrit.wikimedia.org/r/223572 open: true status: NEW submitRecords: status: NOT_READY labels: label: Verified status: NEED labels: label: Code-Review status: NEED
The change is not ready because neither Verified nor Code-Review received the necessary votes. On OpenStack a change needs both to be set before the gate bother dealing with the change.
Potentially, when we had the lower case verified the status was being ignored somehow (have to test). Now that is upper case Verified and Code-Review Zuul behavior works as intended but ends up being a regression for us.
Maybe we can soften the approval in gate-and-submit to allow changes with Verified -1,0,+1,+2 to enter the gate. Have to be tested as well.
The relevant function is in integration/zuul.git branch debian/precise-wikimedia then: zuul/trigger/gerrit.py Gerrit.canMerge() . Pasting it here as a convenience:
def canMerge(self, change, allow_needs): if not change.number: self.log.debug("Change has no number; considering it merged") # Good question. It's probably ref-updated, which, ah, # means it's merged. return True data = change._data if not data: return False if 'submitRecords' not in data: return False try: for sr in data['submitRecords']: if sr['status'] == 'OK': return True elif sr['status'] == 'NOT_READY': for label in sr['labels']: if label['status'] == 'OK': continue elif label['status'] in ['NEED', 'REJECT']: # It may be our own rejection, so we ignore if label['label'].lower() not in allow_needs: return False continue else: # IMPOSSIBLE return False else: # CLOSED, RULE_ERROR return False except: self.log.exception("Exception determining whether change" "%s can merge:" % change) return False return True
Should be easy to exercise in integration/config test suite.