主要流程是从 git 仓库获取 vue.js 源码,然后使用 Node.js 的 npm
命令行打包,最后通过 ssh 发布到线上环境。
配置 Node.js
在 插件管理 中安装 NodeJS Plugin 插件,之后在 全局工具配置 中新增一个 Node.js 的安装。会在第一次构建 Job 时自动执行这个安装。
主要流程是从 git 仓库获取 vue.js 源码,然后使用 Node.js 的 npm
命令行打包,最后通过 ssh 发布到线上环境。
在 插件管理 中安装 NodeJS Plugin 插件,之后在 全局工具配置 中新增一个 Node.js 的安装。会在第一次构建 Job 时自动执行这个安装。
Jenkins 的 pipeline 脚本中通过 sh
命令运行脚本时报了 Permission denied 错误。
pipeline 脚本和 shell 脚本 都是从 git 上获取的,通过 ls -l
命令查看,发现默认给予的是 644 权限,没有运行权限。
所以需要在 pipeline 脚本中使用 chmod
命令给相应的文件赋权限。
在 Manage Jenkins => Global Tool Configuration 中设置了 JDK 安装 之后,构建任务时会自动执行安装,但是由于要从 Oracle 下载文件,非常慢。
此时想删除这个安装,但是管理界面上没有找到删除的地方。(Jenkins 的版本为 2.235.2)
已经在构建的任务也取消不掉。重启 Jenkins 服务后再次执行构建,还是会再次安装 JDK 。
在 Jenkins 的安装目录下有个 config.xml 文件,其中 jdks 标签下保存的就是 JDK 相关的配置。
主要是按照之前的博客中的方法,在 Pipeline 中使用批处理命令(bat)调用 curl 命令来发送请求。
跟之前相比,钉钉机器人增加了安全设置。这里使用的是 自定义关键词,也可以设置 IP 地址(段)。如果勾选了 加签 的话,下面的方式就不行了。
根据 Stack overflow 上的回答,Publish Over FTP 插件自 1.15 版本开始支持 Pipeline 。
停止/启动计划任务使用 schtasks 命令(参考这篇博客)。
在之前的博客(使用 Jenkins 自动编译 C# 项目、Jenkins 发布.NET 项目)中有讲到使用 MSBuild 插件来编译和发布 ASP.NET 项目,这里使用 Pipeline 来实现同样的功能。
这里分成三步来实现。
更新代码
为了获取 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 。
创建发布配置文件
这里使用通过 Pipeline 脚本创建一个发布用的配置文件。
编译并发布
调用 msbuild 通过指定 PublishProfile 和 DeployOnBuild 属性来编译和发布项目。
关于 MSBuild 命令参数的详细情况可以参考 这篇博客。
pipeline 中可以使用 archiveArtifacts
命令存档文件。
存档的文件会保存到 Jenkins 的 jobs/JOB_NAME/builds/BUILD_NO 目录下。
示例如下:
pipeline {
agent any
stages {
stage('Archive') {
steps {
archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true
}
}
}
}
在 Jenkins 中使用 Maven 打包项目后发布到 Linux 服务器。
Manage Jenkins => Manage Plugins 的 可选插件 标签中查询 SSH Pipeline Steps,勾选后安装。
可以写在 Jenkinsfile 中,用法参考 这篇博客
在 Jenkins 的 Manage Jenkins → Configure System → 邮件通知 中配置 Jenkins 发送邮件时使用的邮件服务器。
这里使用的是 QQ 邮箱。
需要注意的是密码输入项中填入的不是 QQ 号的密码,而是在 QQ 邮箱 设置 → 账户 → POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 中生成的授权码,另外还需要在这里启用 POP3/SMTP服务 。
从某种抽象层次上讲,部署流水线(Deployment pipeline)是指从软件版本控制库到用户手中这一过程的自动化表现形式。
--《持续交付--发布可靠软件的系统方法》
Jenkins 1.x 只能通过界面手动操作来“描述”部署流水线。Jenkins 2.x 终于支持 pipeline as code 了,可以通过“代码”来描述部署流水线。
使用“代码”而不是 UI 的意义:
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
以管理员身份打开 cmd 命令行窗口
cd 到 Jenkins 的 Home 目录
执行如下命令
jenkins.exe install
在 VS 中新增一个 Jenkins 用的发布配置
右键点击工程文件,选【发布】,新增一个叫【Jenkins-Local】的配置,配置好后提交到 CVS。
在 Job 的构建任务的【Command Line Arguments】中增加如下参数
/p:PublishProfile=Jenkins-Local;DeployOnBuild=true
保存后再次执行构建时就会自动执行发布操作了
Jenkins
自带的钉钉插件固定只能通知 Job 开始,执行成功或失败,如果要自定义消息内容,需要 POST
消息内容到机器人的 webhook
地址。消息格式参照 钉钉开放中心 - 文档中心 。
日程表的写法使用的 Cron 表达式语法(稍有改动),下面先介绍一下 Cron 表达式(转自 cron 表达式详解 )。
Cron 表达式是一个字符串,字符串以 5 或 6 个空格隔开,分为 6 或 7 个域,每一个域代表一个含义,Cron 有如下两种语法格式:
Seconds Minutes Hours DayofMonth Month DayofWeek Year
Seconds Minutes Hours DayofMonth Month DayofWeek
在 Job 的【General】中选择【参数化构建过程】
默认为空,表示构建最新版本的代码;可以通过 @{版本号}
的形式指定构建的版本(例:@65143
);
在Subversion
的Repository URL
的后面添加上面增加的参数${SVN_VERSION_NO}
安装插件 MSBuild Plugin
安装后再构建步骤中会多一个【Build a Visual Studio project or solution using MSBuild
】选项。
配置 MSBuild
在【系统管理】->【全局工具配置】->【MSBuild】中添加本地已安装的 MSBuild
。
在 Job 的构建中添加 MSBuild 步骤
在【构建后操作】中增加一个【Archive the artifacts】步骤,【用于存档的文件】中可以设置多个文档(逗号或者空格分隔),还可以使用通配符(*
),其它选项看自己需求勾选。
之后再执行构建,Job 首页上会显示【最后一次成功的构建结果】,每个构建任务的首页上也会显示【构建产生文件】,点进去之后可以打包下载全部文件。
从 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
打开 http://localhost:8080/,输入上面的密码,开始安装。
新建一个【构建一个自由风格的软件项目】的任务。
也可以直接从已经创建好的任务复制。
设置源码管理(我这里使用的是 SVN)
Repository URL
:SVN 代码目录所在的 URLCredentials
:可以点击旁边的 Add 按钮,输入用户名和密码;构建触发器
选择Poll SCM
,并在日程表中输入如下内容(表示每分钟检查一次 SVN)(注意中间的空格不可以少)
* * * * *
修改为每三分钟检查一次
*/3 * * * *
构建
Invoke top-level Maven targets
】步骤
Goals
:输入mvn
的命令,如:package
POM
:pom.xml,如果 pom.xml 文件在子目录,可以按照【projectname/pom.xml】格式输入;构建后操作
可以通过使用钉钉的插件,自动发送通知;或者发送邮件等等。