generated from Grigo/AndroidTemplate
184 lines
5.4 KiB
Groovy
184 lines
5.4 KiB
Groovy
// AndroidAisMap: compileSdk/targetSdk 35, AGP 8.9, Gradle 8.11.1, Java 11 (toolchain on agent: JDK 21 OK).
|
|
// На сервере один раз (подставьте путь к sdkmanager):
|
|
// yes | sdkmanager --licenses
|
|
// sdkmanager --install "cmdline-tools;latest" "platforms;android-35" "build-tools;35.0.0" "platform-tools"
|
|
// NDK/CMake в проекте не заданы — отдельно не нужны, пока не добавите native-сборку.
|
|
|
|
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 = '3'
|
|
TAIGA_URL = 'https://taiga.grigowashere.ru'
|
|
GITEA_OWNER = 'Grigo'
|
|
GITEA_REPO = 'AndroidAisMap'
|
|
GITEA_URL = 'https://git.grigowashere.ru'
|
|
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="app/build/outputs/apk/debug/app-debug.apk"
|
|
headers="Authorization: token $GITEA_TOKEN"
|
|
commitish="${GIT_COMMIT:-$(git rev-parse HEAD)}"
|
|
|
|
# Создаем релиз на Gitea (target_commitish — текущий коммит сборки)
|
|
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": "'"$commitish"'",
|
|
"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())
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |