charts/pipelines-library/templates/tasks/bitbucket-set-status.yaml (170 lines of code) (raw):

{{ if .Values.pipelines.deployableResources.tasks }} apiVersion: tekton.dev/v1 kind: Task metadata: name: bitbucket-set-status labels: app.kubernetes.io/version: "0.4" annotations: tekton.dev/categories: Git tekton.dev/pipelines.minVersion: "0.12.1" tekton.dev/tags: bitbucket tekton.dev/displayName: "set bitbucket status" tekton.dev/platforms: "linux/amd64,linux/s390x,linux/ppc64le" spec: description: >- This task will set the status of the CI job to the specified value along with a link to the specified target URL where developers can follow the progress of the CI job. The `bitbucket-set-status` task allows external services to mark Bitbucket commits with an `INPROGRESS`, `SUCCESSFUL`, or `FAILED` state, which is then reflected in pull requests involving those commits. Statuses include a `description` and a `target_url` to give users information about the CI statuses or a direct link to the full log. volumes: - name: bitbuckettoken secret: secretName: $(params.BITBUCKET_TOKEN_SECRET_NAME) params: - name: BITBUCKET_HOST_URL description: | The Bitbucket host, adjust this if you run a Bitbucket server. default: "api.bitbucket.org" type: string - name: API_PATH_PREFIX description: | The API path prefix, Bitbucket may have a prefix for certain versions. default: "https://api.bitbucket.org/2.0/repositories/" type: string - name: REPO_FULL_NAME description: | The Bitbucket repository full name, e.g.: myorg/myrepo type: string - name: BITBUCKET_TOKEN_SECRET_NAME description: | The name of the kubernetes secret that contains the Bitbucket token, default: bitbucket type: string default: ci-bitbucket - name: BITBUCKET_TOKEN_SECRET_KEY description: | The key within the kubernetes secret that contains the Bitbucket token, default: token type: string default: token - name: SHA description: | Commit SHA to set the status for. type: string - name: TARGET_URL description: | The target URL to associate with this status. This URL will be linked from the Bitbucket UI to allow users to easily see the source of the status. type: string - name: DESCRIPTION description: | A short description of the status. type: string - name: STATE description: | The state of the status. Can be one of the following `INPROGRESS`, `SUCCESSFUL`, or `FAILED`. type: string - name: AUTH_TYPE description: | The type of authentication to use. You could use the less secure "Basic" for example. type: string default: Basic - name: IMAGE description: | Image providing the python binary which this task uses. type: string default: {{ include "edp-tekton.registry" . }}/python:3.10.8-alpine3.16 - name: SHEBANG description: | Python path. Depends on the image. type: string default: /usr/bin/env python - name: KEY description: | The key that holds the status, e.g., build, review, deploy. type: string - name: NAME description: | If the name field is present, it'll be displayed to users in the UI. type: string steps: - name: set-status volumeMounts: - name: bitbuckettoken mountPath: /etc/bitbucket-set-status env: - name: BITBUCKET_HOST_URL value: $(params.BITBUCKET_HOST_URL) - name: API_PATH_PREFIX value: $(params.API_PATH_PREFIX) - name: REPO_FULL_NAME value: $(params.REPO_FULL_NAME) - name: BITBUCKET_TOKEN_SECRET_NAME value: $(params.BITBUCKET_TOKEN_SECRET_NAME) - name: BITBUCKET_TOKEN_SECRET_KEY value: $(params.BITBUCKET_TOKEN_SECRET_KEY) - name: SHA value: $(params.SHA) - name: TARGET_URL value: $(params.TARGET_URL) - name: DESCRIPTION value: $(params.DESCRIPTION) - name: STATE value: $(params.STATE) - name: AUTH_TYPE value: $(params.AUTH_TYPE) - name: SHEBANG value: $(params.SHEBANG) - name: KEY value: $(params.KEY) - name: NAME value: $(params.NAME) image: $(params.IMAGE) script: | #!$(params.SHEBANG) """This script will set the CI status on Bitbucket PR with enhanced debugging""" import json import os import sys import http.client # Load the token bitbucket_token_filename = "/etc/bitbucket-set-status/" + \ os.getenv("BITBUCKET_TOKEN_SECRET_KEY") bitbucket_token = open(bitbucket_token_filename, "r").read().strip() # Form the status URL status_url = os.getenv("API_PATH_PREFIX") + os.getenv("REPO_FULL_NAME") + "/commit/" + os.getenv("SHA") + "/statuses/build" # Prepare the data data = { "state": os.getenv("STATE"), "url": os.getenv("TARGET_URL"), "description": os.getenv("DESCRIPTION"), "key": os.getenv("KEY"), "name": os.getenv("NAME") } authHeader = os.getenv("AUTH_TYPE") + " " + bitbucket_token headers = { "User-Agent": "TektonCD, the peaceful cat", "Authorization": authHeader, "Accept": "application/json", "Content-Type": "application/json" } # This is for our fake bitbucket server if "$(params.BITBUCKET_HOST_URL)".startswith("http://"): conn = http.client.HTTPConnection("$(params.BITBUCKET_HOST_URL)".replace("http://", "")) else: conn = http.client.HTTPSConnection("$(params.BITBUCKET_HOST_URL)") # Send the request conn.request("POST", status_url, body=json.dumps(data), headers=headers) resp = conn.getresponse() response_body = resp.read() if not str(resp.status).startswith("2"): print("Error: %d" % (resp.status)) print(response_body) sys.exit(1) else: print("Bitbucket status '{state}' has been set on {repo}#{sha}".format( state=os.getenv("STATE"), repo=os.getenv("REPO_FULL_NAME"), sha=os.getenv("SHA"), key=os.getenv("KEY"), name=os.getenv("NAME"),) ) {{ end }}