- job: | |
name: tf-a-lts-verified-propagater | |
node: docker-amd64-tf-a-jammy | |
project-type: freestyle | |
concurrent: false | |
description: | |
Triggers whenever a patch in the lts branch get a Verified score. | |
It will vote the same score to the dependent patch | |
disabled: false | |
builders: | |
- shell: |- | |
- shell: |- | |
#!/bin/bash | |
# This job is triggered by the label Verified +1 or -1 of the patch | |
# it will vote the same score (Verified +1 / Verified -1) to the dependent patch | |
# , if there is any. | |
# For example, P5 -> P4 -> P3 -> P2 -> P1. P5 dependents on P4, and so on | |
# When P5 gets Verified +1, this job will be triggered and set Verified +1 to P4. | |
# P4 gets Verified +1 triggers an other job to set Verified +1 to P3, and so on. | |
# That is how we propagate the Verified score to the entire patch stack | |
set -ex | |
echo "########################################################################" | |
echo " Gerrit Environment" | |
env |grep '^GERRIT' | |
echo "########################################################################" | |
SSH_PARAMS="-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o PubkeyAcceptedKeyTypes=+ssh-rsa -p 29418 -i ${CI_BOT_KEY}" | |
GERRIT_URL="review.trustedfirmware.org" | |
GERRIT_QUERY_PARAMS="--dependencies --submit-records --format=JSON change:" | |
QUERY_CMD="${SSH_PARAMS} ${CI_BOT_USERNAME}@${GERRIT_URL} gerrit query ${GERRIT_QUERY_PARAMS}" | |
QUERY_CHANGE_DEPENDS_CMD="${QUERY_CMD}${GERRIT_CHANGE_NUMBER}" | |
REVIEW_MESSAGE="Propagated verified from ${GERRIT_CHANGE_URL}. By ${BUILD_URL}" | |
SET_VERIFIED_CMD="${SSH_PARAMS} ${CI_BOT_USERNAME}@${GERRIT_URL} gerrit review --verified" | |
change_url_base=${GERRIT_CHANGE_URL%/*} | |
# Check this example https://ci.trustedfirmware.org/view/TF-A/job/tf-a-lts-verified-propagater/14/console | |
# for what we get from gerrit query command | |
patch_query=$(ssh ${QUERY_CHANGE_DEPENDS_CMD} | jq .) | |
dependsOn=$(echo ${patch_query} | jq -r 'select(.dependsOn)') | |
# Normally, there would be just one dependent patch | |
# (and that patch would in turn has another dependent patch, that's how a dependency chain is structured) | |
# But Gerrit data model has a list of dependent patches, so we process all just in case | |
dependsOn_rev=($(echo ${dependsOn} | jq -r '.dependsOn[].revision')) | |
dependsOn_no=($(echo ${dependsOn} | jq -r '.dependsOn[].number')) | |
verified_status=$(echo ${patch_query} | jq -r 'select(.submitRecords) | .submitRecords[0].labels[] | select(.label == "Verified") | .status') | |
# Verified label status and value mapping | |
# REJECT: -1 | |
# OK: 1 | |
verified_value=0 | |
if [ "${verified_status}" == "REJECT" ]; then | |
verified_value=-1 | |
elif [ "${verified_status}" == "OK" ]; then | |
verified_value=1 | |
fi | |
# Vote the same Verified score to the dependent patch by loop | |
for ((i=0; i<${#dependsOn_rev[@]}; i++)) | |
do | |
# Need to check the .status before set verified score | |
if [ $(ssh ${QUERY_CMD}${dependsOn_no[$i]} | jq -r 'select(.status)|.status') == "MERGED" ]; then | |
echo "The dependent patch ${change_url_base}${dependsOn_no[$i]} has been merged. Don't set Verified score to it!" | |
continue | |
else | |
echo "Set Verified ${verified_value} to: ${change_url_base}/${dependsOn_no[$i]}" | |
ssh ${SET_VERIFIED_CMD} ${verified_value} -m \'\"${REVIEW_MESSAGE}\"\' ${dependsOn_rev[$i]} | |
fi | |
done | |
properties: | |
- build-discarder: | |
days-to-keep: 60 | |
num-to-keep: 10 | |
triggers: | |
- gerrit: | |
silent: true | |
server-name: 'review.trustedfirmware.org' | |
projects: | |
- branches: | |
- branch-compare-type: REG_EXP | |
branch-pattern: 'lts-v.*' | |
project-compare-type: PLAIN | |
project-pattern: 'TF-A/trusted-firmware-a' | |
trigger-on: | |
- comment-added-event: | |
approval-category: "Verified" | |
approval-value: 1 | |
- comment-added-event: | |
approval-category: "Verified" | |
approval-value: -1 | |
wrappers: | |
- timestamps | |
- credentials-binding: | |
- ssh-user-private-key: | |
credential-id: TFA_CI_BOT_USER_SSH_KEY | |
key-file-variable: CI_BOT_KEY | |
username-variable: CI_BOT_USERNAME | |
passphrase-variable: '' | |
publishers: | |
- workspace-cleanup |