searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

【最佳实践】大数据组件标准化建设落地(一)

2024-05-31 05:34:41
8
0

一、背景

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+个组件实现了初步标准化建设,即需求管理->分支管理->容器化出包->流水线自动监听。摆脱了初期混乱管理,流水线部分成果如下:

 

0条评论
0 / 1000
l****n
4文章数
0粉丝数
l****n
4 文章 | 0 粉丝
l****n
4文章数
0粉丝数
l****n
4 文章 | 0 粉丝
原创

【最佳实践】大数据组件标准化建设落地(一)

2024-05-31 05:34:41
8
0

一、背景

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+个组件实现了初步标准化建设,即需求管理->分支管理->容器化出包->流水线自动监听。摆脱了初期混乱管理,流水线部分成果如下:

 

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0