最近,我们使用的开发服务器被回收了,换了一台新的服务器,CI/CD平台需要重新搭建。

我的运维能力一直薄弱,所以借此机会学习了一番如何使用Jenkins进行持续集成开发和部署,实践并踩了一些坑,在此记录一下。

引言

假如没有CI/CD平台

想要部署到服务器,我们需要本地打包上传至服务器,或上传源码至服务器上打包,覆盖原来的安装包,进行部署。

当所需要部署的只是一个jar包或者只是一个服务,并且代码不经常更新,这样是可以的。但是开发过程中,更常见的是代码经常迭代更新,并且项目中有多个组件。

这带来了大量的机械重复劳动,打包、上传、构建、测试、发布,如果都由人工操作,很容易混淆代码版本、不易跟踪异常。如果代码有多个分支版本,需要应对多个测试/生产环境,劳动量会指数级别飙升,到人无法承受的地步。

而Jenkins提供了解决方案,使我们可以一劳永逸地应对部署。

Jenkins可以做什么

它的流水线操作正如其名,将机械的工作流程提炼出来,重复执行,可以定义成定时操作,可以定义触发条件,可以填写参数,可以写入控制语句。

代替我们完成:

1、拉取源码至服务器(与代码管理平台直接集成,可集成gitlab/svn等)

2、打包源码(可选择使用maven、nodeJS等等打包工具)

3、测试

4、准备环境

5、发布

总之,一切需要的工作,都可以定义成流水线里的一个流程。

Jenkins搭建与配置

本次安装的Jenkins是Jenkins中文社区提供的中文镜像版,不仅做了汉化,Jenkins可以灵活使用的1500多个插件也提供了国内的镜像地址,安装只需要一条docker指令。

1、环境准备

1、查看系统版本,预留空间和Jenkins运行端口

2、安装docker

2、快速开始

  • 创建容器

docker run -d -v /jenkins_home:/var/jenkins_home -u 0 -p 8786:8080  --name jenkins jenkinszh/jenkins-zh

指令解释:

-d: 后台运行

-v:将Jenkins主目录挂在出来

-u 0 :将系统用户传入(0为root用户),避免一些权限问题

-p :指定映射到宿主机的端口,如果8786端口被占用也可以使用其他端口

--name:指定运行容器名称为jenkins

jenkinszh/jenkins-zh Jenkins中文社区提供的镜像名称,docker会检测本地有无该镜像,如果没有,会自动拉取。

  • docker logs jenkins 查看日志

运行之后,访问宿主机ip+ 8786(指定端口),看到Jenkins初始页面。

Jenkins创建成功!

3、初始化

稍微等待之后,自动跳转至管理员登录页面。

创建容器时我们已经将该目录挂载到宿主机了,所以可以直接访问映射出的文件:

cat /jenkins_home/secrets/initialAdminPassword

也可以使用docker exec指令访问容器内文件:

docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword

输入密码,登陆进入新手入门页面。



选择安装推荐插件。

如果有安装失败的,可以点击继续,直接跳过,进入Jenkins管理页面,等待后续使用时再进行安装。

4、新建声明式流水线

点击左侧新建item,可以创建新的任务,如下图所示。

选择流水线。

现在就可以创建流水线,用于部署正在开发的项目了。

5、常用流水线 + 工具 +插件 使用及配置

流水线语法请参考:

如何使用声明式流水线

可以使用Jenkins自带的流水线语句生成工具来辅助编写:

插件和其他配置均为可选,根据使用需求灵活安装。

在此记录一些插件/工具,并给出它们在流水线脚本中的使用范例。、

一、集成git/gitlab

  • 配置凭据用于登陆验证gitlab

  • 参考语法
steps {
git branch: 'dev', credentialsId: '***', url: 'https://git.***.git'
}

将创建好的凭据填入。

二、maven/nodeJS等构建工具使用

  • 工具安装和配置

    在全局工具配置中配置NodeJS和Maven

  • 使用maven打包

steps {
script {
sh "mvn clean install -Dmaven.test.skip=true -Plinux"
}
}
  • 使用ln -s指令支持脚本中运行

    若执行时报错无mvn指令(或npm、cnpm等),说明jenkins在/usr/local/bin目录下没有找到相应的指令。可以通过建立软连接方式实现支持。



    可以将宿主机的工具包直接放入挂载目录,进行映射,也可以在工具配置中选择自动下载,在Jenkins内中再次安装。

三、连接其他机器/执行脚本

  • 容器内

    直接使用下列流水线语言格式即可。
 script {
sh "***"
}
  • 执行宿主机内脚本

    (1)挂载进入容器内部

    缺点:若脚本运行环境和操作内容是宿主机文件,该方法无法实现。

    (2)使用ssh
  • 语句使用

    开启免密校验,使用 sh "ssh -o StrictHostKeyChecking=no -l root ${IP} '****'"格式的指令。

    注意指令格式为双引号内套单引号,单引号内为希望在宿主机执行的指令
  • 插件使用
  • SSH Pipeline Step

    根据示例,可得,事先添加好凭据之后,很容易在指定ip上(包括宿主机)执行文件传输、脚本执行等操作。
def host = [:]
host.name = "host"
host.host = ""
host.allowAnyHosts = true node {
withCredentials([usernamePassword(credentialsId: '', passwordVariable: 'password', usernameVariable: 'userName')]) {
host.user = userName
host.password = password
stage("SSH Steps Rocks!") {
writeFile file: 'test.sh', text: 'ls'
sshCommand remote: host, command: 'for i in {1..5}; do echo -n \"Loop \$i \"; date ; sleep 1; done'
sshScript remote: host, script: 'test.sh'
sshPut remote: host, from: 'test.sh', into: '.'
sshGet remote: host, from: 'test.sh', into: 'test_new.sh', override: true
sshRemove remote: host, path: 'test.sh'
}
}
}

构建结果

  • Publish Over SSH



    在Jenkins管理/系统管理/PublishOverSSH的相关配置中配置所需要的宿主机IP、用户、密码等等信息



    可以在展开的高级设置中配置SSH服务器。

    查看Publis-Over-Server 插件说明获取高级用法。

四、集成docker

因为我们的Jenkins服务是作为docker容器运行的,所以需要在容器内调用docker命令。

容器内调用docker命令有两种:

原理说明:

Docker采用的是Client/Server架构,我们常用的docker命令只是docker client,通过该命令行执行命令的时候,实际是通过client与docker engine通信。

默认情况下,Docker的守护进程会生成一个socket(/var/run/docker.sock)文件来进行本地进程通信,智是UNIX域套接字,可以通过文件系统(而非网络地址)进行寻址访问。

根据上述原理,我们可以通过挂载宿主机socket文件进入Jenkins,使Jenkins可以使用宿主机docker命令。

  • 直接使用第四点中的SSH用法执行:
 sshCommand remote: host, command: 'docker *** '

五、生成归档文件

示例:

pipeline {

    agent any

 stages {

     stage("build"){
steps{
sh 'touch archive.jar'
} } stage('archive') {
steps {
archiveArtifacts artifacts: 'archive.jar', fingerprint: true
}
}}
}

在build过程中生成归档文件,在archive过程中归档。

在此页面上可以直接下载归档好的文件。

其他(待补充)

1、配置时区

打开系统管理/命令行,运行:

System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Shanghai')

CICD:Jenkins入门和使用的更多相关文章

  1. Jenkins入门系列之——02第二章 Jenkins安装与配置

    2014-12-08:已不再担任SCM和CI的职位,Jenkins的文章如无必要不会再维护. 写的我想吐血,累死了. 网页看着不爽的,自己去下载PDF.有问题请留言! Jenkins入门系列之——03 ...

  2. [转载] Jenkins入门总结

    转载自http://www.cnblogs.com/itech/archive/2011/11/23/2260009.html 在网上貌似没有找到Jenkins的中文的太多的文档,有的都是关于Huds ...

  3. Jenkins入门总结

    Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括: 1.持续的软件版本发布/测试项目. 2.监控外部调用执行的工作 在网上貌似没有找到Jenkins的中文的太多的文 ...

  4. Jenkins入门系列之

    Jenkins入门系列之——00答疑解惑 Jenkins进阶系列之——11修改Jenkins用户的密码 Jenkins进阶系列之——12详解Jenkins节点配置 Jenkins进阶系列之——13修改 ...

  5. Jenkins入门-转

    reference : http://www.cnblogs.com/itech/archive/2011/11/23/2260009.html 在网上貌似没有找到Jenkins的中文的太多的文档,有 ...

  6. Jenkins入门【转】

    一.Jenkins概述 二.安装Jenkins https://pkg.jenkins.io/redhat-stable/ sudo wget -O /etc/yum.repos.d/jenkins. ...

  7. Jenkins 入门系列--Jenkins 的安装配置

    写的我想吐血,累死了. 网页看着不爽的,自己去下载PDF.有问题请留言! Jenkins入门系列之--03PDF文档下载 第二章 Jenkins安装与配置 2 Jenkins安装 在最简单的情况下,J ...

  8. Jenkins入门教程

    Jenkins入门教程 @ 目录 Jenkins入门教程 1. 什么是Jenkins 1.1 我们为啥需要jenkins 1.2. Jenkin实现原理 2. Jenkins搭建 2.1. Jenki ...

  9. Jenkins入门,介绍、安装

    一.介绍 Jenkins: 三.安装 Jenkins:        第一种方式:        下载 windows 版本:进入 Jenkins 官网:https://jenkins.io/ 进入下 ...

随机推荐

  1. 【Linux网络基础】网络拓扑、OSI层次模型、TCP/IP协议簇

    一.前言 一个运维有时也要和网络打交道,所以具备最基本的网络知识,对一个运维人员来说是必要的.但,对于我们的工作来说这些并不是重点,因此,我不可能从最基础的网络知识开始讲起.本节内容更多是从一个梳理和 ...

  2. Linux硬盘分区知识

    前言 硬盘使用前,一般要分区,格式化(创建文件系统)<== 存放数据 类比,房子使用前,一般要隔断,装修,买家具,再住人. 分区 一块硬盘: 主分区.扩展分区.逻辑分区 主分区+扩展分区的数量& ...

  3. 【Linux常见命令】tr命令

    tr - translate or delete characters tr 命令用于转换或删除文件中的字符. tr 指令从标准输入设备读取数据,经过字符串转译后,将结果输出到标准输出设备. 语法: ...

  4. Java和php中的try-catch分析

    为什么80%的码农都做不了架构师?>>>   描述:对一个健壮的系统来讲,异常处理是必不可少的一部分,针对异常的管理,主要就是异常的捕获和处理操作,然而在php中使用try-catc ...

  5. vue中递归组件的使用

    2019独角兽企业重金招聘Python工程师标准>>> 递归 简单来讲就是程序自己调用自身. vue中的递归组件就是,组件自身调用自身. 父组件 <template> & ...

  6. (原創) 如何在Nios II顯示8位數的七段顯示器? (SOC) (Nios II) (SOPC Builder) (DE2-70)

    Abstract本文討論如何在Nios II控制8位數的七段顯示器. Introduction使用環境:Quartus II 8.0 + Nios II EDS 8.0 + DE2-70 (Cyclo ...

  7. 如何在mysql中实现自然排序

    背景 熟悉mysql的同学应该清楚,mysql在对字符串做order by排序时是按照字典序进行排序的,但是如果字符串中包含数字的话(我们称这种类型的字符串为alphanumeric),仅按照字典序的 ...

  8. MySQL权限原理及删除MySQL的匿名账户

    MySQL权限系统的工作原理 MySQL权限系统通过下面两个阶段进行认证: (1)对连接的用户进行身份认证,合法的用户通过认证,不合法的用户拒绝连接: (2)对通过认证的合法用户赋予相应的权限,用户可 ...

  9. 【Java8新特性】一张图带你领略Java8有哪些新特性

    写在前面 很多小伙伴留言说,冰河你能不能写一些关于Java8的文章呢,看书看不下去,看视频进度太慢.好吧,看到不少读者对Java8还是比较陌生的,那我就写一些关于Java8的文章吧,希望对大家有所帮助 ...

  10. Envoy 基础教程:使用 Unix Domain Socket(UDS) 与上游集群通信

    Envoy Proxy 在大多数情况下都是作为 Sidecar 与应用部署在同一网络环境中,每个应用只需要与 Envoy(localhost)交互,不需要知道其他服务的地址.然而这并不是 Envoy ...