azure-pipelines-wrapper/auto_cherrypick.js (60 lines of code) (raw):

const spawnSync = require('child_process').spawnSync; const akv = require('./keyvault'); const repos = ["sonic-net/sonic-utilities", "sonic-net/sonic-swss", "sonic-net/sonic-sairedis", "sonic-net/sonic-swss-common", "sonic-net/sonic-dbsyncd", "sonic-net/sonic-gnmi", "sonic-net/sonic-host-services", "sonic-net/sonic-linkmgrd", "sonic-net/sonic-linux-kernel", "sonic-net/sonic-mgmt-common", "sonic-net/sonic-mgmt-framework", "sonic-net/sonic-platform-common", "sonic-net/sonic-platform-daemons", "sonic-net/sonic-py-swsssdk", "sonic-net/sonic-restapi", "sonic-net/sonic-snmpagent", "sonic-net/sonic-wpa-supplicant", "sonic-net/sonic-buildimage", "sonic-net/sonic-ztp", "sonic-net/sonic-dhcp-relay", "sonic-net/sonic-mgmt"]; function init(app) { app.log.info("[ AUTO CHERRY PICK ] Init auto cherry pick"); app.on( ["pull_request.synchronize", "pull_request.labeled", "pull_request.closed"] , async (context) => { var payload = context.payload; let full_name = payload.repository.full_name var merged = payload.pull_request.merged let org = full_name.split('/')[0] let repo = full_name.split('/')[1] if (!repos.includes(full_name)) { app.log.info("[ AUTO CHERRY PICK ] repo not match!") return } if (payload.action == 'closed') { if (merged != true) { app.log.info("[ AUTO CHERRY PICK ] PR not merged!") return } } let gh_token = await akv.getGithubToken() let script_url = await akv.getSecretFromCache("AUTO_CHERRYPICK_SCRIPT_URL") var param = Array() param.push(`FOLDER=cherrypick`) param.push(`ACTION=${payload.action}`) param.push(`REPO=${repo}`) param.push(`ORG=${org}`) param.push(`GH_TOKEN=${gh_token}`) param.push(`SCRIPT_URL=${script_url}`) param.push(`PR_NUMBER=${payload.number.toString()}`) param.push(`PR_URL=${payload.pull_request.html_url}`) param.push(`PR_OWNER=${payload.pull_request.user.login}`) param.push(`PR_BASE_BRANCH=${payload.pull_request.base.ref}`) param.push(`PR_PATCH_URL=${payload.pull_request.patch_url}`) param.push(`PR_COMMIT_SHA=${payload.pull_request.merge_commit_sha}`) param.push(`PR_MERGED=${merged}`) var labels = Array() for (const label of payload.pull_request.labels) { labels.push(label.name) } param.push(`PR_LABELS="${labels.join(',')}"`) if (payload.action == 'labeled') { param.push(`ACTION_LABEL="${payload.label.name}"`) } app.log.info(["[ AUTO CHERRY PICK ]"].concat(param).join(" ")) var run = spawnSync('./bash_action.sh', param, { encoding: 'utf-8' }) if (run.status != 0){ app.log.error(`[ AUTO CHERRY PICK ] Unexpected error! path: ${repo}/${run.output}`) return } app.log.info("[ AUTO CHERRY PICK ] finished.") }); }; module.exports = Object.freeze({ init: init, });