全栈工程师开发手册 (作者:栾鹏)
架构系列文章



邮件通知

我这里使用的是qq企业邮箱

jenkins使用入门(邮件、ssh、git、SonarQube、pipline)_docker

配置邮件通知,系统管理–系统设置

添加管理员邮箱,添加邮件

jenkins使用入门(邮件、ssh、git、SonarQube、pipline)_ssh_02

点击保存或测试邮件,系统会给目标邮箱发送一封测试邮件:

jenkins使用入门(邮件、ssh、git、SonarQube、pipline)_git_03

注意,接收邮件必须满足设置的后缀。

详细参数说明如下:

1. Override Global Settings:如果不选,该插件将使用默认的E-mail Notification通知选项。反之,您可以通过指定不同于( 默认选项)的设置来进行覆盖。
2. Default Content Type:指定构建后发送邮件内容的类型,有Text和HTML两种.
3. Use List-ID Email Header:为所有的邮件设置一个List-ID的邮件信头,这样你就可以在邮件客户端使用过滤。它也能阻止邮件发件人大部分的自动回复(诸如离开办公室、休假等等)。你可以使用你习惯的任何名称或者ID号,但是他们必须符合如下其中一种格式(真实的ID必须要包含在<和>标记里):
<ci-notifications.company.org>
Build Notifications <ci-notifications.company.org>
“Build Notifications” <ci-notifications.company.org>
4. Add 'Precedence: bulk' Email Header:设置优先级,
5. Default Recipients:自定义默认电子邮件收件人列表。如果没有被项目配置覆盖,该插件会使用这个列表。您可以在项目配置使用$ DEFAULT_RECIPIENTS参数包括此默认列表,以及添加新的地址在项目级别。添加抄送:cc:电子邮件地址例如,CC:someone@somewhere.com
6. Reply To List:回复列表, A comma separated list of e-mail addresses to use in the Reply-To header of the email. This value will be available as $DEFAULT_REPLYTO in the project configuration.
7. Emergency reroute:如果这个字段不为空,所有的电子邮件将被单独发送到该地址(或地址列表)。
8. Excluded Committers:防止邮件被邮件系统认为是垃圾邮件,邮件列表应该没有扩展的账户名(如:@domain.com),并且使用逗号分隔
9. Default Subject:自定义邮件通知的默认主题名称。该选项能在邮件的主题字段中替换一些参数,这样你就可以在构建中包含指定的输出信息。
10. Maximum Attachment Size:邮件最大附件大小。
11. Default Content:自定义邮件通知的默认内容主体。该选项能在邮件的内容中替换一些参数,这样你就可以在构建中包含指定的输出信息。
12. Default Pre-send Script:默认发送前执行的脚本(注:grooy脚本,这是我在某篇文章上看到的,不一定准确)。
13. Enable Debug Mode:启用插件的调试模式。这将增加额外的日志输出,构建日志以及Jenkins的日志。在调试时是有用的,但不能用于生产。
14. Enable Security:启用时,会禁用发送脚本的能力,直接进入Jenkins实例。如果用户试图访问Jenkins管理对象实例,将抛出一个安全异常。
15. Content Token Reference:邮件中可以使用的变量,所有的变量都是可选的。

注意:如果你的系统设置中还有Extended E-mail Notification,就需要配置这个才能正常发送邮件

注意:如果使用扩展邮件插件,记得勾选 Allow sending to unregistered usersc

任务配置中(注意不要在Project From中填入任何东西,只要保留为空就好)

jenkins使用入门(邮件、ssh、git、SonarQube、pipline)_ssh_04

项目基本配置参数说明:

当插件激活后你就能编辑如下字段(只列出常用的字段):
 Project Recipient List:这是一个以逗号(或者空格)分隔的收件人邮件的邮箱地址列表。允许您为每封邮件指定单独的列表。Ps:如果你想在默认收件人的基础上添加收件人:$DEFAULT_RECIPIENTS,<新的收件人>
 Default Subject:允许你配置此项目邮件的主题。
 Default Content:跟Default Subject的作用一样,但是是替换邮件内容。
 Attach Build Log:附件构建日志。
 Compress Build Log before sending:发送前压缩生成日志(zip格式)。

触发器参数说明:

Failure:即时发送构建失败的邮件。如果”Still Failing”触发器已配置,而上一次构建的状态是”Failure”,那么”Still Failing”触发器将发送一封邮件来替代(它)。
Unstable:即时发送构建不稳固的邮件。如果”Still Unstable”触发器已配置,而上一次构建的状态是”Unstable”,那么”Still Unstable”触发器将发送一封邮件来替代(它)。
Still Failing:如果两次或两次以上连续构建的状态为”Failure”,发送该邮件。
Success:如果构建的状态为”Successful”发送邮件。如果”Fixed”已配置,而上次构建的状态为“Failure”或“Unstable”,那么”Fixed”触发器将发送一封邮件来替代(它)。
Fixed:当构建状态从“Failure”或“Unstable”变为”Successful”时发送邮件。
Still Unstable:如果两次或两次以上连续构建的状态为” Unstable “,发送该邮件。
Before Build:当构建开始时发送邮件。

邮件的html模板

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${PROJECT_NAME}-第${BUILD_NUMBER}次构建日志</title>
</head>

<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"
    offset="0">
    <table width="95%" cellpadding="0" cellspacing="0"
        style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
        <tr>
            <td>(本邮件是程序自动下发的,请勿回复!)</td>
        </tr>
        <tr>
            <td><h2>
                    <font color="#0000FF">构建结果 - ${BUILD_STATUS}</font>
                </h2></td>
        </tr>
        <tr>
            <td><br />
            <b><font color="#0B610B">构建信息</font></b>
            <hr size="2" width="100%" align="center" /></td>
        </tr>
        <tr>
            <td>
                <ul>
                    <li>项目名称 : ${PROJECT_NAME}</li>
                    <li>构建编号 : 第${BUILD_NUMBER}次构建</li>
                    <li>触发原因: ${CAUSE}</li>
                    <li>构建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
                    <li>构建  Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li>
                    <li>工作目录 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>
                    <li>项目  Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>
                </ul>
            </td>
        </tr>
        <tr>
            <td><b><font color="#0B610B">Changes Since Last
                        Successful Build:</font></b>
            <hr size="2" width="100%" align="center" /></td>
        </tr>
        <tr>
            <td>
                <ul>
                    <li>历史变更记录 : <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a></li>
                </ul> ${CHANGES_SINCE_LAST_SUCCESS,reverse=true, format="Changes for Build #%n:<br />%c<br />",showPaths=true,changesFormat="<pre>[%a]<br />%m</pre>",pathFormat="    %p"}
            </td>
        </tr>
        <tr>
            <td><b>Test Informations</b>
            <hr size="2" width="100%" align="center" /></td>
        </tr>
        <tr>
            <td><pre
                    style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">Total:${TEST_COUNTS,var="total"},Pass:${TEST_COUNTS,var="pass"},Failed:${TEST_COUNTS,var="fail"},Skiped:${TEST_COUNTS,var="skip"}</pre>
                <br /></td>
        </tr>
        <tr>
            <td><b><font color="#0B610B">构建日志 (最后 100行):</font></b>
            <hr size="2" width="100%" align="center" /></td>
        </tr>
        <tr>
            <td><textarea cols="80" rows="30" readonly="readonly"
                    style="font-family: Courier New">${BUILD_LOG, maxLines=100}</textarea>
            </td>
        </tr>
    </table>
</body>
</html>

在邮件通知的高级配置中,可以配置什么编译结果的情况下下发通知,和通知给谁

jenkins使用入门(邮件、ssh、git、SonarQube、pipline)_jenkins_05

配置ssh

点击-系统管理-系统插件-可选插件中 直接搜 publish over ssh 点击安装,安装完之后,重启jenkins

1,系统管理->系统设置->Publish over SSH配置里面配置ssh服务器信息

jenkins使用入门(邮件、ssh、git、SonarQube、pipline)_邮件_06


配置git

安装gitlab插件,系统管理–管理插件–可选插件

jenkins使用入门(邮件、ssh、git、SonarQube、pipline)_ssh_07

插件安装界面,会额外安装一些依赖关系的插件,jenkins基于ruby开发,所以会有ruby环境:

jenkins使用入门(邮件、ssh、git、SonarQube、pipline)_docker_08

系统管理 --> 凭据配置

jenkins使用入门(邮件、ssh、git、SonarQube、pipline)_ssh_09

jenkins使用入门(邮件、ssh、git、SonarQube、pipline)_ssh_10

jenkins使用入门(邮件、ssh、git、SonarQube、pipline)_jenkins_11

jenkins使用入门(邮件、ssh、git、SonarQube、pipline)_邮件_12

jenkins服务器上(或者docker里面)root用户生成密钥对

ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub

在git网页中加入jenkins的公钥

jenkins使用入门(邮件、ssh、git、SonarQube、pipline)_git_13

在服务器上手动试一下git clone目标仓库能否成功。

jenkins拉取代码没问题,继续配置jenkins的认证,这里应该输入私钥

jenkins使用入门(邮件、ssh、git、SonarQube、pipline)_邮件_14

复制jenkins拉取git代码服务器root的私钥

cat ~/.ssh/id_rsa

在任务构建中就可以为项目提供源码仓库了

jenkins使用入门(邮件、ssh、git、SonarQube、pipline)_ssh_15

当然你也可以在凭证中创建账号密码凭证,使用账号密码拉取git仓库https地址

实战:向GitHub提交代码时触发Jenkins自动构建

分别点击"系统管理"->“插件管理”->“可选插件”,选择

Git client plugin
Git plugin
GitLab Plugin
Gitlab Hook Plugin

查看jenkin生成回调地址。在任务重构建触发器下获取回调URL。下面的URL那一行只有Gitlab Hook Plugin插件下载成功后才能显示。

jenkins使用入门(邮件、ssh、git、SonarQube、pipline)_ssh_16

Gitlab上的操作

登陆Gitlab上的项目中,添加webhook(用上面Jenkins中生成的回调url)

gitlab钩子hook分为系统级的和项目级别的。

系统级别的

jenkins使用入门(邮件、ssh、git、SonarQube、pipline)_邮件_17

项目级的

jenkins使用入门(邮件、ssh、git、SonarQube、pipline)_docker_18

jenkins使用入门(邮件、ssh、git、SonarQube、pipline)_docker_19

其中token需要在jenkins中git hook的高级配置中生成。

添加成功后,点击此webhook后面的test进行测试

jenkins使用入门(邮件、ssh、git、SonarQube、pipline)_jenkins_20

如果返回Hook successfully executed.表示配置成功。
这样,下次push代码后,就会自动触发jenkins上相关的构建工程进行自动发布了!无需人工干预~

Jenkins定时构建和轮询SCM设置说明

jenkins使用入门(邮件、ssh、git、SonarQube、pipline)_docker_21

一、定时构建:不管SVN或Git中数据有无变化,均执行定时化的构建任务 ;

二、轮询SCM:只要SVN或Git中数据有更新,则执行构建任务;

三、构建语法说明:

1.首先格式为:* * * * *(五个星);

2.第一个表示分钟,取值0~59
第二个
表示小时,取值0~23
第三个表示一个月的第几天,取值1~31
第四个
表示第几月,取值1~12
第五个*表示一周中的第几天,取值0~7,其中0和7代表的都是周日

3.使用举例:

每隔10分钟构建一次:H/10 * * * *

每隔1小时构建一次: H H/1 * * *

每月30号构建一次: H H 30 * *

四、定时构建和轮询SCM使用互不冲突,具体如何组合,需要根据项目情况合理配置;

jenkins关闭重启重新加载

1、关闭Jenkins

只需要在访问jenkins服务器的网址url地址后加上exit。例如我jenkins的地址http://localhost:8080/,那么我只需要在浏览器地址栏上敲下http://localhost:8080/exit 网址就能关闭jenkins服务.

2、重启Jenkies

http://localhost:8080/restart

3、重新加载配置信息

http://localhost:8080/reload
mvn安装

jenkins中需要编译java代码,所以需要mvn环境

下载合适版本的maven:http://maven.apache.org/download.cgi

将下载的压缩文件复制到jenkins容器中

进入jenkins容器

## 解压maven
tar -zxvf apache-maven-3.3.9-bin.tar.gz

## 转移maven到合适的目录
mv apache-maven-3.3.9 /opt/maven

## 设置maven的环境变量
vi /etc/profile

## 设置内容如下
#maven env
export MAVEN_HOME=/opt/maven
PATH=$MAVEN_HOME/bin:$PATH
export PATH

## 编译profile生效
source /etc/profile

## 测试maven是否安装成功
[root@ci-server maven]# mvn --version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T11:41:47-05:00)
Maven home: /opt/maven
Java version: 1.8.0_111, vendor: Oracle Corporation
Java home: /usr/java/jdk1.8.0_111/jre
Default locale: zh_CN, platform encoding: GB18030
OS name: "linux", version: "3.10.0-514.2.2.el7.x86_64", arch: "amd64", family: "unix"

jenkins 调用maven有两种方式

1) 采用Jenkins插件方式调用

系统配置中配置maven

系统管理/系统设置/

jenkins使用入门(邮件、ssh、git、SonarQube、pipline)_邮件_22

然后调用的时候 在job中设置

jenkins使用入门(邮件、ssh、git、SonarQube、pipline)_docker_23

2 ) jenkins 通过shell脚本调用 maven

需要在系统中配置好环境变量

jenkins使用入门(邮件、ssh、git、SonarQube、pipline)_docker_24

Jenkins 通过shell脚本调用mvn 命令的时候,是从/usr/bin 文件夹中找命令的,这个时候需要做个软链接

ln -s /opt/maven/bin/mvn /usr/bin/mvn

这样设置后就不会出现 mvn command not found 的问题了

Maven默认会使用本地缓存的库来编译工程,如果上次下载的库失败将导致类似下面的错误

Non-resolvable import POM: Failure to find org.springframework:spring-framework-bom:pom:5.1.0.RC1 in http://repo.maven.apache.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced @ line 366, column 25 -> [Help 2]

解决办法
删除~/.m2/repository/对应目录或目录下的*.lastUpdated文件,然后再次运行maven命令
maven命令后加-U,如mvn package -U
在repository的release或者snapshots版本中新增updatePolicy属性,其中updatePolicy可以设置为”always”、”daily” (默认)、”interval:XXX” (分钟)或”never”

<repositories>
    <repository>
      <id>io.spring.repo.maven.release</id>
      <url>http://repo.spring.io/release/</url>
      <releases>
        <enabled>true</enabled>
        <updatePolicy>always</updatePolicy>
      </releases>
      <snapshots><enabled>false</enabled></snapshots>
    </repository>
  </repositories>

当然你可以在容器中执行mvn help:system 将本地仓库清空重新下载

SonarQube

jenkins集成代码质量检查。

使用jenkins实现CI/CD

在jenkins中创建pipline项目模板,通过上面的方法绑定git钩子,然后在pipline阶段命令中写入

在 jenkins 上设置 Credentials,然后再新建job的时候使用设置的 Credentials 即可

在jenkins界面,依次点击: Credentials -> System -> Add domain:
Domain Name: 填写你git服务器的地址,如 github.xxx.com
Description: 随便写一点描述,如 This is the Credential for github

点击 ok 后,在点击 “adding some credentials?”

进入页面后,可以选择 Username with password 或者 SSH Username with private key, 根据你的情况选择,这里我们选择 Username with private key:

Username: 随便起一个名字,以便在创建 Job 的时候使用该 Credential
Private Key:可以指定文件,也可以使用默认的 ~/.ssh,当然也可以直接将私钥复制粘贴到此处。
Passphrase: 如果你在创建 ssh key 的时候输入了 Passphrase 那就填写相应的Passphrase,为空就不填写
ID: 空
Description: 空

点击 ok 后 Credential 就创建好了。

如果你再新建 Job 就可以看到我们的 Credential 选项了:

pipeline{
    agent any
    stages {
        stage('Build') {
            steps{
                echo 'This is a build step' 
            }
        }
        stage('Test') {
            steps{
                echo 'This is a test step'  
            }
        }
        stage('Deploy') {
            steps{
                echo 'This is a deploy step'    
            }
        }
    }
}

如果你是使用k8s,可以自动化构建部署

pipeline {
    agent any
    stages {
        stage('checkout') {
            steps{
                echo 'checkout'
                git branch: 'master', credentialsId: 'dab5b0ea-08ef-4f27-8373-91470701f7cd', url: 'https://gitlab.com/luanpeng/test.git'
            }
        }
        stage('docker build') {
            steps{
                sh 'docker login -u luanpeng -p xxxxxxxx'
                sh 'docker build -t luanpeng/lp:jenkins-pipline-test-${BUILD_NUMBER} .'
                sh 'docker push luanpeng/lp:jenkins-pipline-test-${BUILD_NUMBER}'
            }
        }
        stage('deploy') {
            steps{
                sh 'sed -i \'s/IMAGE_VERSION/\'${BUILD_NUMBER}\'/g\' ./deploy.yaml'
                sh 'kubectl apply -f ./deploy.yaml --kubeconfig ./config'
            }
        }
    }
}