Jenkins Pipeline 流水线任务 补充篇

简介: Jenkins Pipeline 流水线任务 补充篇

上次其实已经写过一篇☞ 关于 Jenkins Pipeline 流水线任务的文章 ,说起来那篇真是比较简陋,只是简单用一个小案例来说明 Jenkins Pipeline 任务的存在吧,但完全没办法去体现那个优势,并且是在一台服务器上进行操作,文中的小案例甚至都有些显得不太妥当~

本文适合的读者

1、想要了解Jenkins 的朋友们

2、想要扩展知识面的朋友们

3、对Jenkins有过一点点了解的小伙伴

4、对Liunx有过了解的小伙伴~

5、在追此系列文章的朋友们,

写明的原因,主要是以免浪费大伙的时间~


所以昨天找朋友又借来了一台服务器,两台还是比一台好玩一些~,

还有游戏圈圈主&神转折评审官-Ylimhs,打算支援我一下下,哈哈,我给他记小本子上啦。

大家多多参与沸点活动噢~

不过我还是先坚持写到后期再说吧~好难写啊

前言

上次我在文章最后说了,有一个非常矛盾的操作,就是删了镜像又再拉镜像...

不得不说,在一台服务器确实有点点憨~


先说说今天的目标

将上篇文章的一些操作完善,Jenkins 服务器位于我自己的服务器上,镜像的存储仓库使用阿里云镜像,最后部署的仓库又是另一台服务器

image.png

  1. 使用 Pipeline Script from SCM 方式,即将上次的脚本文件从任务配置中,改为放在源代码仓库中。

原本是有第二个目标的,但是出现了一些意外状况,导致我没写完,要放个鸽子🕊了,请各位见谅见谅👨‍💻

完善上一篇的部署脚本

上一篇文章链接

上篇最后部署的脚本文件如下:

 pipeline {
     agent any
     stages {
        stage('git pull 拉取代码') {
             steps {
               // Get some code from a GitHub repository
               git branch: 'main', credentialsId: 'b60111111133bf7', url: 'https://github.com/ningzaichun/hello-springboot'
            }
         }
        stage('编译构建') {
             steps {
                 sh label: '', script: 'mvn clean package'
             }
         }
          stage('清除旧镜像及容器') {
               steps {
                  //定义镜像名称
                 // 构建之前,需要先删除原有的镜像
                 sh "docker rm -f hellonzc"
                 sh "docker rmi -f hellospringboot:v0.0.1"
             }
         }
           stage('构建与发布镜像') {
               steps {
    //编译,构建本地镜像
                 sh "mvn clean package"
                 sh "docker build -t hellospringboot:v0.0.1 . "
                 // 登录阿里云镜像
                 sh "docker login --username=nzc15 --password=11113 registry-vpc.cn-heyuan.aliyuncs.com"
                 sh " docker tag hellospringboot:v0.0.1 registry-vpc.cn-heyuan.aliyuncs.com/ningzaichun/jenkins:v0.0.1"
                 //发布镜像
                 sh " docker push registry-vpc.cn-heyuan.aliyuncs.com/ningzaichun/jenkins:v0.0.1"
             }
         }
         
          stage('运行容器') {
               steps {
             sh "docker rmi -f registry-vpc.cn-heyuan.aliyuncs.com/ningzaichun/jenkins:v0.0.1"
          sh " docker pull registry-vpc.cn-heyuan.aliyuncs.com/ningzaichun/jenkins:v0.0.1"
          sh "docker run -d -p 8080:8080 --name hellonzc registry-vpc.cn-heyuan.aliyuncs.com/ningzaichun/jenkins:v0.0.1"
             }
         }
     }
 }

1.1、准备环境

现在我们要将原本部署在同 Jenkins 在一起的服务器上的服务,部署到另一台服务器上去。

  • 首先就是要先在Jenkins 中添加另外的那台部署服务器的凭据(登录的账号密码)
  • 配置远程服务器的相关信息

其实这一步我有想过要不要省略的...,下次吧,下次我把过于简单的东西省去吧,还是担心会有不了解的小伙伴,所以还是写的繁琐了些,就当看着我操作了遍吧。


image.png

image.png

(图片说明:填入相关信息即可)

配置远程服务器信息,在全局配置中找到下面的两个配置

  • SSH remote hosts
  • Publish over SSH

image.png

SSH remote hosts

image.png

Publish over SSH 下的 SSH Servers

我这里是点击是新增:填写好相关信息就好。

image.png

(图片说明:记得点击保存)

补充:这里的服务器名称是要用到的,记得记一下~

1.2、完善脚本

其实只要将最后一步的操作用SSH连接发送到部署服务器就可以了。

就是在另一台服务器中,进行最后部署的流程。

这里其实也是利用了 Publish over SSH 插件功能来实现的~,和 Maven 的机制是一样的。

 pipeline {
     agent any
     stages {
          stage('部署服务') {
               steps {
                 sshPublisher(
                     publishers: [
                         sshPublisherDesc(
                             configName: 'heyajunServer',
                             transfers: [ sshTransfer (
                                             cleanRemote: false,
                                             excludes: '',
                                             execCommand:"/home/ningzaichun/jenkins/deploy.sh",
                                             execTimeout: 120000,
                                             flatten: false,
                                             makeEmptyDirs: false,
                                             noDefaultExcludes: false,
                                             patternSeparator: '[, ]',
                                             remoteDirectory: '',
                                             remoteDirectorySDF: false,
                                             removePrefix: '',
                                             sourceFiles: '')
                                          ],
                             usePromotionTimestamp: false,
                             useWorkspaceInPromotion: false,
                             verbose: false
                        )
                   ]
               )
             }
         }
     }
 }

其实就是将之前的可视化中的一些操作,变成了键值对放到了这里

configName:这里填写的是之前配置服务器时所写的name

最重要的一点就是execCommand,这里就是用来执行shell命令的,其实这里是可以执行一些shell命令的,但是实在太过于繁琐,就写成了 shell 文件用来执行。


然后在/home/ningzaichun/jenkins/目录下编写了一个部署的 shell 脚本,名字为deploy.sh

 #! /bin/sh
 ​
 #查询容器是否存在,存在则删除
 containerId=`docker ps -a | grep -w  hellonzc `
 ​
 if [ "$containerId" !=  "" ] ; then
     #停掉容器
     docker stop $containerId
     #删除容器
     docker rm $containerId
     
     # 强制删除容器命令 docker rmi [容器名|Id]
     
     echo "成功删除容器"
 fi
 ​
 imageName='registry.cn-heyuan.aliyuncs.com/ningzaichun/jenkins:v0.0.1'
 ​
 #查询镜像是否存在,存在则删除
 imageId=`docker images | grep -w ${imageName} `
 if [ "$imageId" !=  "" ] ; then
       
     #删除镜像
     docker rmi -f $imageId
     
     echo "成功删除镜像"
 fi
 ​
 # 登录阿里云镜像仓库
 docker login --username=xxxxxx --password='xxxxx' registry.cn-heyuan.aliyuncs.com
 ​
 # 下载镜像
 docker pull registry.cn-heyuan.aliyuncs.com/ningzaichun/jenkins:v0.0.1
 ​
 # 启动容器
 docker run -d -p 8080:8080 --name hellonzc registry.cn-heyuan.aliyuncs.com/ningzaichun/jenkins:v0.0.1
 ​
 echo "容器启动成功"

编写完之后要记得给deploy.sh文件授权,不然是执行不了,chmod +x ./deploy.sh

编写完之后,最好先测试一遍:

image.png

脚本仅供参考,不咋会写 shell 脚本.....别让我去祸害大伙拉

完整脚本文件:

 pipeline {
     agent any
     stages {
        stage('git pull 拉取代码') {
             steps {
               // Get some code from a GitHub repository
               git branch: 'main', credentialsId: 'b6013989-c0b0-4545-bdf6-6a6ca5e33bf7', url: 'https://github.com/ningzaichun/hello-springboot'
            }
         }
        stage('编译构建') {
             steps {
                 sh label: '', script: 'mvn clean package'
             }
         }
          stage('清除旧镜像及容器') {
               steps {
                  //定义镜像名称
                 // 构建之前,需要先删除原有的镜像
                 sh "docker rm -f hellonzc"
                 sh "docker rmi -f hellospringboot:v0.0.1"
             }
         }
           stage('构建与发布镜像') {
               steps {
    //编译,构建本地镜像
                 sh "mvn clean package"
                 sh "docker build -t hellospringboot:v0.0.1 . "
                 // 登录阿里云镜像
                 sh "docker login --username=wyh_lxb17670930115 --password=wangyihui123@ registry-vpc.cn-heyuan.aliyuncs.com"
                 sh " docker tag hellospringboot:v0.0.1 registry-vpc.cn-heyuan.aliyuncs.com/ningzaichun/jenkins:v0.0.1"
                 //发布镜像
                 sh " docker push registry-vpc.cn-heyuan.aliyuncs.com/ningzaichun/jenkins:v0.0.1"
             }
         }
 ​
          stage('运行容器') {
               steps {
                 sshPublisher(
                     publishers: [
                         sshPublisherDesc(
                             configName: 'heyajunServer',
                             transfers: [ sshTransfer (
                                             cleanRemote: false,
                                             excludes: '',
                                             execCommand:"/home/ningzaichun/jenkins/deploy.sh",
                                             execTimeout: 120000,
                                             flatten: false,
                                             makeEmptyDirs: false,
                                             noDefaultExcludes: false,
                                             patternSeparator: '[, ]',
                                             remoteDirectory: '',
                                             remoteDirectorySDF: false,
                                             removePrefix: '',
                                             sourceFiles: '')
                                          ],
                             usePromotionTimestamp: false,
                             useWorkspaceInPromotion: false,
                             verbose: false
                        )
                   ]
               )
             }
         }
     }
 }

测试结果:

image.png

1.3、小结

完善了上一篇的矛盾操作,但同时也埋下了更多的坑~

  1. 如果要部署到多台机器,每台机器都要有一个 deploy.sh文件,不符合偷懒的原则,不过这个不是我的重点,因为liunx着实菜了点...
  2. deploy.sh里面中的项目名称、镜像名称都是我手动写死的,这是不合适的,应当是动态的,在命令后传输进去的,如此一个deploy.sh可以达到复用的效果
  3. Jenkinfile 脚本文件不应该在配置中管理,一方面不好编写,另一方面不好管理,每次都要点进任务配置中进行修改,是不符合偷懒的原则的。

后面继续写的话,可能会关注到的点

  1. 上面的问题
  2. 参数化构建
  3. 构建器方面的问题
  4. 项目构建依赖
  5. springcloud的项目构建
  6. .....

还是省略号好,能给大伙带来无限想象~

后记

各位读者老爷们,原谅我今天的文章,这篇文章确实没有达标这个专栏的文章质量,写糙了。

都不敢说让你们点赞这回事啦

这周休,我一定努力不躺平!!!


相关实践学习
阿里云专有网络VPC使用教程
专有网络VPC可以帮助您基于阿里云构建出一个隔离的网络环境,并可以自定义IP 地址范围、网段、路由表和网关等;此外,也可以通过专线/VPN/GRE等连接方式实现云上VPC与传统IDC的互联,构建混合云业务。 产品详情:https://www.aliyun.com/product/vpc
目录
相关文章
|
22天前
|
jenkins 持续交付
Jenkins Pipeline 参数化构建
Jenkins Pipeline 参数化构建
120 0
|
22天前
|
Java Linux Go
流水线 YAML 高级用法来了,大幅降低重复代码、灵活编排多任务
云效 Flow 流水线 YAML 引入了 template 语法,支持使用模板语言来动态渲染流水线 YAML,满足多个相同或类似逻辑的 Job 批量配置场景,满足多 Job 按需动态生成场景,帮助降低流水线 YAML 重复代码,灵活编排多任务。
70303 10
|
22天前
|
SQL 数据采集 数据挖掘
构建高效的Python数据处理流水线:使用Pandas和NumPy优化数据分析任务
在数据科学和分析领域,Python一直是最受欢迎的编程语言之一。本文将介绍如何通过使用Pandas和NumPy库构建高效的数据处理流水线,从而加速数据分析任务的执行。我们将讨论如何优化数据加载、清洗、转换和分析的过程,以及如何利用这些库中的强大功能来提高代码的性能和可维护性。
|
22天前
|
jenkins 持续交付
Jenkins构建简单流水线
Jenkins构建简单流水线
20 0
|
22天前
|
JavaScript jenkins 持续交付
Jenkins自动构建 CI/CD流水线学习笔记(从入门到入土,理论+示例)
Jenkins自动构建 CI/CD流水线学习笔记(从入门到入土,理论+示例)
92 0
|
22天前
|
Serverless
云效流水线部署函数计算任务时出现了错误
【1月更文挑战第18天】【1月更文挑战第90篇】云效流水线部署函数计算任务时出现了错误
82 1
|
22天前
|
测试技术 Serverless 持续交付
通过云效流水线进行部署任务
通过云效流水线进行部署任务
122 1
|
22天前
|
jenkins Java 持续交付
【项目集成工具】Jenkins
【项目集成工具】Jenkins
|
1天前
|
安全 jenkins Java
Java一分钟之-Jenkins持续集成服务器
【6月更文挑战第5天】Jenkins是Java开发中的关键工具,用于自动化构建、测试和部署,确保CI/CD。本文概述了Jenkins常见问题及解决方案:安装时注意依赖和网络;谨慎选择并更新插件;正确配置SCM触发器;使用Declarative Pipeline定义清晰的Jenkinsfile;集成JaCoCo和SonarQube确保质量;采用蓝绿部署等策略避免直接在生产环境部署未经验证的代码。理解并解决这些问题能提升Jenkins的效率和可靠性。
14 3