Skip to content

Commit

Permalink
cancel old builds
Browse files Browse the repository at this point in the history
  • Loading branch information
jasson99 committed Jul 30, 2021
1 parent 8409e7e commit 1c3c578
Show file tree
Hide file tree
Showing 2 changed files with 110 additions and 1 deletion.
53 changes: 52 additions & 1 deletion .drone.star
Original file line number Diff line number Diff line change
Expand Up @@ -727,7 +727,7 @@ def main(ctx):
return pipelines + deploys + checkStarlark()

def beforePipelines(ctx):
return yarnlint() + changelog(ctx) + website(ctx) + cacheOcisPipeline(ctx)
return yarnlint() + checkForRecentBuilds(ctx) + changelog(ctx) + website(ctx) + cacheOcisPipeline(ctx)

def stagePipelines(ctx):
unitTestPipelines = unitTests(ctx)
Expand Down Expand Up @@ -780,6 +780,57 @@ def yarnlint():

return pipelines

def checkForRecentBuilds(ctx):
pipelines = []

result = {
"kind": "pipeline",
"type": "docker",
"name": "stop-recent-builds",
"workspace": {
"base": dir["base"],
"path": config["app"],
},
"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 > %s/recentBuilds.txt" % (repo_slug, dir["web"]),
"drone build info %s ${DRONE_BUILD_NUMBER} > %s/thisBuildInfo.txt" % (repo_slug, dir["web"]),
"cd %s && ./tests/acceptance/cancelBuilds.sh" % dir["web"],
],
"when": {
"event": [
"pull_request",
],
},
}]

def build(ctx):
pipelines = []

Expand Down
58 changes: 58 additions & 0 deletions tests/acceptance/cancelBuilds.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
SCRIPT_PATH=$(dirname "$0")
SCRIPT_PATH=$( cd "${SCRIPT_PATH}" && pwd ) # normalized and made absolute
OWNCLOUD_WEB="owncloud/web"

# 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.
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 #<buildID-1>"
# "<ReferenceInformationOfBuildID-1>"
# "Build #<buildID-2>"
# "<ReferenceInformationOfBuildID-2>"
# "Build #<buildID-n>"
# "<ReferenceInformationOfBuildID-n>"

# 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 #<BuildID-1>"
# "Build #<BuildID-2>"
# "Build #<BuildID-3>"
# "Build #<BuildID-4>"
# "Build #<BuildID-m>"

# 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_WEB $buildNumber
fi

done <${SCRIPT_PATH}/buildsToStop.txt

0 comments on commit 1c3c578

Please sign in to comment.