写在最前

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

image-juiv.png

2. 常见异常

2.1 Failed to delete pod for agent kubesphere-devops-worker/maven3.9.9-kz948: not found

image-fccr.png

3. 镜像制品

  • tanqidi/builder-maven:jdk21-maven3.9.9