南京的网站建设,市场营销策划书模板,项目管理软件功能,网站建设的三大原则Jenkins
第三章 Jenkins Git Maven 自动化部署配置
十、几种构建方式
快照依赖构建/Build whenever a SNAPSHOT dependency is built 当依赖的快照被构建时执行本job 触发远程构建 (例如,使用脚本) 远程调用本job的restapi时执行本job job依赖构建/Build after other proj…Jenkins
第三章 Jenkins Git Maven 自动化部署配置
十、几种构建方式
快照依赖构建/Build whenever a SNAPSHOT dependency is built 当依赖的快照被构建时执行本job 触发远程构建 (例如,使用脚本) 远程调用本job的restapi时执行本job job依赖构建/Build after other projects are built 当依赖的job被构建时执行本job 定时构建/Build periodically 使用cron表达式定时构建本job 向GitHub提交代码时触发Jenkins自动构建/GitHub hook trigger for GITScm polling Github-WebHook出发时构建本job 定期检查代码变更/Poll SCM 使用cron表达式定时检查代码变更变更后构建本job
1. 触发远程构建/gitlab上改动自动构建
代码改动自动可以使用gitlab的webhook回调钩子调起Jenkins的启动任务接口
在构建触发器中配置接口和token 2. 定时构建
Jenkins cron表达式
标准cron
https://crontab.guru
Jenkins cron不是标准的cron表达式
第一个 * 表示每个小时的第几分钟取值0~59H * * * *
H每小时执行一次第二颗 * 表示小时取值0~23* 15 * * * 表示每天下午3点
* 1 * * * 表示每天凌晨1点第三颗 * 表示一个月的第几天取值1~31
* 1 5 * * 表示每月5日凌晨1点第四颗 * 表示第几月取值1~12
* 15 5 1 * 表示每年几月执行第五颗 * 表示一周中的第几天取值0~7其中0和7代表的都是周日“/”
表示每隔多长时间比如 */10 * * * * 表示 每隔10分钟
“H”
hash散列值以job名取值获取到以job名为入参的唯一值相同名称值也相同这个偏移量会和实际时间相加获得一个真实的运行时间
意义在于不同的项目在不同的时间运行即使配置的值是一样的比如 都是15 * * * * 表示每个小时的第15分钟开始执行任务那么会造成同一时间内在Jenkins中启动很多job换成H/15 * * * *,那么在首次启动任务时会有随机值参与进来有的会在17分钟启动 有的会在19分钟启动随后的启动时间也是这个值。这样就能错开相同cron值的任务执行了。
H的值也可以设置范围
H * * * *表示一小时内的任意时间
*/10 * * * *每10分钟
H/10 * * * *每10分钟,可能是7,17,27起始时间hash步长不变
45 3 * * 1-6 每个周一至周六凌晨3点45 执行1次
45 3-5 * * 1-6 每个周一至周六凌晨3点45 凌晨4点45凌晨5点45 各执行1次
H(40-48) 3-5 * * 1-6 在40~48之间取值 其他同上
45 3-5/2 * * 1-6 每个周一至周六凌晨3点45 凌晨5点45 各执行1次
45 0-6/2 * * 1-6 * * 1-6 0点开始每间隔2小时执行一次 0:45、2:45、4:45
3. 源码变更构建
使用Poll SCM 方式与Build periodically一样
会主动定期检查代码托管服务器上是否有变化一旦发生变化执行job构建
4. 测试报告邮件通知
十一、自动化部署到docker容器中
1. docker外挂目录
docker run -d -p 8080:8080 --name demo-out -v /root/jarfile/demo-1-0.0.1-SNAPSHOT.jar:/app.jar openjdk:11 java -jar app.jar2. 打包到容器内
2.1 准备一台测试服务器 docker环境
2.2 准备支持jdk的镜像
FROM openjdk:11
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
RUN javac Main.java
CMD [java, Main]2.3 把jar包打包到容器内
dockerfile
FROM openjdk:11
EXPOSE 8080WORKDIR /rootADD jarfile/demo*.jar /root/app.jar
ENTRYPOINT [java,-jar,/root/app.jar]打包镜像
docker build -t demo .配置国内镜像
修改/etc/docker/daemon.json文件没有的话创建一个
写入
{registry-mirrors: [https://ustc-edu-cn.mirror.aliyuncs.com,http://hub-mirror.c.163.com,https://registry.aliyuncs.com]
}重启服务
systemctl daemon-reload
systemctl restart docker十二、Jenkins集群/并发构建
集群化构建可以有效提升构建效率尤其是团队项目比较多或是子项目比较多的时候可以并发在多台机器上执行构建。
勾选 在必要的时候并发构建
第四章 流水线 pipeline
流水线既能作为任务的本身也能作为Jenkinsfile
使用流水线可以让我们的任务从ui手动操作转换为代码化像docker的dockerfile一样从shell命令到配置文件更适合大型项目可以让团队其他开发者同时参与进来同时也可以编辑开发Jenkins web ui不能完成的更复杂的构建逻辑作为开发者可读性也更好。
一、完整语法
5个必备的组成部分
pipeline整条流水线
agent指定执行器
stages所有阶段
stage某一阶段可有多个
steps阶段内的每一步可执行命令二、测试脚本
1. 基础框架
pipeline {agent anystages {stage(拉取代码) {steps {echo 拉取代码完成}}stage(执行构建) {steps {echo 执行构建完成}}}post {always {echo 完成}failure {echo 失败}}
}2. 阶段视图 Stage View
2.1 blue ocean可视化界面
全新的流水线控制ui可重复执行某阶段代码
插件中心搜索blue ocean安装即可
2.2 post
流水线完成后可执行的任务
always 无论流水线或者阶段的完成状态。changed 只有当流水线或者阶段完成状态与之前不同时。failure 只有当流水线或者阶段状态为failure运行。success 只有当流水线或者阶段状态为success运行。unstable 只有当流水线或者阶段状态为unstable运行。例如测试失败。aborted 只有当流水线或者阶段状态为aborted 运行。例如手动取消。
2.3 agent
可以指定执行节点
label 指定运行job的节点标签
any 不指定由Jenkins分配
pipeline {agent {node {label jenkins-02}}stages {stage(拉取代码) {steps {sh sleep 10echo 拉取代码完成}}stage(执行构建) {steps {echo 执行构建完成}}}post {always {echo 完成}failure {echo 失败}}
}3. pipeline中执行自动化构建
pipeline {agent anytools {maven maven3}stages {stage(拉取代码) {steps {git branch: main, credentialsId: gitlab, url: http://192.168.44.103/root/java-project.gitecho 拉取成功}}stage(执行构建) {steps {// sh mvn --versionsh cd demo-1mvn clean packageecho 构建完成}}stage(clean test server){steps{sshPublisher(publishers: [sshPublisherDesc(configName: testserver, transfers: [sshTransfer(cleanRemote: false, excludes: , execCommand: rm -rf *docker stop demo
docker rm demo
docker rmi demo
, execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: [, ], remoteDirectory: , remoteDirectorySDF: false, removePrefix: , sourceFiles: /root)], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])}}stage(发送jar包到测试服务器) {steps {sshPublisher(publishers: [sshPublisherDesc(configName: testserver, transfers: [sshTransfer(cleanRemote: false, excludes: , execCommand: , execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: [, ], remoteDirectory: /jarfile, remoteDirectorySDF: false, removePrefix: demo-1/target, sourceFiles: **/demo*.jar), sshTransfer(cleanRemote: false, excludes: , execCommand: docker build -t demo .
docker run -d -p 8080:8080 --name demo demo, execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: [, ], remoteDirectory: /, remoteDirectorySDF: false, removePrefix: demo-1/docker, sourceFiles: demo-1/docker/dockerfile)], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])echo jar send over!}}}
}三、声明式流水线
好处
更像是在Jenkins web ui中的操作可读性比较高可以使用blue ocean自动生成支持语法检查
坏处
代码逻辑能力比脚本式弱不能完成特别复杂的任务
四、脚本式流水线
好处
更少的代码和弱规范要求更灵活的自定义代码操作不受约束可以构建特别复杂的工作流和流水线
坏处
读写对编程要求比较高比声明式流水线代码更复杂