Jenkins简介

Jenkins是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更重要的业务逻辑实现上。同时Jenkins能实时监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象的展示项目构建的趋势和稳定性。



虚拟机安装Jenkins

因为Jenkins是java语言写的,所以首先在208机器上配置jdk,版本为11,然后下载配置Jenkins,maven,Git,完全按照《Jenkins持续集成入门到精通》上的可能会有版本过老导致Jenkins上面的可下载插件不兼容的问题,这个时候可以下载新的Jenkins配置一下就可以解决。

详细配置可参考:《Jenkins持续集成入门到精通》中Jenkins安装和持续集成环境配置

Jenkins凭证管理

《Jenkins持续集成入门到精通》上面是集成gitlab,集成云效跟教程里的效果一样,具体操作:

一、点击红框处

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_docker

二、

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_团队开发_02

三、

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_docker_03

四、

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_Jenkins_04

五、在下面具体配置:

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_Jenkins_05

类型我们一般选择HTTPS账户密码类型的或者ssh类型的(在项目中我是用的HTTPS类型的)

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_jenkins_06

范围默认就行

用户名和密码需要填写(取自云效)

1、点击个人设置

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_团队开发_07

2、设置账户密码

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_docker_08

3、回到第五步,将账户密码设置上去点击创建即可。

ID、描述可以不写

六、至此,你的就会保存,同时生成唯一标识。

测试凭证是否通过:可继续参考 《Jenkins持续集成入门到精通》-> 持续集成环境(4)

Maven配置

参考**《Jenkins持续集成入门到精通》-> 持续集成环境(5)-Maven安装和配置**

pipeline流水线

在此次平台建设过程中,我们需要对项目进行CICD,可以使用流水线来对项目进行自动拉取,构建,部署。

pipeline使用方式可直接参考:《Jenkins持续集成入门到精通》->Jenkins项目构建类型(4)-Pipeline流水线项目构建


具体使用

下面我利用Jenkins结合ns-service-support-user微服务进行持续集成部署操作。

第一步、部署前,需要在项目中添加相关依赖以及文件。

1、springboot项目打包

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.6</version>
</plugin>

2、添加dockerfile-maven-plugin依赖,添加此依赖后,可以通过dockerfile编译生成镜像

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>dockerfile-maven-plugin</artifactId>
    <version>1.3.6</version>
    <configuration>
        <repository>${project.artifactId}</repository>
        <buildArgs>
            <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
            <PRO_NAME>${project.build.finalName}</PRO_NAME>
        </buildArgs>
    </configuration>
</plugin>

3、当前项目根目录添加dockerfile文件(把当前项目jar包生成docker镜像)

FROM openjdk:11
ARG JAR_FILE
ADD ${JAR_FILE} app.jar
COPY ./lib/skywalking-agent.jar ./lib/skywalking-agent.jar
EXPOSE 8098
ENTRYPOINT ["java","-javaagent:./lib/skywalking-agent.jar","-Dskywalking.agent.service_name=","-Dskywalking.collector.backend_service=192.168.192.168.xxx.xxx:11800","-jar","/app.jar"]

4、当前项目根目录添加Jenkinsfile文件对应Jenkins流水线

node {
   stage('拉取代码') {
      checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
      echo "拉取完成"
}
stage('编译构建') {
def code = sh (
    script: "docker ps | grep ${Microservices}",
    returnStatus: true
)
// code 为0 代表 grep 找到 了 ${Microservices} 相关 的 container
if (code==0){
//首先停止并删除一个容器x
    sh ("docker ps -f name=${Microservices} -q | xargs --no-run-if-empty docker container kill")
    sh ("docker ps -f name=192.168.xxx.xxx:5000/${Microservices} -q | xargs --no-run-if-empty docker container kill")
    sh ("sleep 10s")
    sh ("docker container ls -a -f name=${Microservices} -q | xargs -r docker container rm -f")
    sh ("docker container ls -a -f name=192.168.xxx.xxx:5000/${Microservices} -q | xargs -r docker container rm -f")
    sh ("sleep 10s")
//删除镜像
//    sh ("docker rmi ${Microservices}")
    sh ("docker rmi -f 192.168.xxx.xxx:5000/${Microservices}")
}
//调用当前微服务dockerfile
sh label: '', script: 'mvn clean package -e -X -U dockerfile:build'
sh "/mydata/hostmachine_jenkins/version/version_up.sh ${Microservices} ${NEW_VERSION}"
def PROJECT_VERSION = readFile "/mydata/hostmachine_jenkins/version/${Microservices}"
// def NEW_VERSION="${PROJECT_VERSION}"
//将当前进镜像名修改为192.168.192.168.xxx.xxx:5000/${Microservices}:${NEW_VERSION}
sh ("docker tag ${Microservices}:latest 192.168.192.168.xxx.xxx:5000/${Microservices}:${PROJECT_VERSION}")
//push到私有仓库中
sh ("docker push 192.168.192.168.xxx.xxx:5000/${Microservices}:${PROJECT_VERSION}")
echo "构建完成"
}
stage('部署上线'){
//sh "docker run -d --net=swarm-test --name ${Microservices} -p ${port}:${port} ${Microservices}"
//sh ("docker stack deploy --compose-file=/mydata/hostmachine_jenkins/jenkins_deploy.yml api")
def PROJECT_VERSION = readFile "/mydata/hostmachine_jenkins/version/${Microservices}"
//按行读取
def lines = PROJECT_VERSION.split("\n")[0]
echo "$lines"
sh "docker service update --image 192.168.192.168.xxx.xxx:5000/${Microservices}:${lines} qa_${Microservices}"
echo "部署完成"
sh ("sleep 10s")
sh ("java -jar /mydata/hostmachine_jenkins/dingding.jar jenkins ${deployer}在${publishTime}将${Microservices}模块更新至${lines},部署已完成")
}
}

新建任务,选择流水线项目

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_运维_09

创建完毕会跳到configuration配置界面,点击流水线,

定义选择pipeline script from SCM

Repository URL复制云效上项目的HTTPS

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_jenkins_10


jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_运维_11

Credentials选择之前创建的全局凭证

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_运维_12

指定分支写上你需要用的

继续往下滑,会看到脚本路径这个参数,这个就是对应你项目上的Jenkinsfile文件

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_团队开发_13

继续

点击General,选择参数化构建过程并点击添加参数

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_docker_14

添加凭据参数

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_运维_15

添加选项参数(这个只针对当前项目其实可以在项目中写死就够了)

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_jenkins_16

添加文本参数

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_jenkins_17

添加选项参数(同样只针对当前项目可以写死)

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_运维_18

添加port,对应项目中的port

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_运维_19

添加部署人员,方便知道当前是谁部署了项目

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_团队开发_20

添加时间参数,对应钉钉消息提示

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_jenkins_21

添加版本号,手动输入更迭版本号

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_docker_22

以上的参数就是对应的Jenkinsfile文件中的${***},当点击构建的时候对应的参数就会映射到Jenkinsfile文件中。

构建触发器,作用是自动出发构建项目

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_团队开发_23


设置好后,可以先点击应用然后保存

进入自己创建的项目,界面如下:

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_docker_24

点击build with parameter,选择或者填写对应的参数

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_运维_25

PROJECT_VERSION项目版本号参数如果不知道上一个版本,我们可以到portainer中查看对应的服务后缀,此后缀就是对应的当前正在运行的项目版本号。

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_团队开发_26

此时PROJECT_VERSION可以设为1.0.5

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_运维_27

所有参数设置好后,点击开始构建按钮,等待他构建完成

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_团队开发_28

正常情况下会全流程走完,如下:

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_Jenkins_29

可以悬停在对应位置并点击logs查看当前流程的日志

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_运维_30

或者可以点击console output查看全流程日志

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_团队开发_31

验证:

部署成功会有消息提醒

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_docker_32

这个时候看portainer中的服务列表,可以看到服务正在运行,而且版本已经从1.0.4升级到1.0.5了

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_团队开发_33

访问当前服务的验证接口,查看是否能正常访问

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_docker_34

异常情况会在某个阶段爆红,这时候就需要查看日志定位具体报错位置具体解决了

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_团队开发_35

笔记:

添加定时任务脚本:/mydata/hostmachine_jenkins/images_clean.sh(208位置),定时每天10/12/14三个时间段清除虚悬镜像以及当前项目之前版本未使用的镜像

添加版本自增脚本:/mydata/hostmachine_jenkins/version_up1.sh(208位置),当点击部署的时候,自动增加当前项目版本号,并且对部署的服务进行版本号赋值。

jenkins pollscm 不拉取最新代码 jenkins拉取的源码保存在哪_Jenkins_36