jenkins pipeline实现CI/CD

在企业级的架构中,CI/CD是必不可少的一个环节,它可以让开发人员只关注于开发,而不必去关注项目的构建和部署,从而提高开发人员的效率。

本文我们来介绍一下使用jenkins 的pipeline来进行java项目的自动构建以及部署。我们通过脚本来生成docker镜像,并推送到镜像仓库,供k8s使用。

整体思路是先通过maven构建项目,然后通过build_docker.sh脚本来打包生成镜像,该脚本接收3个参数,-j 需要执行的jar包的名字,-F 项目文件名 -p ,镜像需要推送的环境

根据参数会打包成相应的镜像,并且推送到镜像仓库。

一 基础镜像环境

1 因为是基于springboot的java项目启动项目需要java环境,我们构建一个自己的jdk环境,使用jdk8。

Dockerfile 如下

FROM ubuntu
WORKDIR /usr/local/jdk1.8.0_301
ADD jdk-8u301-linux-x64.tar.gz /usr/local
ENV JAVA_HOME=/usr/local/jdk1.8.0_301
ENV PATH=$JAVA_HOME/bin:$PATH
CMD ["java","-version"]

构建自己的jdk8镜像

docker build -f Dockerfile -t jdk8img .

2 Jenkins我们也通过docker的方式来运行,基于官方jenkins镜像我们加进去自己的jdk版本(因为目前项目大部分使用jdk8,而最新jenkins官方镜像为jdk11),以及使用宿主机的maven,docker环境,来制作一个jenkins镜像。

这里基于官方镜像,这里安装libltdl7是为了运行宿主机docker环境需要。

FROM jenkins/jenkins
ADD jdk-8u301-linux-x64.tar.gz /usr/local
ENV JAVA_HOME=/usr/local/jdk1.8.0_301
ENV PATH=/usr/local/maven/bin:$JAVA_HOME/bin:$PATH
USER root
RUN apt-get update && apt-get install -y libltdl7

    

这里的前提是宿主机提前安装好maven和docker环境,具体安装方式这里就不详细讲述了。

启动jenkins

这里启动命令挂载了宿主机的docker,以及maven目录

docker run --name jenkins -d -v /etc/localtime:/etc/localtime:ro -v /data1/services/jenkins:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker -v /usr/local/maven:/usr/local/maven  -p 8080:8080 -p 50000:50000 --dns=8.8.8.8 jenkins

二 脚本编写

前面我们制作好了各个基础镜像,现在需要编写脚本来将镜像编译打包以及镜像生成,并推送到镜像仓库

我们有4个脚本要编写

1 jenkins pipeline的配置文件Jenkinsfile,这个是jenkins多分支流水线作业必须的配置文件

2 Dockerfile:构建应用镜像的描述文件

3 build_docker.sh:打包镜像的脚本,我们的项目通过maven打包以后,需要按一定规范存放文件,并且执行启动应用的脚本

4 start.sh项目启动的脚本,用于在镜像启动时执行

Jenkinsfile

pipeline {
    agent any
    stages {
        stage('package') {
            steps {
                sh 'mvn -Dmaven.test.skip=true -Dmaven.source.skip=true  -am clean package -U'
            }
        }
        stage('Test') {
                    steps {
                        sh './build_docker.sh -j smart4-api-1.0-SNAPSHOT.jar -F smart4-api'
                        sh './build_docker.sh -j smart4-web-1.0-SNAPSHOT.jar -F smart4-web'
                    }

                }
    }
}

   Dockerfile

FROM jdk8img
ARG jarfile
RUN rm -f /etc/localtime && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone

WORKDIR /data/app/smart4

ENV DWPROJECTNO=smart4
ENV EXECJAR=$jarfile

ADD workspace /data/app/smart4

EXPOSE 8081

CMD ["sh","-c","shell/start.sh $EXECJAR"]

    build_docker.sh

#!/bin/bash
DOCKER_REGISTRY="harbor.udblogin.87yy.com:4443"
NAMESPACE="yygame"
BASEDIR=$(pwd)
PRONAME=`basename $BASEDIR`
DIRNAME=`dirname  $BASEDIR`
folder=`basename $DIRNAME`
dockerfile="Dockerfile"
product="test"
jarfile=""

while getopts "f:F:p:j:" option
do
    case "$option" in
        f)
            dockerfile="$OPTARG"
            ;;
        F)
            folder="$OPTARG"
            ;;
        p)
            product="$OPTARG"
            ;;
        j)
            jarfile="$OPTARG"
            ;;
        \?)
            usage
            exit 1
            ;;
    esac
done

echo "begin copy workspace"
rm -rf $BASEDIR/workspace
mkdir -p $BASEDIR/workspace/web
mkdir -p $BASEDIR/workspace/lib
mkdir -p $BASEDIR/workspace/shell
mkdir -p $BASEDIR/workspace/config

find . -maxdepth 4 -regex ".*/target/[^\/]*.war"  -exec cp -f {} $BASEDIR/workspace/web/ \;
find . -maxdepth 4 -regex ".*/target/[^\/]*.jar"  -exec cp -f {} $BASEDIR/workspace/lib/ \;
cp -Rf  config/* $BASEDIR/workspace/config/
cp ./start.sh $BASEDIR/workspace/shell

echo "workspace is ready"

echo "begin build docker"

timestamp=$(date "+%Y%m%d%H%M%S")

echo "build -f $dockerfile -t ${DOCKER_REGISTRY}/${NAMESPACE}/${folder}:$timestamp . --build-arg jarfile=$jarfile"

docker build -f $dockerfile -t ${DOCKER_REGISTRY}/${NAMESPACE}/${folder}:$timestamp . --build-arg jarfile=$jarfile

echo "docker build done"

echo "start push to registry"
docker login --username=yygame harbor.udblogin.87yy.com:4443 -p xxxxxx
if [[ $product == "test" ]];then
    docker push ${DOCKER_REGISTRY}/${NAMESPACE}/${folder}:$timestamp
fi
echo "folder $folder"
echo "product $product"
echo "exec jarfile $jarfile"

start.sh 

#!/bin/bash
jarfile=$1
echo "exec $jarfile"
echo "start app"
echo "java -Xss1m -server -d64 -XX:MaxGCPauseMillis=200 -Dnetworkaddress.cache.ttl=600  -Xms256m -Xmx2048m -cp /data/app/smart4/lib/$jarfile org.springframework.boot.loader.JarLauncher"
java -Xss1m -server -d64 -XX:MaxGCPauseMillis=200 -Dnetworkaddress.cache.ttl=600  -Xms256m -Xmx2048m -cp /data/app/smart4/lib/$jarfile org.springframework.boot.loader.JarLauncher

   

三 jenkins新建多分支流水线

新建任务,选择多分支流水线。主要配置git地址,凭据。配置发现分支策略,这里可以按项目代码规范来配置,比如开发版本就过滤掉,因为每次构建都会去打包生成镜像,如果不过滤会构建所有分支的镜像,比较耗时,耗费资源。配置好以后,运行构建,会自动打包并推送镜像到镜像仓库了。

四 构建

我们在jenkins后台选择smart4项目的master分支,点击构建

然后查看构建日志

待构建完成以后,去镜像仓库后台查看镜像仓库是否生成

我们看到已经生成了新的镜像了。整个流程完成。  

Jenkins和Docker可以结合使用来实现CI/CD(持续集成/持续交付)流程。下面是一种常见的实现方式: 1. 安装和配置Jenkins:首先,你需要在你的服务器或本地机器上安装和配置Jenkins。你可以按照Jenkins官方文档提供的步骤进行安装和配置。 2. 安装Docker:接下来,你需要安装Docker,并确保Docker服务正在运行。你可以根据你的操作系统在Docker官方网站上找到相应的安装说明。 3. 创建JenkinsCI/CD Pipeline:在Jenkins中,你可以创建一个Pipeline来定义你的CI/CD流程。Pipeline是一种将多个步骤组合在一起的方式,可以通过代码进行定义和版本控制。你可以使用JenkinsPipeline语法或者使用Jenkins插件来定义你的Pipeline。 4. 定义Jenkins Pipeline中的步骤:在你的Pipeline中,你可以定义多个步骤来完成CI/CD流程。以下是一个可能的步骤示例: - 从代码仓库拉取代码 - 构建Docker镜像 - 运行单元测试 - 部署到测试环境 - 运行集成测试 - 部署到生产环境 5. 使用Docker构建和管理镜像:在上述步骤中,使用Docker构建和管理镜像是关键。你可以使用Dockerfile来定义镜像的构建过程,并使用Jenkins Pipeline中的相关步骤来执行构建。 6. 集成其他工具:你可以通过Jenkins插件或其他方式集成其他工具,如代码质量检查工具、部署工具等,以实现更完整的CI/CD流程。 这只是一个简单的概述,实际的CI/CD流程可以根据你的项目需求和团队实践进行定制和扩展。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值