Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions .teamcity/Agent.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,12 @@
* limitations under the License.
*/

enum class Agent(val os: Os, val architecture: Architecture) {
UbuntuAmd64(os = Os.Ubuntu16, architecture = Architecture.Amd64),
enum class Agent(val os: Os, val architecture: Architecture, val nativePublishContainer: String? = null) {
UbuntuAmd64(
os = Os.Ubuntu24,
architecture = Architecture.Amd64,
nativePublishContainer = "native-platform/ubuntu16-publish:local",
),
UbuntuAarch64(os = Os.Ubuntu16, architecture = Architecture.Aarch64),
AmazonLinuxAmd64(os = Os.AmazonLinux, architecture = Architecture.Amd64),
AmazonLinuxAarch64(os = Os.AmazonLinux, architecture = Architecture.Aarch64),
Expand Down
23 changes: 21 additions & 2 deletions .teamcity/NativePlatformBuild.kt
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,33 @@ open class NativePlatformBuild(agent: Agent, buildReceiptSource: Boolean = false
}

steps {
val publishOnHost = agent.nativePublishContainer.isNullOrBlank() || agent.allPublishTasks.isBlank()
if (!publishOnHost) {
buildNativePublishContainerImage(agent)
}

gradle {
tasks =
"clean build -PagentName=${agent.name}${agent.allPublishTasks} ${javaInstallationLocations()}"
tasks = buildString {
append("clean build -PagentName=${agent.name}")
if (publishOnHost) {
append(agent.allPublishTasks)
}
append(" ${javaInstallationLocations()}")
}
if (buildReceiptSource) {
gradleParams = "-PignoreIncomingBuildReceipt"
}
buildFile = ""
}

if (!publishOnHost) {
gradle {
name = "Publish (glibc 2.23 container)"
tasks = "${agent.allPublishTasks.trim()} ${javaInstallationLocations()}"
useNativePublishContainer(agent)
buildFile = ""
}
}
}

features {
Expand Down
9 changes: 9 additions & 0 deletions .teamcity/NativePlatformPublishing.kt
Original file line number Diff line number Diff line change
Expand Up @@ -91,11 +91,20 @@ open class NativePlatformPublishSnapshot(
}

steps {
val usesNativePublishContainer = !agent.nativePublishContainer.isNullOrBlank() &&
uploadTasks.any { it.isNativePublishTask() }
if (usesNativePublishContainer) {
buildNativePublishContainerImage(agent)
}

uploadTasks.forEach { task ->
gradle {
name = "Gradle $task"
tasks =
"clean $task -P${releaseType.gradleProperty}${if (releaseType.userProvidedVersion) "=%versionPostfix%" else ""} ${javaInstallationLocations()}"
if (usesNativePublishContainer && task.isNativePublishTask()) {
useNativePublishContainer(agent)
}
buildFile = ""
}
}
Expand Down
7 changes: 7 additions & 0 deletions .teamcity/Os.kt
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,13 @@ interface Os {
}
}

object Ubuntu24 : Linux(Ncurses.Ncurses6) {
override fun Requirements.additionalRequirements() {
contains(osDistributionNameParameter, "ubuntu")
contains(osDistributionVersionParameter, "24")
}
}

object AmazonLinux : Linux(Ncurses.Ncurses6) {
override fun Requirements.additionalRequirements() {
contains(osDistributionNameParameter, "amazon")
Expand Down
25 changes: 25 additions & 0 deletions .teamcity/docker/native-publish-ubuntu16/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Released native-platform Linux libraries must stay on glibc 2.23 (Ubuntu 16.04).
FROM ubuntu:16.04

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt-get install -y \
ca-certificates \
curl \
g++ \
git \
libncurses5-dev \
openjdk-8-jdk \
unzip \
&& rm -rf /var/lib/apt/lists/*

ARG JDK21_VERSION=jdk-21.0.11+10
RUN mkdir -p /opt/jdk \
&& curl -fsSL "https://api.adoptium.net/v3/binary/version/${JDK21_VERSION}/linux/x64/jdk/hotspot/normal/adoptium" -o /tmp/jdk21.tar.gz \
&& tar xf /tmp/jdk21.tar.gz -C /opt/jdk \
&& ln -s "/opt/jdk/${JDK21_VERSION}" /opt/jdk/open-jdk-21 \
&& rm /tmp/jdk21.tar.gz

ENV JDK8=/usr/lib/jvm/java-8-openjdk-amd64
ENV JDK21=/opt/jdk/open-jdk-21
ENV JAVA_HOME=/opt/jdk/open-jdk-21
26 changes: 26 additions & 0 deletions .teamcity/extensions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,13 @@

import jetbrains.buildServer.configs.kotlin.BuildFeatures
import jetbrains.buildServer.configs.kotlin.BuildType
import jetbrains.buildServer.configs.kotlin.BuildSteps
import jetbrains.buildServer.configs.kotlin.DslContext
import jetbrains.buildServer.configs.kotlin.Requirements
import jetbrains.buildServer.configs.kotlin.buildFeatures.commitStatusPublisher
import jetbrains.buildServer.configs.kotlin.buildFeatures.freeDiskSpace
import jetbrains.buildServer.configs.kotlin.buildSteps.GradleBuildStep
import jetbrains.buildServer.configs.kotlin.buildSteps.script

fun Requirements.requireAgent(agent: Agent) {
agent.os.addAgentRequirements(this)
Expand Down Expand Up @@ -97,3 +100,26 @@ fun BuildFeatures.lowerRequiredFreeDiskSpace() {
failBuild = false
}
}

private const val nativePublishContainerDockerfile = ".teamcity/docker/native-publish-ubuntu16"

fun BuildSteps.buildNativePublishContainerImage(agent: Agent) {
val containerImage = agent.nativePublishContainer ?: return
script {
name = "Build native publish container image"
scriptContent = """
#!/bin/bash
set -euo pipefail
docker build -t $containerImage $nativePublishContainerDockerfile
""".trimIndent()
}
}

fun GradleBuildStep.useNativePublishContainer(agent: Agent) {
val containerImage = agent.nativePublishContainer ?: return
dockerImage = containerImage
dockerPull = false
}

fun String.isNativePublishTask(): Boolean =
contains("uploadJni") || contains("uploadNcurses")
Loading