From 8e729c9eae60ec4a95d6a7703aab2cdca88d7360 Mon Sep 17 00:00:00 2001 From: Jasmine Baral Date: Fri, 30 Jul 2021 18:03:51 +0545 Subject: [PATCH] first commit --- .drone.star | 50 +++++++++++++++++++++++++- tests/acceptance/cancelBuilds.sh | 60 ++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+), 1 deletion(-) create mode 100755 tests/acceptance/cancelBuilds.sh diff --git a/.drone.star b/.drone.star index 5644fa288f..6e0291a885 100644 --- a/.drone.star +++ b/.drone.star @@ -125,7 +125,8 @@ def main(ctx): test_pipelines = \ [buildOcisBinaryForTesting(ctx)] + \ testOcisModules(ctx) + \ - testPipelines(ctx) + testPipelines(ctx) + \ + checkForRecentBuilds(ctx) build_release_pipelines = \ dockerReleases(ctx) + \ @@ -190,6 +191,53 @@ def testOcisModules(ctx): return pipelines + [scan_result_upload] +def checkForRecentBuilds(ctx): + pipelines = [] + + result = { + "kind": "pipeline", + "type": "docker", + "name": "stop-recent-builds", + "steps": stopRecentBuilds(ctx), + "depends_on": [], + "trigger": { + "ref": [ + "refs/heads/master", + "refs/tags/**", + "refs/pull/**", + ], + }, + } + + pipelines.append(result) + + return pipelines + +def stopRecentBuilds(ctx): + repo_slug = ctx.build.source_repo if ctx.build.source_repo else ctx.repo.slug + + return [{ + "name": "stop-recent-builds", + "image": "drone/cli:alpine", + "pull": "always", + "environment": { + "DRONE_SERVER": "https://drone.owncloud.com", + "DRONE_TOKEN": { + "from_secret": "drone_token", + }, + }, + "commands": [ + "drone build ls %s --status running > /drone/src/recentBuilds.txt" % repo_slug, + "drone build info %s ${DRONE_BUILD_NUMBER} > /drone/src/thisBuildInfo.txt" % repo_slug, + "cd /drone/src && ./tests/acceptance/cancelBuilds.sh", + ], + "when": { + "event": [ + "pull_request", + ], + }, + }] + def testPipelines(ctx): pipelines = [] if "skip" not in config["localApiTests"] or not config["localApiTests"]["skip"]: diff --git a/tests/acceptance/cancelBuilds.sh b/tests/acceptance/cancelBuilds.sh new file mode 100755 index 0000000000..cdebb968a9 --- /dev/null +++ b/tests/acceptance/cancelBuilds.sh @@ -0,0 +1,60 @@ +SCRIPT_PATH=$(dirname "$0") +SCRIPT_PATH=$( cd "${SCRIPT_PATH}" && pwd ) # normalized and made absolute +OWNCLOUD_OCIS="owncloud/ocis" + +# The recentBuilds.txt file contains all the information of the PR whose builds are recently running. +# Therefore, to filter out the BuildID and the Reference from all the recent builds which are running, +# the following awk command is used and the output containing the BuildId and the Reference of each +# builds/prs are stored in the filteredDescriptions.txt file. +echo ${SCRIPT_PATH} +awk "/Build #|Ref: refs\/pull/" ${SCRIPT_PATH}/../../recentBuilds.txt > ${SCRIPT_PATH}/filteredDescriptions.txt + +# The thisBuildInfo.txt file contains the information of the current Build, including the BuildID, Reference, and +# other information of that particular build. To get the reference number/ pr number of the recent build, +# the following awk command and grep commands are used, where the Reference part ("Ref: refs/pull/5496/head") +# is stored in the "thisBuildFiltered.txt" file. From the reference, only the pr/reference number is extracted into +# the "NUMBER" variable. +awk "/Ref: refs\/pull/" ${SCRIPT_PATH}/../../thisBuildInfo.txt > ${SCRIPT_PATH}/thisBuildFiltered.txt +NUMBER=$(grep -o -E "[0-9]+" ${SCRIPT_PATH}/thisBuildFiltered.txt) +referenceNum="Ref: refs/pull/"$NUMBER"/head" + +# From all the recent builds, the information about the BuildID and the reference which was stored in the +# "filteredDescriptions.txt" file, only the BuildID part from each of the buildInformation whose Reference is +# exactly same as that of the current build reference is filtered and stored in the "buildsToStop.txt" file. +# The buildIDs and the reference information of each build is stored sequentially in the "filteredDescriptions.txt" file as: + +# "Build #" +# "" +# "Build #" +# "" +# "Build #" +# "" + +# Therefore the following awk command extracts each lines just above the expected reference information. +awk -v ref="$referenceNum" 'index($0,ref){print p} {p=$0}' ${SCRIPT_PATH}/filteredDescriptions.txt > ${SCRIPT_PATH}/buildsToStop.txt + + +# The "buildsToStop.txt" file now contains the buildIDs of the recent builds whose reference id was equal to the reference of the +# current pr/build. + +# "Build #" +# "Build #" +# "Build #" +# "Build #" +# "Build #" + +# For each build in the "buildsToStop.txt" file, if the build number is older than the current drone build number, the build is cancelled. + +while IFS="" read -r p || [ -n "$p" ] +do + printf '%s\n' "$p" + buildNumber=$(echo "$p" | awk -F'#' '{print $(2)}') + + if [ $DRONE_BUILD_NUMBER \> "$buildNumber" ] + then + echo "CANCELLING BUILD: " $buildNumber + drone build stop $OWNCLOUD_OCIS $buildNumber + fi + +done <${SCRIPT_PATH}/buildsToStop.txt +