From e75f63cf30e033689a04cd404f477cd81a29d725 Mon Sep 17 00:00:00 2001 From: Grigo Date: Thu, 4 Jun 2026 09:56:50 +0000 Subject: [PATCH] Initial commit --- Jenkinsfile | 177 ++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 0 2 files changed, 177 insertions(+) create mode 100644 Jenkinsfile create mode 100644 README.md diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..b76009e --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,177 @@ +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' + GITEA_OWNER = 'Grigo' + GITEA_REPO = 'TestingAndroidBuild' // Замените на нужный репозиторий + GITEA_URL = 'https://git.grigowashere.ru' // Базовый URL Gitea + GITEA_API_URL = "${GITEA_URL}/api/v1" + GITEA_TOKEN_CREDENTIALS_ID = 'Gitea_Credentials' // ID ваших креденшлов для Gitea в Jenkins + } + + stages { + stage('Build Android APK') { + steps { + cleanWs() + checkout scm + + sh ''' + chmod +x ./gradlew + ./gradlew clean assembleDebug + ''' + + archiveArtifacts artifacts: '**/build/outputs/apk/**/*.apk', fingerprint: true + stash name: 'apk', includes: '**/build/outputs/apk/**/*.apk' + } + } + + stage('Create Gitea Release and Upload APK') { + steps { + unstash 'apk' + + withCredentials([string(credentialsId: "${env.GITEA_TOKEN_CREDENTIALS_ID}", variable: 'GITEA_TOKEN')]) { + writeFile file: 'gitea-release.sh', text: ''' +#!/bin/bash + +apkPath="build/outputs/apk/debug/app-debug.apk" +headers="Authorization: token $GITEA_TOKEN" + +# Создаем релиз на Gitea +release=$(curl -X POST "${GITEA_API_URL}/repos/$GITEA_OWNER/$GITEA_REPO/releases" \ + -H "$headers" \ + -H "Content-Type: application/json" \ + -d '{ + "tag_name": "v'$BUILD_NUMBER'", + "target_commitish": "main", + "name": "Release v'$BUILD_NUMBER'", + "body": "Jenkins Android build '$BUILD_NUMBER'", + "draft": false, + "prerelease": false + }') + +releaseId=$(echo $release | jq -r .id) + +# Формируем URL для загрузки APK +uploadUrl="${GITEA_API_URL}/repos/$GITEA_OWNER/$GITEA_REPO/releases/$releaseId/assets?name=app-debug.apk" + +# Загружаем APK файл в Gitea +curl -X POST "$uploadUrl" \ + -H "$headers" \ + -F "attachment=@$apkPath;type=application/vnd.android.package-archive" + +if [ $? -ne 0 ]; then + echo "Gitea asset upload failed: $apkPath" + exit 1 +fi +''' + + sh ''' + chmod +x gitea-release.sh + ./gitea-release.sh + ''' + } + } + } + } + + post { + always { + script { + def result = currentBuild.currentResult ?: 'UNKNOWN' + + withCredentials([string(credentialsId: 'TAIGA_TOKEN', variable: 'TAIGA_TOKEN')]) { + sh(returnStatus: true, script: """ + set +e + + REF=\$(git log -1 --pretty=%B | grep -oE 'TG-[0-9]+' | head -1 | cut -d- -f2 || true) + + if [ -z "\$REF" ]; then + echo "No TG-* reference found" + exit 0 + fi + + export REF + export BUILD_RESULT="${result}" + + python3 - <<'PY' +import json +import os +import urllib.request + +taiga_url = os.environ["TAIGA_URL"] +project_id = os.environ["TAIGA_PROJECT_ID"] +token = os.environ["TAIGA_TOKEN"] +ref = os.environ["REF"] + +headers = { + "Authorization": f"Bearer {token}", + "Content-Type": "application/json", +} + +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 Exception: + return None + +targets = [ + ("userstories", "User Story"), + ("issues", "Issue"), + ("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") + raise SystemExit(0) + +endpoint, label, data = found + +comment = ( + f"Jenkins Android 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']}" +req = urllib.request.Request( + url, + data=payload, + headers=headers, + method="PATCH", +) + +try: + with urllib.request.urlopen(req) as r: + print(f"Commented Taiga TG-{ref} ({label}), HTTP {r.status}") +except Exception as e: + print(f"Taiga comment warning: {e}") + raise SystemExit(0) +PY + """.stripIndent()) + } + } + } + } +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29