Jenkins & Vue.js 发布 pipeline

主要流程是从 git 仓库获取 vue.js 源码,然后使用 Node.jsnpm 命令行打包,最后通过 ssh 发布到线上环境。

配置 Node.js

插件管理 中安装 NodeJS Plugin 插件,之后在 全局工具配置 中新增一个 Node.js 的安装。会在第一次构建 Job 时自动执行这个安装。

Jenkins Pipeline 中调用 Shell 脚本 Permission denied

Jenkinspipeline 脚本中通过 sh 命令运行脚本时报了 Permission denied 错误。

pipeline 脚本和 shell 脚本 都是从 git 上获取的,通过 ls -l 命令查看,发现默认给予的是 644 权限,没有运行权限。

所以需要在 pipeline 脚本中使用 chmod 命令给相应的文件赋权限。

Jenkins 删除 JDK 安装任务

Manage Jenkins => Global Tool Configuration 中设置了 JDK 安装 之后,构建任务时会自动执行安装,但是由于要从 Oracle 下载文件,非常慢。

此时想删除这个安装,但是管理界面上没有找到删除的地方。(Jenkins 的版本为 2.235.2
已经在构建的任务也取消不掉。重启 Jenkins 服务后再次执行构建,还是会再次安装 JDK

解决方法

Jenkins 的安装目录下有个 config.xml 文件,其中 jdks 标签下保存的就是 JDK 相关的配置。

Jenkins 在 Pipeline 中发送自定义钉钉消息(Windows 环境)

主要是按照之前的博客中的方法,在 Pipeline 中使用批处理命令(bat)调用 curl 命令来发送请求。

跟之前相比,钉钉机器人增加了安全设置。这里使用的是 自定义关键词,也可以设置 IP 地址(段)。如果勾选了 加签 的话,下面的方式就不行了。

[Jenkins]在 Pipeline 中远程停止/启动计划任务

停止/启动计划任务使用 schtasks 命令(参考这篇博客)。

Jenkins Pipeline 使用 MSBuild 发布 ASP.NET 项目

在之前的博客(使用 Jenkins 自动编译 C# 项目Jenkins 发布.NET 项目)中有讲到使用 MSBuild 插件来编译和发布 ASP.NET 项目,这里使用 Pipeline 来实现同样的功能。

这里分成三步来实现。

  1. 更新代码

    为了获取 Git 的分支名,这里安装了 List Git Branches Parameter 插件,之后添加一个 List Git branches (and more) 类型的参数。
    这个插件获取的分支名是 refs/heads/BranchName 这种格式的,所以通过 "${BranchName}"[11..-1] 截取了字符串。
    之后通过 git 工具获取代码,如果设置了密码可以通过 credentialsId 参数设置,值为在 Jenkins 凭据中设置的凭据 ID。
    我这里使用的是 SSH Username with private key 类型的凭证,具体方法可以参考 这篇博客2.5 从版本库拉取 pipeline

  2. 创建发布配置文件

    这里使用通过 Pipeline 脚本创建一个发布用的配置文件。

  3. 编译并发布

    调用 msbuild 通过指定 PublishProfileDeployOnBuild 属性来编译和发布项目。
    关于 MSBuild 命令参数的详细情况可以参考 这篇博客

Jenkins pipeline 中使用 archiveArtifacts 存档文件

pipeline 中可以使用 archiveArtifacts 命令存档文件。

存档的文件会保存到 Jenkinsjobs/JOB_NAME/builds/BUILD_NO 目录下。

示例如下:

pipeline {
    agent any

    stages {
        stage('Archive') {
            steps {
                archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true 
            }
        }
    }
}
GitLab 推送时触发 Jenkins Job

1. 在 Jenkins 中创建流水线

具体方法参考 这篇博客

构建触发器 勾选 触发远程构建 (例如,使用脚本),值设置为随机字符串即可(本以为是用户自己的 API Token,但其实并不是)。

Jenkins Pipeline 使用 Maven 打包并发布到 Linux 服务器

在 Jenkins 中使用 Maven 打包项目后发布到 Linux 服务器。

1. 安装 SSH Pipeline Steps 插件

Manage Jenkins => Manage Plugins 的 可选插件 标签中查询 SSH Pipeline Steps,勾选后安装。

2. pipeline 脚本

可以写在 Jenkinsfile 中,用法参考 这篇博客

Jenkins 邮件通知配置(QQ 邮箱)

在 Jenkins 的 Manage Jenkins → Configure System → 邮件通知 中配置 Jenkins 发送邮件时使用的邮件服务器。

这里使用的是 QQ 邮箱。

需要注意的是密码输入项中填入的不是 QQ 号的密码而是在 QQ 邮箱 设置 → 账户 → POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 中生成的授权码,另外还需要在这里启用 POP3/SMTP服务

Jenkins 2.x 实践指南 2. pipeline 入门

2.1 pipeline 是什么

从某种抽象层次上讲,部署流水线(Deployment pipeline)是指从软件版本控制库到用户手中这一过程的自动化表现形式。
--《持续交付--发布可靠软件的系统方法》

Jenkins 1.x 只能通过界面手动操作来“描述”部署流水线。Jenkins 2.x 终于支持 pipeline as code 了,可以通过“代码”来描述部署流水线。

使用“代码”而不是 UI 的意义:

  • 更好地版本化
  • 更好地协作
  • 更好地重用性
Jenkins hudson.scm.SVNRevisionState cannot be cast to hudson.scm.SVNRevisionState

Jenkins Jon 从 SVN 获取代码后报如下错误:

构建中 在工作空间 D:\jenkins\workspace\workspace\Publish-SOA-A 中 
Updating https://192.168.0.1:8443/svn/2_SourceCode/Dev/Soa at revision '2018-06-15T16:46:28.934 +0800' --quiet 
Using sole credentials liujiajia/****** in realm ‘<https://192.168.0.1:8443> VisualSVN Server’ 
At revision 70672 
 
FATAL: hudson.scm.SVNRevisionState cannot be cast to hudson.scm.SVNRevisionState 
java.lang.ClassCastException: hudson.scm.SVNRevisionState cannot be cast to hudson.scm.SVNRevisionState 
	at hudson.scm.SubversionSCM.calcChangeLog(SubversionSCM.java:757) 
	at hudson.scm.SubversionSCM.checkout(SubversionSCM.java:892) 
	at hudson.scm.SCM.checkout(SCM.java:504) 
	at hudson.model.AbstractProject.checkout(AbstractProject.java:1208) 
	at hudson.model.AbstractBuild$AbstractBuildExecution.defaultCheckout(AbstractBuild.java:574) 
	at jenkins.scm.SCMCheckoutStrategy.checkout(SCMCheckoutStrategy.java:86) 
	at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:499) 
	at hudson.model.Run.execute(Run.java:1794) 
	at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43) 
	at hudson.model.ResourceController.execute(ResourceController.java:97) 
	at hudson.model.Executor.run(Executor.java:429) 
由于构建失败而跳过归档 
Finished: FAILURE 
Jenkins 安装为 Windows 服务

Install Jenkins as service

  1. 以管理员身份打开 cmd 命令行窗口

  2. cd 到 Jenkins 的 Home 目录

  3. 执行如下命令

    jenkins.exe install
    
Jenkins 发布.NET 项目

Publish

  1. 在 VS 中新增一个 Jenkins 用的发布配置

    右键点击工程文件,选【发布】,新增一个叫【Jenkins-Local】的配置,配置好后提交到 CVS。

  2. 在 Job 的构建任务的【Command Line Arguments】中增加如下参数

    /p:PublishProfile=Jenkins-Local;DeployOnBuild=true
    
  3. 保存后再次执行构建时就会自动执行发布操作了

Jenkins 自定义钉钉机器人消息

Jenkins 自带的钉钉插件固定只能通知 Job 开始,执行成功或失败,如果要自定义消息内容,需要 POST 消息内容到机器人的 webhook 地址。消息格式参照 钉钉开放中心 - 文档中心

Jenkins - Poll SCM - 日程表 中的表达式写法

日程表的写法使用的 Cron 表达式语法(稍有改动),下面先介绍一下 Cron 表达式(转自 cron 表达式详解 )。

Cron 表达式

Cron 表达式是一个字符串,字符串以 5 或 6 个空格隔开,分为 6 或 7 个域,每一个域代表一个含义,Cron 有如下两种语法格式:

  1. Seconds Minutes Hours DayofMonth Month DayofWeek Year
  2. Seconds Minutes Hours DayofMonth Month DayofWeek
Jenkins Job 指定构建某个 SVN 版本的代码

  1. 在 Job 的【General】中选择【参数化构建过程】

    默认为空,表示构建最新版本的代码;可以通过 @{版本号} 的形式指定构建的版本(例:@65143);

  2. SubversionRepository URL的后面添加上面增加的参数${SVN_VERSION_NO}

使用 Jenkins 自动编译 C# 项目

  1. 安装插件 MSBuild Plugin

    安装后再构建步骤中会多一个【Build a Visual Studio project or solution using MSBuild】选项。

  2. 配置 MSBuild

    在【系统管理】->【全局工具配置】->【MSBuild】中添加本地已安装的 MSBuild

  3. 在 Job 的构建中添加 MSBuild 步骤

Jenkins 构建之后打包文件

在【构建后操作】中增加一个【Archive the artifacts】步骤,【用于存档的文件】中可以设置多个文档(逗号或者空格分隔),还可以使用通配符(*),其它选项看自己需求勾选。

之后再执行构建,Job 首页上会显示【最后一次成功的构建结果】,每个构建任务的首页上也会显示【构建产生文件】,点进去之后可以打包下载全部文件。

Jenkins 安装笔记

安装

  1. jenkins.io 获取最新的 war 包,并启动。

    java -jar jenkins.war
    

    也可以自定义端口。

    java -jar D:\jenkins\jenkins.war --ajp13Port=-1 --httpPort=8090
    

    第一次启动会显示如下信息,这段字符就是初始的密码,初次访问网站时会用到。

    3d468549b7774496840b77ba21da24dc
    解锁 jenkins
    为了确保管理员安全地安装 jenkins,密码已写入到日志中(不知道在哪里?)该文件在服务器上:C:\Users\liujiajia\.jenkins\secrets\initialAdminPassword

  2. 打开 http://localhost:8080/,输入上面的密码,开始安装。

  3. 新建一个【构建一个自由风格的软件项目】的任务。

    也可以直接从已经创建好的任务复制。

  4. 设置源码管理(我这里使用的是 SVN)

    • Repository URL:SVN 代码目录所在的 URL
    • Credentials:可以点击旁边的 Add 按钮,输入用户名和密码;
    • 其它默认
  5. 构建触发器

    • 选择Poll SCM,并在日程表中输入如下内容(表示每分钟检查一次 SVN)(注意中间的空格不可以少)

      * * * * *
      

      修改为每三分钟检查一次

      */3 * * * *
      
  6. 构建

    • 新增一个【Invoke top-level Maven targets】步骤
      • Goals:输入mvn的命令,如:package
      • POM:pom.xml,如果 pom.xml 文件在子目录,可以按照【projectname/pom.xml】格式输入;
      • 其它默认
  7. 构建后操作

    可以通过使用钉钉的插件,自动发送通知;或者发送邮件等等。