-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
pipeline level finally - implementation
We can now specify a list of tasks needs to be executed just before pipeline exits (either after finishing all non-final tasks successfully or after a single failure) Most useful for tasks such as report test results, cleanup cluster resources, etc ``` apiVersion: tekton.dev/v1beta1 kind: Pipeline metadata: name: pipeline-with-final-tasks spec: tasks: - name: pre-work taskRef: Name: some-pre-work - name: unit-test taskRef: Name: run-unit-test runAfter: - pre-work - name: integration-test taskRef: Name: run-integration-test runAfter: - unit-test finally: - name: cleanup-test taskRef: Name: cleanup-cluster - name: report-results taskRef: Name: report-test-results ```
- Loading branch information
1 parent
44f22a0
commit 3e22d0e
Showing
9 changed files
with
1,625 additions
and
78 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
187 changes: 187 additions & 0 deletions
187
examples/v1beta1/pipelineruns/pipelinerun-with-final-tasks.yaml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,187 @@ | ||
# Copied from https://github.com/tektoncd/catalog/blob/v1beta1/git/git-clone.yaml :( | ||
# This can be deleted after we add support to refer to the remote Task in a registry (Issue #1839) or | ||
# add support for referencing task in git directly (issue #2298) | ||
apiVersion: tekton.dev/v1beta1 | ||
kind: Task | ||
metadata: | ||
name: git-clone-from-catalog | ||
spec: | ||
workspaces: | ||
- name: output | ||
description: The git repo will be cloned onto the volume backing this workspace | ||
params: | ||
- name: url | ||
description: git url to clone | ||
type: string | ||
- name: revision | ||
description: git revision to checkout (branch, tag, sha, ref…) | ||
type: string | ||
default: master | ||
- name: refspec | ||
description: (optional) git refspec to fetch before checking out revision | ||
default: "" | ||
- name: submodules | ||
description: defines if the resource should initialize and fetch the submodules | ||
type: string | ||
default: "true" | ||
- name: depth | ||
description: performs a shallow clone where only the most recent commit(s) will be fetched | ||
type: string | ||
default: "1" | ||
- name: sslVerify | ||
description: defines if http.sslVerify should be set to true or false in the global git config | ||
type: string | ||
default: "true" | ||
- name: subdirectory | ||
description: subdirectory inside the "output" workspace to clone the git repo into | ||
type: string | ||
default: "" | ||
- name: deleteExisting | ||
description: clean out the contents of the repo's destination directory (if it already exists) before trying to clone the repo there | ||
type: string | ||
default: "false" | ||
- name: httpProxy | ||
description: git HTTP proxy server for non-SSL requests | ||
type: string | ||
default: "" | ||
- name: httpsProxy | ||
description: git HTTPS proxy server for SSL requests | ||
type: string | ||
default: "" | ||
- name: noProxy | ||
description: git no proxy - opt out of proxying HTTP/HTTPS requests | ||
type: string | ||
default: "" | ||
results: | ||
- name: commit | ||
description: The precise commit SHA that was fetched by this Task | ||
steps: | ||
- name: clone | ||
image: gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/git-init:v0.12.1 | ||
script: | | ||
CHECKOUT_DIR="$(workspaces.output.path)/$(params.subdirectory)" | ||
cleandir() { | ||
# Delete any existing contents of the repo directory if it exists. | ||
# | ||
# We don't just "rm -rf $CHECKOUT_DIR" because $CHECKOUT_DIR might be "/" | ||
# or the root of a mounted volume. | ||
if [[ -d "$CHECKOUT_DIR" ]] ; then | ||
# Delete non-hidden files and directories | ||
rm -rf "$CHECKOUT_DIR"/* | ||
# Delete files and directories starting with . but excluding .. | ||
rm -rf "$CHECKOUT_DIR"/.[!.]* | ||
# Delete files and directories starting with .. plus any other character | ||
rm -rf "$CHECKOUT_DIR"/..?* | ||
fi | ||
} | ||
if [[ "$(params.deleteExisting)" == "true" ]] ; then | ||
cleandir | ||
fi | ||
test -z "$(params.httpProxy)" || export HTTP_PROXY=$(params.httpProxy) | ||
test -z "$(params.httpsProxy)" || export HTTPS_PROXY=$(params.httpsProxy) | ||
test -z "$(params.noProxy)" || export NO_PROXY=$(params.noProxy) | ||
/ko-app/git-init \ | ||
-url "$(params.url)" \ | ||
-revision "$(params.revision)" \ | ||
-refspec "$(params.refspec)" \ | ||
-path "$CHECKOUT_DIR" \ | ||
-sslVerify="$(params.sslVerify)" \ | ||
-submodules="$(params.submodules)" \ | ||
-depth "$(params.depth)" | ||
cd "$CHECKOUT_DIR" | ||
RESULT_SHA="$(git rev-parse HEAD | tr -d '\n')" | ||
EXIT_CODE="$?" | ||
if [ "$EXIT_CODE" != 0 ] | ||
then | ||
exit $EXIT_CODE | ||
fi | ||
# Make sure we don't add a trailing newline to the result! | ||
echo -n "$RESULT_SHA" > $(results.commit.path) | ||
--- | ||
|
||
# Task to cleanup shared workspace | ||
apiVersion: tekton.dev/v1beta1 | ||
kind: Task | ||
metadata: | ||
name: cleanup-workspace | ||
spec: | ||
workspaces: | ||
# Shared workspace where git repo is cloned | ||
- name: source | ||
steps: | ||
- name: check-application-dir-has-source | ||
image: ubuntu | ||
script: | | ||
if [ ! -d "$(workspaces.source.path)/application/" ]; then | ||
echo "Something went wrong and could not find application source under $(workspaces.source.path)/application/" | ||
exit 1 | ||
fi | ||
- name: cleanup-workspace | ||
image: ubuntu | ||
script: | | ||
rm -rf $(workspaces.source.path)/application/ | ||
- name: verify-application-dir-has-gone | ||
image: ubuntu | ||
script: | | ||
if [ -d "$(workspaces.source.path)/application/" ]; then | ||
echo "Something went wrong cleaning up and the application source still exists under $(workspaces.source.path)/application/" | ||
exit 1 | ||
fi | ||
--- | ||
|
||
# Pipeline to clone repo into shared workspace and cleanup the workspace after done | ||
apiVersion: tekton.dev/v1beta1 | ||
kind: Pipeline | ||
metadata: | ||
name: clone-cleanup-workspace | ||
spec: | ||
workspaces: | ||
# common workspace where git repo is cloned and needs to be cleanup after done | ||
- name: git-source | ||
tasks: | ||
# Clone app repo to workspace | ||
- name: clone-app-repo | ||
taskRef: | ||
name: git-clone-from-catalog | ||
params: | ||
- name: url | ||
value: https://github.com/tektoncd/community.git | ||
- name: subdirectory | ||
value: application | ||
workspaces: | ||
- name: output | ||
workspace: git-source | ||
finally: | ||
# Cleanup workspace | ||
- name: cleanup | ||
taskRef: | ||
name: cleanup-workspace | ||
workspaces: | ||
- name: source | ||
workspace: git-source | ||
--- | ||
|
||
# PipelineRun to execute pipeline - clone-into-workspace-and-cleanup-workspace | ||
apiVersion: tekton.dev/v1beta1 | ||
kind: PipelineRun | ||
metadata: | ||
name: write-and-cleanup-workspace | ||
spec: | ||
pipelineRef: | ||
name: clone-cleanup-workspace | ||
serviceAccountName: 'default' | ||
workspaces: | ||
- name: git-source | ||
volumeClaimTemplate: | ||
spec: | ||
accessModes: | ||
- ReadWriteOnce | ||
resources: | ||
requests: | ||
storage: 1Gi | ||
--- |
Oops, something went wrong.