- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章docker利用WebHook实现持续集成由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
研发小伙伴可能对下列操作步骤会深有体会 。
写代码--》提交代码--》打包--》发布 。
在项目调试测试阶段,可能经常需要重复上面的步骤,以便将最新代码部署到特定环境供测试人员或其他人员使用 。
ci即持续集成的提出及各种解决方案,减轻了很多最初简单但繁琐的工作 。
本文将通过提交代码到git,然后通过webhook触发jenkins打包并发布到相应容器中,开发人员只需提交代码,后续打包发布都自动实现 。
git :我使用的码云 我的主页为: https://gitee.com/xiaochangwei 。
jenkins:jenkins ver. 2.89.2 。
tomcat 8 jdk8 maven3.5 。
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@iznz7e74o4ag3oz webapps]
# java -version
java version
"1.8.0_121"
java(tm) se runtime environment (build 1.8.0_121-b13)
java hotspot(tm) 64-bit server vm (build 25.121-b13, mixed mode)
[root@iznz7e74o4ag3oz webapps]
# mvn -version
apache maven 3.5.0 (ff8f5e7444045639af65f6095c62210b5713f426; 2017-04-04t03:39:06+08:00)
maven home:
/usr/local/src/maven
java version: 1.8.0_121, vendor: oracle corporation
java home:
/usr/local/src/jdk/jre
default locale: en_us, platform encoding: utf-8
os name:
"linux"
, version:
"3.10.0-693.2.2.el7.x86_64"
, arch:
"amd64"
, family:
"unix"
[root@iznz7e74o4ag3oz webapps]
#
|
配置好环境后,在tomcat中运行jenkins,并设置好用户名密码确保能正常登录使用 。
操作步骤:
1.安装插件 generic webhook trigger plugin、deploy to container plugin、git plugin 由于这里暂时未发布到docker中,通过deploy to container plugin发布到tomcat中的 。
2.上传maven项目到https://gitee.com 。
3.jenkins中新建项目ci 。
3.1 配置提交的代码地址,add有权限的用户名和密码(我的是私有项目),指定分支 。
3.2:配置maven命令以及发布到的tomcat 。
注意:发布项目的tomcat需要设置用户信息,即修改conf下的user.xml 具体可以参考我很早之前写的http://www.cnblogs.com/xiaochangwei/p/4952644.html 。
这样就可以手动构建项目了,请确保手动构建能成功后再进行下列操作 。
遇见的问题及解决方案:
如果构建时提示权限不对 。
生成公钥: ssh-keygen -t rsa 一直回车直结束 。
cat ~/.ssh/id_rsa.pub 将内容增加到码云上 。
如果还提示没权限 。
手动先在jenkins运行的机器上clone一次代码 如 git clone git@gitee.com:xiaochangwei/ci-demo.git 注意输入yes 。
然后再看.ssh目录,多了一个known_hosts 里面有码云了,然后再手动构建,应该就能成功了 。
至此,手动打包并部署就已经实现了 。
------------------------------自动部署 -------------------------------------------------- 。
1. 安装上述插件后勾选generic webhook trigger 增加post参数 ref expression值为 $.ref 注意有个点 。
增加optional filter 。
其实上面这部分不用设置也行,尤其是只会在jenkins中部署一个项目的一个分支时,只需要勾选上generic webhook trigger就可以的 。
2. 在码云中增加hook:http://user id:api token@jenkins部署的地址:端口号/jenkins/generic-webhook-trigger/invoke (红色这部分不要变) 。
(这里不用api token 直接用jenkins的登录密码也可以, api token查看地址为:jenkins-用户-点击用户名-api token) 。
同时勾选push或者其他你认为需要触发部署的事件 。
提交后点击测试,如果返回ok,则表示成功,切换到jenkins,查看项目是否能够自动部署 。
我自己写了一个接口用来获取点击测试后,到底请求了些什么 。
格式化下内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
{
"hook_name"
:
"push_hooks"
,
"total_commits_count"
: 1,
"before"
:
"0000000000000000000000000000000000000000"
,
"user_name"
:
"肖哥哥"
,
"project"
: {
"path"
:
"ci-demo"
,
"git_svn_url"
:
"svn://gitee.com/xiaochangwei/ci-demo"
,
"path_with_namespace"
:
"xiaochangwei/ci-demo"
,
"name"
:
"ci-demo"
,
"namespace"
:
"xiaochangwei"
,
"default_branch"
:
"master"
,
"git_http_url"
:
"https://gitee.com/xiaochangwei/ci-demo.git"
,
"name_with_namespace"
:
"肖哥哥/ci-demo"
,
"url"
:
"https://gitee.com/xiaochangwei/ci-demo"
,
"git_ssh_url"
:
"git@gitee.com:xiaochangwei/ci-demo.git"
},
"repository"
: {
"name"
:
"ci-demo"
,
"description"
:
""
,
"url"
:
"https://gitee.com/xiaochangwei/ci-demo.git"
,
"homepage"
:
"https://gitee.com/xiaochangwei/ci-demo"
},
"commits_more_than_ten"
:
false
,
"ref"
:
"refs/heads/master"
,
"password"
:
""
,
"commits"
: [{
"author"
: {
"name"
:
"肖哥哥"
,
"time"
:
"2015-11-06t13:21:07+08:00"
,
"email"
:
"317409898@qq.com"
},
"id"
:
"ec7159240a346fa5988913aa3057b902a4acb126"
,
"message"
:
"a test for webhooks"
,
"url"
:
"https://gitee.com/xiaochangwei/ci-demo/commit/ec7159240a346fa5988913aa3057b902a4acb126"
,
"timestamp"
:
"2015-11-06t13:21:07+08:00"
}],
"after"
:
"ec7159240a346fa5988913aa3057b902a4acb126"
,
"user"
: {
"name"
:
"肖哥哥"
,
"id"
: 372286,
"time"
:
"2018-01-11t12:38:38+08:00"
,
"user"
:
"xiaochangwei"
,
"email"
:
"317409898@qq.com"
,
"url"
:
"https://gitee.com/xiaochangwei"
}
}
|
其实多建立几个项目然后获取信息后会发现,不同项目间存在差异的就是project.git_ssh_url 和分支 ref 。
至此,单个项目的自动部署就完了 。
如果你在jenkins中有多个项目,你触发其中的一个webhook你就会发现,所有的项目都在构建?
这就有点不科学了,本来只想构建a项目,结果abc项目都构建了? 要解决这个就需要用到上面提到的post param 和 filer 了 。
解析触发自动构建的请求参数,ref和project.git_ssh_url是差异性的东西,那就根据两个来区分项目 。
有这上面的两个post参数还不行,因为只是获取到了对应的参数值 。
其实要想区分不同的项目也简单,只要获取到的ref还有url 和需要构建的项目分支和 git地址相同就构建,否则就不构建 。
optional filter提供的方式就是最简单的正则匹配 。
expression设置为 ^(refs/heads/master)_(git@gitee.com:xiaochangwei/ci-demo.git)$注意修改为自己的项目地址 。
text 设置为 $ref_$project.git_ssh_url 。
保存,再次构建,是不是只触发了一个项目了,而不是所有项目了 。
测试:
1.提交代码, 提交代码后看到jenkins就自动编译打包了 。
2.查看编译日志:jenkins收到了webhook请求,并且拉取了代码,提交信息和我们提交代码时输入信息一致 。
有同学质疑我这里为啥失败了,是不是自动构建不可用,不是哈, 我这里是用的阿里服务器,内存不够导致了自动发布失败 。
完整编译并正确部署的日志如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
generic cause
building
in
workspace
/root/
.jenkins
/workspace/ci
genericwebhookenvironmentcontributor received:
{
"before"
:
"0000000000000000000000000000000000000000"
,
"after"
:
"ec7159240a346fa5988913aa3057b902a4acb126"
,
"ref"
:
"refs/heads/master"
,
"user_name"
:
"\u8096\u54e5\u54e5"
,
"user"
:{
"id"
:372286,
"email"
:
"317409898@qq.com"
,
"name"
:
"\u8096\u54e5\u54e5"
,
"user"
:
"xiaochangwei"
,
"url"
:
"https://gitee.com/xiaochangwei"
,
"time"
:
"2018-01-12t08:56:18+08:00"
},
"repository"
:{
"name"
:
"ci-demo"
,
"url"
:
"https://gitee.com/xiaochangwei/ci-demo.git"
,
"description"
:
""
,
"homepage"
:
"https://gitee.com/xiaochangwei/ci-demo"
},
"commits"
:[{
"id"
:
"ec7159240a346fa5988913aa3057b902a4acb126"
,
"message"
:
"a test for webhooks"
,
"timestamp"
:
"2015-11-06t13:21:07+08:00"
,
"url"
:
"https://gitee.com/xiaochangwei/ci-demo/commit/ec7159240a346fa5988913aa3057b902a4acb126"
,
"author"
:{
"name"
:
"\u8096\u54e5\u54e5"
,
"email"
:
"317409898@qq.com"
,
"time"
:
"2015-11-06t13:21:07+08:00"
}}],
"project"
:{
"name"
:
"ci-demo"
,
"path"
:
"ci-demo"
,
"url"
:
"https://gitee.com/xiaochangwei/ci-demo"
,
"git_ssh_url"
:
"git@gitee.com:xiaochangwei/ci-demo.git"
,
"git_http_url"
:
"https://gitee.com/xiaochangwei/ci-demo.git"
,
"git_svn_url"
:
"svn://gitee.com/xiaochangwei/ci-demo"
,
"namespace"
:
"xiaochangwei"
,
"name_with_namespace"
:
"\u8096\u54e5\u54e5/ci-demo"
,
"path_with_namespace"
:
"xiaochangwei/ci-demo"
,
"default_branch"
:
"master"
},
"total_commits_count"
:1,
"commits_more_than_ten"
:
false
,
"enterprise"
:null,
"hook_name"
:
"push_hooks"
,
"password"
:
""
}
contributing variables:
ref = refs
/heads/master
project.git_ssh_url = git@gitee.com:xiaochangwei
/ci-demo
.git
> git rev-parse --is-inside-work-tree
# timeout=10
fetching changes from the remote git repository
> git config remote.origin.url git@gitee.com:xiaochangwei
/ci-demo
.git
# timeout=10
fetching upstream changes from git@gitee.com:xiaochangwei
/ci-demo
.git
> git --version
# timeout=10
using git_askpass to
set
credentials
> git fetch --tags --progress git@gitee.com:xiaochangwei
/ci-demo
.git +refs
/heads/
*:refs
/remotes/origin/
*
> git rev-parse refs
/remotes/origin/master
^{commit}
# timeout=10
> git rev-parse refs
/remotes/origin/origin/master
^{commit}
# timeout=10
checking out revision 2eca30803759e021f658c92c136aa72dc026c3be (refs
/remotes/origin/master
)
> git config core.sparsecheckout
# timeout=10
> git checkout -f 2eca30803759e021f658c92c136aa72dc026c3be
commit message:
"test auto package and deploy"
> git rev-list --no-walk 2eca30803759e021f658c92c136aa72dc026c3be
# timeout=10
parsing poms
established tcp socket on 44276
[ci] $
/usr/local/src/jdk/bin/java
-
cp
/root/
.jenkins
/plugins/maven-plugin/web-inf/lib/maven35-agent-1
.12-alpha-1.jar:
/usr/local/src/maven/boot/plexus-classworlds-2
.5.2.jar:
/usr/local/src/maven/conf/logging
jenkins.maven3.agent.maven35main
/usr/local/src/maven
/usr/local/src/tomcat/webapps/jenkins/web-inf/lib/remoting-3
.14.jar
/root/
.jenkins
/plugins/maven-plugin/web-inf/lib/maven35-interceptor-1
.12-alpha-1.jar
/root/
.jenkins
/plugins/maven-plugin/web-inf/lib/maven3-interceptor-commons-1
.12-alpha-1.jar 44276
<===[jenkins remoting capacity]===>channel started
executing maven: -b -f
/root/
.jenkins
/workspace/ci/pom
.xml clean package -dmaven.
test
.skip=
true
[info] scanning
for
projects...
[info]
[info] ------------------------------------------------------------------------
[info] building docker-demo 0.0.1-snapshot
[info] ------------------------------------------------------------------------
[info]
[info] --- maven-clean-plugin:2.6.1:clean (default-clean) @ ci-demo ---
[info] deleting
/root/
.jenkins
/workspace/ci/target
[info]
[info] --- maven-resources-plugin:2.6:resources (default-resources) @ ci-demo ---
[info] using
'utf-8'
encoding to copy filtered resources.
[info] copying 1 resource
[info] copying 0 resource
[info]
[info] --- maven-compiler-plugin:3.1:compile (default-compile) @ ci-demo ---
[info] changes detected - recompiling the module!
[info] compiling 6
source
files to
/root/
.jenkins
/workspace/ci/target/classes
[info]
[info] --- maven-resources-plugin:2.6:testresources (default-testresources) @ ci-demo ---
[info] not copying
test
resources
[info]
[info] --- maven-compiler-plugin:3.1:testcompile (default-testcompile) @ ci-demo ---
[info] not compiling
test
sources
[info]
[info] --- maven-surefire-plugin:2.18.1:
test
(default-
test
) @ ci-demo ---
[info] tests are skipped.
[info]
[info] --- maven-war-plugin:2.6:war (default-war) @ ci-demo ---
[info] packaging webapp
[info] assembling webapp [ci-demo]
in
[
/root/
.jenkins
/workspace/ci/target/ci-demo
]
[info] processing war project
[info] webapp assembled
in
[298 msecs]
[info] building war:
/root/
.jenkins
/workspace/ci/target/ci-demo
.war
[info]
[info] --- spring-boot-maven-plugin:1.5.9.release:repackage (default) @ ci-demo ---
[info] ------------------------------------------------------------------------
[info] build success
[info] ------------------------------------------------------------------------
[info] total
time
: 18.729 s
[info] finished at: 2018-01-12t08:56:46+08:00
[info] final memory: 30m
/72m
[info] ------------------------------------------------------------------------
waiting
for
jenkins to finish collecting data
[jenkins] archiving
/root/
.jenkins
/workspace/ci/pom
.xml to com.xiao
/ci-demo/0
.0.1-snapshot
/ci-demo-0
.0.1-snapshot.pom
[jenkins] archiving
/root/
.jenkins
/workspace/ci/target/ci-demo
.war to com.xiao
/ci-demo/0
.0.1-snapshot
/ci-demo-0
.0.1-snapshot.war
channel stopped
deploying
/root/
.jenkins
/workspace/ci/target/ci-demo
.war to container tomcat 8.x remote with context
/ci
redeploying [
/root/
.jenkins
/workspace/ci/target/ci-demo
.war]
undeploying [
/root/
.jenkins
/workspace/ci/target/ci-demo
.war]
deploying [
/root/
.jenkins
/workspace/ci/target/ci-demo
.war]
finished: success
|
查看效果 。
总结 。
以上所述是小编给大家介绍的docker利用webhook实现持续集成,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我网站的支持! 。
原文链接:http://www.cnblogs.com/xiaochangwei/p/8268509.html 。
最后此篇关于docker利用WebHook实现持续集成的文章就讲到这里了,如果你想了解更多关于docker利用WebHook实现持续集成的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
如果我错了,但身份验证 session 有 30 天的最大限制,请纠正我?如果是这种情况,有没有办法让我的服务器节点应用程序永远监听经过身份验证的 dataRef? 干杯, 旅行。 最佳答案 自 on
我目前正在阅读 book Continuos Delivery由 Humble/Farley 撰写,虽然里面的很多东西都是有道理的,但有一件事让我烦恼: 似乎作者只针对基于服务器的(单客户端?)应用程
好吧,我非常了解每个人对自制密码管理器的看法,但我希望得到帮助。 不用于实际使用,仅供学习。 我想知道,在 C++ 中如何拥有长期变量。或者真的,有什么长期的。 长期是什么意思?在下次运行 .exe
我在文本文件中有以下三行(最后 3 行): } } } 我想做的是做这样的事情: } } blablabla blablabla blabla
在 iOS 中,有没有一种简单的方法可以在每天的同一时间发送 10 天的推送通知?我不想向所有用户发送推送通知。我的应用程序的工作方式是,用户可以选择连续十天推送通知的时间。您有推荐的 API 吗?或
我正在努力寻找一种当前最先进的方法来处理频繁更新的通知(例如每 3 分钟一次)。似乎在较新的 Android 版本中内置了如此多的电源效率调整(幸运的是!),我之前成功使用的方法(使用 Broadca
我不得不在一些糟糕的房地产网站上花费大量时间。我比较精通 CSS,并且可以(在 FireFox 中)“检查元素”并更改 CSS 以隐藏或缩小特定页面的华而不实的元素。但我想将此自定义 CSS 应用于特
目前正在研究如何使用 signalR 在处理文件时向用户呈现文件的进度报告。我正在使用 asp.net MVC 4。通过 Ajax 进行发布/获取时,我可以轻松获取状态更改。 因为我需要上传一个文件(
这个问题在这里已经有了答案: How can I round up the time to the nearest X minutes? (15 个答案) Is there a simple fun
我有一个 php 脚本,我想运行特定的时间(例如 5 分钟),但只能运行一次。对于 cron 作业,这将无限期地运行。还有别的办法吗? 最佳答案 处理这个问题的方法是: 当某些事件触发需要 cron
我弄乱了我的 apache 和 php.ini 文件,我网站的用户仍然提示该网站在很短的时间后或每次他们关闭并打开同一个浏览器时将他们注销。 我正在运行 Apache 和 PHP。 我应该进行哪些设置
如何查询今天的总和需要减去前一天的总和,每天持续一个月。 SELECT COUNT(DISTINCT member_profile.memberProfileNumber) FROM member_p
这个问题在这里已经有了答案: How do I add a delay in a JavaScript loop? (32 个答案) 关闭 8 年前。 我认为这个问题之前一定有人问过,但我找不到其他
用户在我的网站上注册后,我们会向他发送一封确认电子邮件。我想要的是 - 三天内每 24 小时为用户重新发送一次电子邮件。例如: user_table id , name, date_registere
最近我从 Codeigniter 换到了 Laravel,一切都很顺利,除了我遇到了 Session::flash 的问题。 当我创建新用户时,我收到成功消息,但它会持续 2 个请求,即使我没有通过验
如果有人能帮助我解决这个问题,我将非常感激。 我正在尝试针对 CPU 使用率 >= 80% 持续 30 分钟或更长时间创建 Azure 监视器警报 我已附上警报规则条件的屏幕截图。在“评估依据”下,聚
如果有人能帮助我解决这个问题,我将非常感激。 我正在尝试针对 CPU 使用率 >= 80% 持续 30 分钟或更长时间创建 Azure 监视器警报 我已附上警报规则条件的屏幕截图。在“评估依据”下,聚
希望大家平安 1。我的目标 我正在尝试模拟 3 天的真实情况。系统每天只能工作 8 小时。 我的目标是模型运行 8 小时,持续 3 天,以获得足够的数据进行分析。 2。我的问题 我有一个代理预约时间表
我需要在 8 小时内每 5 分钟调用一次函数。问题是它必须是同一天。例如,如果用户在 3/29 晚上 11:59 登录系统,而现在是 3/30 凌晨 12:01,则不应再调用该函数。 我知道如何每
我正在开发一个 React Native 应用程序,该应用程序使用 Firebase 的 Firestore 作为后端。现在,每次收到新消息时,我都会从 Firestore 获取所有消息并更新我的状态
我是一名优秀的程序员,十分优秀!