一、背景
1.1 问题
- 超过半数组件未源码管理,直接从官网下载编译包或者本地源码管理本地出包,无法溯源;
- 源码管理组件分支管理混乱,研发自定义分支,无法做到故障溯源;
- 源码打包本地打包,未接入CICD出包;
- 输出编译包后,包的质量没保障,未有自动化等测试手段,人工测试也未有流程保障;
- 组件漏洞修复混乱,采用直接替换jar包方式修复漏洞,未做到留存溯源等;
1.2 组件源码现状收集
同对接人沟通整理组件源码管理现状,对于未接入源码管理的,安排接入
二、整体方案设计
2.1 需求管理
组件启用CCDP电信定制化版本号,需求统一平台化管理,通过不同版本进行阶段化交付。
2.2 分支管理方案
2.3 容器化编译
组件编译采用容器化方式,即每个组件制作单独的打包镜像,通过镜像进行容器化方式打包。品控团队提供x86和arm两种基础打包镜像,dockerfile如下:
FROM harbor.ctyuncdn.cn/bdyun/basic-image/x86-ctyunos:v1.0.0 AS builder
# Copy files
COPY bisheng-jdk1.8.0_352 /path/to/jdk
COPY apache-maven-3.6.3 /usr/local/maven
COPY ctyunos.repo /etc/yum.repos.d/ctyunos.repo
# Install basic tools
RUN yum install -y openssh-clients wget tar zip git npm nodejs
RUN yum clean all
# disable auto enable ccache
RUN rm -f /etc/profile.d/ccache.*
# squash all layers to reduce the image size
FROM scratch
COPY --from=builder / /
ENV JAVA_HOME="/path/to/jdk" \
CLASSPATH=".:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar" \
JRE_HOME="$JAVA_HOME/jre"
ENV MAVEN_HOME="/usr/local/maven"
ENV PATH="$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin"
WORKDIR /root
CMD ["/bin/bash"]
通过命令:docker build -t amd-ctyunos:v1.0.0 .生成基础镜像amd-ctyunos:v1.0.0。该基础镜像安装了jdk,maven,基础yum源。
组件在基础镜像基础上制作打包镜像,以hadoop为例:
FROM amd-ctyunos:v1.0.0 AS builder
# Copy files
COPY dependencies/ /tmp/dependencies/
# Install basic tools
RUN yum install -y ant make bzip2* snappy* zstd* ndctl* openssl* lz4* zlib* daxctl* cmake yasm* gcc-c++ cyrus-sasl* autoconf libtool pkg-config protobuf doxygen protobuf-compiler libtirpc* protobuf-devel
RUN tar -zxvf /tmp/dependencies/isa-l-2.30.0.tar.gz -C /usr/local && \
cd /usr/local/isa-l-2.30.0 && \
./autogen.sh && \
./configure --prefix=/usr --libdir=/usr/lib64 &&\
make && make install
RUN tar -zxvf /tmp/dependencies/pandoc-3.1.2.tar.gz -C /usr/local
RUN export PATH=/usr/local/pandoc-3.1.2/bin/:$PATH && \
tar -zxvf /tmp/dependencies/pmdk-1.12.1.tar.gz -C /usr/local && \
cd /usr/local/pmdk-1.12.1 && \
make && make install
# disable auto enable ccache
RUN rm -f /etc/profile.d/ccache.*
# squash all layers to reduce the image size
FROM scratch
COPY --from=builder / /
ENV JAVA_HOME="/path/to/jdk" \
CLASSPATH=".:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar" \
JRE_HOME="$JAVA_HOME/jre"
ENV MAVEN_HOME="/usr/local/maven"
ENV PATH="$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin"
WORKDIR /root
CMD ["/bin/bash"]
在amd-ctyunos:v1.0.0镜像基础上,安装hadoop打编译包所需要的基础工具。
通过docker build -t amd-ctyunos-hadoop:v1.0.0 . 命令生成 amd-ctyunos-hadoop:v1.0.0 打包镜像。
通过docker run --rm -ti amd-ctyunos-hadoop:v1.0.0 /bin/bash -c "mvn -v"命令启动容器,进行打包操作。
2.4 tar包流水线
基于2.3章节的镜像制作,制作流水线进行自动编译,其中编译打包节点为:
stage('Build-Package') {
when {
expression { BRANCH_NAME ==~ env.MASTER_BRANCH || BRANCH_NAME ==~ env.DEV_BRANCH || BRANCH_NAME ==~ env.RELEASE_TAG}
}
steps {
script {
sh """ls -lh"""
sh """echo $WORKSPACE"""
if(BRANCH_NAME ==~ env.MASTER_BRANCH || BRANCH_NAME ==~ env.DEV_BRANCH){
sh """docker run --privileged --rm -v $WORKSPACE:$WORKSPACE -v /data1/maven:/data1/maven amd-ctyunos-hadoop:v1.0.0 /bin/bash -c 'cd $WORKSPACE && mvn clean package -Pdist,native -DskipTests -Dtar -Drequire.zstd=true -Dbundle.zstd=true -Dzstd.lib=/usr/lib64 -Drequire.snappy=true -Dbundle.snappy=true -Dsnappy.prefix=/usr/lib64 -Dsnappy.lib=/usr/lib64 -Drequire.isal=true -Dbundle.isal=true -Disal.prefix=/usr/lib64 -Disal.lib=/usr/lib64 -Drequire.lz4=true -Dbundle.lz4=true -Dlz4.prefix=/usr/lib64 -Dlz4.lib=/usr/lib64 -Drequire.openssl=true -Dbundle.openssl=true -Dopenssl.prefix=/usr/lib64 -Dopenssl.lib=/usr/lib64 -Drequire.bzip2=true -Dbundle.bzip2=true -Dbzip2.prefix=/usr/lib64 -Dbzip2.lib=/usr/lib64 -Drequire.pmdk=true -Dbundle.pmdk=true -Dpmdk.prefix=/usr/local/lib64 -Dpmdk.lib=/usr/local/lib64'"""
}else{
sh """docker run --privileged --rm -v $WORKSPACE:$WORKSPACE -v /data1/maven:/data1/maven amd-ctyunos-hadoop:v1.0.0 /bin/bash -c 'cd $WORKSPACE && mvn clean package -Pdist,native -DskipTests -Dtar -Drequire.zstd=true -Dbundle.zstd=true -Dzstd.lib=/usr/lib64 -Drequire.snappy=true -Dbundle.snappy=true -Dsnappy.prefix=/usr/lib64 -Dsnappy.lib=/usr/lib64 -Drequire.isal=true -Dbundle.isal=true -Disal.prefix=/usr/lib64 -Disal.lib=/usr/lib64 -Drequire.lz4=true -Dbundle.lz4=true -Dlz4.prefix=/usr/lib64 -Dlz4.lib=/usr/lib64 -Drequire.openssl=true -Dbundle.openssl=true -Dopenssl.prefix=/usr/lib64 -Dopenssl.lib=/usr/lib64 -Drequire.bzip2=true -Dbundle.bzip2=true -Dbzip2.prefix=/usr/lib64 -Dbzip2.lib=/usr/lib64 -Drequire.pmdk=true -Dbundle.pmdk=true -Dpmdk.prefix=/usr/local/lib64 -Dpmdk.lib=/usr/local/lib64'"""
}
BUILD_RESULT = devops.updateBuildTasks(BUILD_RESULT,"Build-Package OK...√")
}
}
}
三、实践落地
整体方案制定评审,并在doris组件进行落地,继而推广其他组件。落地过程中提供x86及arm打包机,基础镜像,jenkins服务等,制定详细的落地计划:
四、总结
经过2023年第四季度的建设推广落地,目前20+个组件实现了初步标准化建设,即需求管理->分支管理->容器化出包->流水线自动监听。摆脱了初期混乱管理,流水线部分成果如下: