From f9eadaba3dd185afa60c27af54ff2e3e79bd1b9f Mon Sep 17 00:00:00 2001 From: grigo Date: Sat, 2 May 2026 18:42:09 +0300 Subject: [PATCH] refs TG-2: test Jenkins comment --- Jenkinsfile | 125 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 88 insertions(+), 37 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 976b377..805db2e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,15 +1,17 @@ pipeline { agent any + environment { + JAVA_HOME = '/usr/lib/jvm/java-21-openjdk-amd64' + ANDROID_HOME = '/opt/android-sdk' + ANDROID_SDK_ROOT = '/opt/android-sdk' + PATH = "/usr/lib/jvm/java-21-openjdk-amd64/bin:/opt/android-sdk/cmdline-tools/latest/bin:/opt/android-sdk/platform-tools:${env.PATH}" + TAIGA_PROJECT_ID = '2' + TAIGA_URL = 'https://taiga.grigowashere.ru' + } + stages { stage('Build Android APK') { -environment { - JAVA_HOME = '/usr/lib/jvm/java-21-openjdk-amd64' - ANDROID_HOME = '/opt/android-sdk' - ANDROID_SDK_ROOT = '/opt/android-sdk' - PATH = "/usr/lib/jvm/java-21-openjdk-amd64/bin:/opt/android-sdk/cmdline-tools/latest/bin:/opt/android-sdk/platform-tools:${env.PATH}" -} - steps { cleanWs() checkout scm @@ -23,46 +25,95 @@ environment { } } } -post { - always { - script { - def result = currentBuild.currentResult ?: 'UNKNOWN' - withCredentials([string(credentialsId: 'TAIGA_TOKEN', variable: 'TAIGA_TOKEN')]) { - sh """ - set -e + post { + always { + script { + def result = currentBuild.currentResult ?: 'UNKNOWN' - REF=\$(git log -1 --pretty=%B | grep -oE 'TG-[0-9]+' | head -1 | cut -d- -f2 || true) + withCredentials([string(credentialsId: 'TAIGA_TOKEN', variable: 'TAIGA_TOKEN')]) { + sh """ + set -e - if [ -z "\$REF" ]; then - echo "No TG-* reference found" - exit 0 - fi + REF=\$(git log -1 --pretty=%B | grep -oE 'TG-[0-9]+' | head -1 | cut -d- -f2 || true) - ISSUE_JSON=\$(curl -s \\ - -H "Authorization: Bearer \$TAIGA_TOKEN" \\ - "https://taiga.grigowashere.ru/api/v1/issues/by_ref?project=2&ref=\$REF") + if [ -z "\$REF" ]; then + echo "No TG-* reference found" + exit 0 + fi - ISSUE_ID=\$(echo "\$ISSUE_JSON" | python3 -c 'import sys,json; print(json.load(sys.stdin)["id"])') - VERSION=\$(echo "\$ISSUE_JSON" | python3 -c 'import sys,json; print(json.load(sys.stdin)["version"])') + export REF + export BUILD_RESULT="${result}" - export COMMENT="Jenkins build #${BUILD_NUMBER}: ${result} -${BUILD_URL}" - export VERSION="\$VERSION" + python3 - <<'PY' +import json +import os +import urllib.request +import urllib.error - python3 -c 'import json, os; print(json.dumps({"comment": os.environ["COMMENT"], "version": int(os.environ["VERSION"])}))' \\ - > /tmp/taiga-comment.json +taiga_url = os.environ["TAIGA_URL"] +project_id = os.environ["TAIGA_PROJECT_ID"] +token = os.environ["TAIGA_TOKEN"] +ref = os.environ["REF"] - curl -s -X POST \\ - -H "Authorization: Bearer \$TAIGA_TOKEN" \\ - -H "Content-Type: application/json" \\ - --data @/tmp/taiga-comment.json \\ - "https://taiga.grigowashere.ru/api/v1/issues/\$ISSUE_ID/comments" +headers = { + "Authorization": f"Bearer {token}", + "Content-Type": "application/json", +} - echo "Commented Taiga TG-\$REF" - """.stripIndent() +def get_json(path): + url = f"{taiga_url}{path}" + req = urllib.request.Request(url, headers=headers) + try: + with urllib.request.urlopen(req) as r: + return json.loads(r.read().decode("utf-8")) + except urllib.error.HTTPError: + return None + +targets = [ + ("issues", "Issue"), + ("userstories", "User Story"), + ("tasks", "Task"), +] + +found = None + +for endpoint, label in targets: + data = get_json(f"/api/v1/{endpoint}/by_ref?project={project_id}&ref={ref}") + if data and "id" in data: + found = (endpoint, label, data) + break + +if not found: + print(f"Taiga TG-{ref} not found as issue/userstory/task") + raise SystemExit(0) + +endpoint, label, data = found + +comment = ( + f"Jenkins build #{os.environ['BUILD_NUMBER']}: {os.environ['BUILD_RESULT']}\\n" + f"{os.environ['BUILD_URL']}" +) + +payload = json.dumps({ + "comment": comment, + "version": data["version"], +}).encode("utf-8") + +url = f"{taiga_url}/api/v1/{endpoint}/{data['id']}/comments" +req = urllib.request.Request( + url, + data=payload, + headers=headers, + method="POST", +) + +with urllib.request.urlopen(req) as r: + print(f"Commented Taiga TG-{ref} ({label}), HTTP {r.status}") +PY + """.stripIndent() + } } } } -} } \ No newline at end of file