写在最前
1. 构建流程
KubeSphere 官方的 builder-base
代码库可以在 https://github.com/kubesphere/devops-agent/tree/master/gradle 找到,里面包含了 DevOps 相关的构建工具与配置。如果你需要下载其他版本的 OpenJDK,可以参考 JDK 官方提供的 https://jdk.java.net/java-se-ri/17-MR1,该页面列出了各个版本的详细下载信息,方便你根据需求选择合适的版本进行使用。
1.1 Dockerfile
选择一个下载到当前构建目录
wget https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21%2B35/OpenJDK21U-jdk_x64_linux_hotspot_21_35.tar.gz
wget https://tanqidi.com/upload/OpenJDK21U-jdk_x64_linux_hotspot_21_35.tar.gz
FROM kubespheredev/builder-base:v3.1.0
# 使用当前目录下的 OpenJDK21U-jdk_x64_linux_hotspot_21_35.tar.gz 文件
COPY OpenJDK21U-jdk_x64_linux_hotspot_21_35.tar.gz /tmp/temurin-jdk21.tar.gz
# 解压并安装 JDK 21
RUN tar -xzf /tmp/temurin-jdk21.tar.gz -C /opt && \
rm /tmp/temurin-jdk21.tar.gz
# 设置 JDK 21 环境变量
ENV JAVA_HOME /opt/jdk-21+35
ENV PATH $JAVA_HOME/bin:$PATH
# 安装 Maven 3.9.9
ENV MAVEN_VERSION=3.9.9
ENV MAVEN_MAJOR_VERSION=3
ENV MAVEN_HOME=/opt/maven-$MAVEN_VERSION
ENV PATH="$MAVEN_HOME/bin:$PATH"
RUN wget https://archive.apache.org/dist/maven/maven-${MAVEN_MAJOR_VERSION}/$MAVEN_VERSION/binaries/apache-maven-$MAVEN_VERSION-bin.tar.gz && \
mkdir -p /opt/maven-$MAVEN_VERSION && \
tar -xzf apache-maven-$MAVEN_VERSION-bin.tar.gz -C /opt/maven-$MAVEN_VERSION --strip-components=1 && \
rm apache-maven-$MAVEN_VERSION-bin.tar.gz
# 测试 JDK 和 Maven 是否有效
RUN java -version && \
mvn -v
1.2 测试连接
缓存目录是/root/.m2同时也可以外挂settings.xml进去做私有化nexus配置
- name: "jdk21-maven3.9.9"
namespace: "kubesphere-devops-worker"
label: "jdk21-maven3.9.9"
nodeUsageMode: "EXCLUSIVE"
idleMinutes: 0
containers:
- name: "maven"
image: "registry.cn-hangzhou.aliyuncs.com/tanqidi/builder-maven:jdk21-maven3.9.9"
command: "cat"
args: ""
ttyEnabled: true
privileged: false
resourceRequestCpu: "100m"
resourceLimitCpu: "4000m"
resourceRequestMemory: "100Mi"
resourceLimitMemory: "8192Mi"
- name: "jnlp"
image: "registry.cn-beijing.aliyuncs.com/kubesphereio/inbound-agent:4.10-2"
args: "^${computer.jnlpmac} ^${computer.name}"
resourceRequestCpu: "50m"
resourceLimitCpu: "500m"
resourceRequestMemory: "400Mi"
resourceLimitMemory: "1536Mi"
workspaceVolume:
emptyDirWorkspaceVolume:
memory: false
volumes:
- hostPathVolume:
hostPath: "/var/run/docker.sock"
mountPath: "/var/run/docker.sock"
- hostPathVolume:
hostPath: "/var/data/jenkins_maven_cache"
mountPath: "/root/.m2"
yaml: |
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: node-role.kubernetes.io/worker
operator: In
values:
- ci
tolerations:
- key: "node.kubernetes.io/ci"
operator: "Exists"
effect: "NoSchedule"
- key: "node.kubernetes.io/ci"
operator: "Exists"
effect: "PreferNoSchedule"
containers:
- name: "maven"
resources:
requests:
ephemeral-storage: "1Gi"
limits:
ephemeral-storage: "10Gi"
securityContext:
fsGroup: 1000
连接私有nexus外挂settings.xml方式,主要内容与上面一样只需要变更yaml: | 的部分,它位于 kubesphere-devops-worker
命名空间中的名为 ks-devops-agent
的 ConfigMap,在里面需要预先配置好nexus的连接地址与账号密码即可,其中mountPath中的文件路径需要结合构建的maven版本号而变化的,不然你写死路径会挂载失败无法识别。
yaml: |
spec:
affinity: ??????????????
tolerations: ??????????????
containers:
- name: "maven"
resources:
requests:
ephemeral-storage: "1Gi"
limits:
ephemeral-storage: "10Gi"
volumeMounts:
- name: config-volume
mountPath: /opt/maven-3.9.9/conf/settings.xml
subPath: settings.xml
volumes:
- name: config-volume
configMap:
name: ks-devops-agent
items:
- key: MavenSetting
path: settings.xml
securityContext:
fsGroup: 1000
2. 常见异常
2.1 Failed to delete pod for agent kubesphere-devops-worker/maven3.9.9-kz948: not found
3. 镜像制品
tanqidi/builder-maven:jdk21-maven3.9.9