在前面几章里面,我们配置了基本的组件,围绕java构建配置了nexus3,配置了skywalking,能够打包和构建镜像,但是我们需要将这些串联起来,组成一个流水线,并且需要将skywalking的agent打包在镜像内,并配置必要的参数。
与此同时,我们使用一个简单的实现方式用作在jenkins上,那就是pipeline和部分groovy语法的函数,至少来完成一下场景。
场景1: A方希望提交代码或者打TAG来触发jenkins构建,在构建之前使用sonarqube进行代码扫描,并且配置简单的阈值。而后去上述的流水线整合。
按道理,sonarqube的配置是有一些讲究的,处于整体考虑sonarqube只用作流水线管道的一部分,本次不去考虑sonarqube的代码扫描策略,也不会将扫描结果关联到gitlab,只是仅仅将文件反馈到Jenkins。这些在后面如果有时间在进行配置
在本次中我只仅仅使用pipeline,并不是共享库。
阅读此篇,你将了解如下列表中简单的实现方式:
- jenkins和gitlab触发(本章实现)
- jenkins凭据使用(本章实现)
- juit配置
- sonarqube简单扫描
- 配置docker中构建docker
- 打包基于java的skywalking agent(本章实现)
- 基于gitlab来管理kustomize的k8s配置清单
- kubectl部署
- kubeclt deployment的状态跟踪
- 钉钉消息的构建状态推送
拓扑如下图:
1.添加skywalking agent
此前在基于nexus3代码构建和harbor镜像打包(3)一骗你中,我们已经有了一个java-hello-world的包,提供了一个8086的端口,并且我们将Dockerfile之类的都已准备妥当,此时延续此前的流程继续走。如果没有,在此页面克隆。
1.现在我们下载一个skywaling的agent(8.11.0)端来到Dockerfile中,要实现,需要下载包到jenkins服务器上,或者打在镜像内。
https://www.apache.org/dyn/closer.cgi/skywalking/java-agent/8.11.0/apache-skywalking-java-agent-8.11.0.tgz
2.gitlab上创建一个java组,创建一个java-demo的项目,将代码和代码中的Dockerfile推送到gitlab仓库中
3.在Dockerfile中添加COPY agent,并在启动的时候添加到启动命令中,如下
docker-compose中映射关系中,/data/jenkins-latest/package:/usr/local/package
。于是我们将skywalking包存放在/data/jenkins-latest/package
下,而后在Dockerfile中/usr/local/package
的路径即可
COPY /usr/local/package/skywalking-agent /skywalking-agent
而后启动的时候引入到启动命令中
-javaagent:/skywalking-agent/skywalking-agent.jar
CMD java ${JAVA_OPTS} -javaagent:/skywalking-agent/skywalking-agent.jar -jar *.jar
Dockerfile如下
我们需要修改下目录 结构,提前创建/skywalking-agent/logs并且授权
并且,skywalking-agent目录需要提前在流水线中复制到当前目录中来
FROM registry.cn-hangzhou.aliyuncs.com/marksugar/jdk:8u202
MAINTAINER by mark
ENV JAVA_OPTS="\
-server \
-Xms2048m \
-Xmx2048m \
-Xmn512m \
-Xss256k \
-XX:+UseConcMarkSweepGC \
-XX:+UseCMSInitiatingOccupancyOnly \
-XX:CMSInitiatingOccupancyFraction=70 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/data/logs" \
MY_USER=linuxea \
MY_USER_ID=316
RUN addgroup -g ${MY_USER_ID} -S ${MY_USER} \
&& adduser -u ${MY_USER_ID} -S -H -s /sbin/nologin -g 'java' -G ${MY_USER} ${MY_USER} \
&& mkdir /data/logs /skywalking-agent -p
COPY target/*.jar /data/
COPY skywalking-agent /skywalking-agent/
RUN chown -R 316.316 /skywalking-agent
WORKDIR /data
USER linuxea
CMD java ${JAVA_OPTS} -javaagent:/skywalking-agent/skywalking-agent.jar -jar *.jar
注意事项
- 我们需要通过trace-ignore-plugin来过滤跟踪系统需要忽略的url,因此我们需要根据trace-ignore-plugin进行配置。这很有必要
匹配规则遵循 Ant Path 匹配风格,如 /path/、/path/*、/path/?。
将apm-trace-ignore-plugin-x.jar复制到agent/plugins,重启agent即可生效插件。于是,我们将这个插件复制到plugins下
tar xf apache-skywalking-java-agent-8.11.0.tar.gz cd skywalking-agent/ cp optional-plugins/apm-trace-ignore-plugin-8.11.0.jar plugins/
- 忽略参数(忽略参数在k8syaml中进行配置)
有两种方法可以配置忽略模式。通过系统环境设置具有更高的优先级。
1.系统环境变量设置,需要在系统变量中添加skywalking.trace.ignore_path,值为需要忽略的路径,多条路径之间用,分隔
2.将/agent/optional-plugins/apm-trace-ignore-plugin/apm-trace-ignore-plugin.config 复制到/agent/config/ 目录下,并添加过滤跟踪的规则
trace.ignore_path=/your/path/1/,/your/path/2/
4.将gitlab的java-demo项目拉到本地后,将java-helo-word项目文件移动到私有gitlab,并且将Dockerfile放入
[root@Node-172_16_100_48 /data]# git clone git@172.16.100.47:java/java-demo.git
Cloning into 'java-demo'...
remote: Enumerating objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3
Receiving objects: 100% (3/3), done.
[root@Node-172_16_100_48 /data]# mv java-helo-word/* java-demo/
[root@Node-172_16_100_48 /data]# tree java-demo/linuxea/
java-demo/
├── bbin.png
├── cn-site-service.iml
├── Dockerfile
..........
23 directories, 26 files
放入完成后的Dockerfile的内容如下
FROM registry.cn-hangzhou.aliyuncs.com/marksugar/jdk:8u202
MAINTAINER by mark
ENV JAVA_OPTS="\
-server \
-Xms2048m \
-Xmx2048m \
-Xmn512m \
-Xss256k \
-XX:+UseConcMarkSweepGC \
-XX:+UseCMSInitiatingOccupancyOnly \
-XX:CMSInitiatingOccupancyFraction=70 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/data/logs" \
MY_USER=linuxea \
MY_USER_ID=316
RUN addgroup -g ${MY_USER_ID} -S ${MY_USER} \
&& adduser -u ${MY_USER_ID} -S -H -s /sbin/nologin -g 'java' -G ${MY_USER} ${MY_USER} \
&& mkdir /data/logs /skywalking-agent -p
COPY target/*.jar /data/
COPY skywalking-agent /skywalking-agent/
RUN chown -R 316.316 /skywalking-agent
WORKDIR /data
USER linuxea
CMD java ${JAVA_OPTS} -javaagent:/skywalking-agent/skywalking-agent.jar -jar *.jar
Dockerfile添加skywalking到此完成。
[root@linuxea-48 /data/java-demo]# git add . && git commit -m "first commit" && git push -u origin main
[main 2f6d866] first commit
25 files changed, 545 insertions(+)
create mode 100644 Dockerfile
create mode 100644 bbin.png
create mode 100644 cn-site-service.iml
create mode 100644 fenghuang.png
create mode 100644 index.html
create mode 100644 pom.xml
create mode 100644 src/main/java/com/dt/info/InfoSiteServiceApplication.java
create mode 100644 src/main/java/com/dt/info/controller/HelloController.java
create mode 100644 src/main/resources/account.properties
create mode 100644 src/main/resources/application.yml
create mode 100644 src/main/resources/log4j.properties
...........
remote:
remote: To create a merge request for main, visit:
remote: http://172.16.100.47/java/java-demo/-/merge_requests/new?merge_request%5Bsource_branch%5D=main
remote:
To git@172.16.100.47:java/java-demo.git
* [new branch] main -> main
Branch main set up to track remote branch main from origin.
代码上传到gitlab后开始配置jenkins
B.new jar
你也可以生成一个空的java包来测试
准备一个jar包,可以是一个java已有的程序或者下载一个空的,如下
在https://start.spring.io/页面默认选择,选择java 8,而后点击CENERATE下载demo包,解压这个包将代码推送到gitlab
将项目拉到本地后在上传demo包
Administrator@DESKTOP-RD8S1SJ MINGW64 /h/k8s-1.20.2/gitops
$ git clone git@172.16.100.47:pipeline-ops/2022-test.git
Cloning into '2022-test'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
Administrator@DESKTOP-RD8S1SJ MINGW64 /h/k8s-1.20.2/gitops
$ unzip demo.zip -d 2022-test
$ git add . && git commit -m "first commit" && git push
2.关联jenkins和gitlab
为了能够实现gitlab自动触发,我们需要配置一个webhook,并且jenkins安装插件来完成。
首先我们需要插件,并且在gitlab配置一个webhook,一旦gitlab发生事件后就会触发到jenkins,jenkins启动流水线作业。我将会在流水线作业来判断作业被触发是通过gitlab还是其他的。
2.1 jenkins插件
安装Generic Webhook Trigger插件,而后点击新建imtes->输入一个名称—>选择pipeline
例如,创建了一个Linuxea-2022的项目,勾选了Generic Webhook Trigger,并且在下方的token,输入了一个marksugar
测试pipeline
pipeline{
//指定运行此流水线的节点
agent any
//管道运行选项
options {
skipStagesAfterUnstable()
}
//流水线的阶段
stages{
//阶段1 获取代码
stage("CheckOut"){
steps{
script{
println("获取代码")
}
}
}
stage("Build"){
steps{
script{
println("运行构建")
}
}
}
}
post {
always{
script{
println("流水线结束后,经常做的事情")
}
}
success{
script{
println("流水线成功后,要做的事情")
}
}
failure{
script{
println("流水线失败后,要做的事情")
}
}
aborted{
script{
println("流水线取消后,要做的事情")
}
}
}
}
手动触发测试
curl --location --request GET 'http://172.16.100.48:58080/generic-webhook-trigger/invoke/?token=marksugar'
运行一次
[root@linuxea-47 ~]# curl --location --request GET 'http://172.16.100.48:58080/generic-webhook-trigger/invoke/?token=marksugar'
{"jobs":{"linuxea-2022":{"regexpFilterExpression":"","triggered":true,"resolvedVariables":{},"regexpFilterText":"","id":4,"url":"queue/item/4/"}},"message":"Triggered jobs."}You have new mail in /var/spool/mail/root
2.2 配置gitlab webhook
1.在右上角的preferences中的最下方Localization选择简体中文保存
2.管理元->设置->网络->下拉菜单中的“出战请求”
- 勾选 允许来自 web hooks 和服务对本地网络的请求
回到gitlab
首先进入项目后选择settings->webhooks->url
url输入
http://172.16.100.48:58080/generic-webhook-trigger/invoke/?token=marksugar
?marksugar, 问号后面为设置的token
而后选中push events
和tag push events
和最下面的ssl verfication : Enable SSL verification
兵点击Add webhook
测试
在最下方 -> test下拉菜单中选择一个被我们选中过的事件,而后点击。模拟一次push
在edit中 -> 最下方 View details 查看Request body,Request body就是发送的内容,这些内容可以被获取到并且解析
回到jenkins,查看已经开始构建
3.1 自动与手动关联
在上面已经配置了自动触发jenkins构建,但是这还不够,我们想在jenkins上体现出来,那一次是自动构建,那一次是手动点击,于是我们添加try和catch
因此,我们配置try,并且在现有的阶段添加两个必要的环境变量来应对手动触发
3.2 添加手动参数
- branch: 分支
- BASEURL:git地址
3.2 配置识别try语法
我们需要获取请求过来的数据,因此我们获取所有的json请求,配置如下
自动触发而后获取的变量方式解析后,我将必要的值进行拼接后如下
println("Trigger User: ${info_user_username}")
println("Trigger Branch: ${info_ref}" )
println("Trigger event: ${info_event_name}")
println("Trigger application: ${info_project_name}")
println("Trigger version number: ${info_checkout_sha}")
println("Trigger commit message: ${info_commits_0_message}")
println("Trigger commit time: ${info_commits_0_timestamp}")
而我们只需要部分,因此就变成了如下这般
try {
println("Trigger Branch: ${info_ref}")
RefName="${info_ref.split("/")[-1]}"
//自定义显示名称
currentBuild.displayName = "#${info_event_name}-${RefName}-${info_checkout_sha}"
//自定义描述
currentBuild.description = "Trigger by user ${info_user_username} 非gitlab自动触发 \n branch: ${RefName} \n commit message: ${info_commits_0_message}"
BUILD_TRIGGER_BY="${info_user_username}"
BASEURL="${info_project_git_http_url}"
}catch(e){
BUILD_TRIGGER_BY="${currentBuild.getBuildCauses()[0].userId}"
currentBuild.description = "Trigger by user ${BUILD_TRIGGER_BY} 手动触发 \n branch: ${branch} \n git url: ${BASEURL}"
}
pipeline{
//指定运行此流水线的节点
agent any
//管道运行选项
options {
skipDefaultCheckout true
skipStagesAfterUnstable()
buildDiscarder(logRotator(numToKeepStr: '2'))
}
//流水线的阶段
stages{
//阶段1 获取代码
stage("env"){
steps{
script{
println("${BASEURL}")
}
}
}
}
}
一旦被触发后,如下图
3.3 判断gitlab
但这还没玩,尽管此时已经能够识别自动触发了,但是我们无法识别到底是从哪里来的自动触发。
但是,我们只需要知道那些是gitlab来的请求和不是gitlab来的请求即可。
简单来说,就是需要一个参数来判断触发这次构建的来源。于是,我们配置请求参数来识别判断
在Request parameters-> 输入onerun
- onerun: 用来判断的参数
而后在gitlab的url中添加上传递参数
http://172.16.100.48:58080/generic-webhook-trigger/invoke/?onerun=gitlabs&token=marksugar
这里的onerun=gitlabs,如下
我们在try中进行判断即可
- onerun=gitlabs
try {
if ( "${onerun}" == "gitlabs"){
println("从带有gitlabs请求来的构建")
}
}catch(e){
println("从没有带有gitlabs请求来的构建")
}
在本次中,配置如下
try {
if ( "${onerun}" == "gitlabs"){
println("Trigger Branch: ${info_ref}")
RefName="${info_ref.split("/")[-1]}"
//自定义显示名称
currentBuild.displayName = "#${info_event_name}-${RefName}-${info_checkout_sha}"
//自定义描述
currentBuild.description = "Trigger by user ${info_user_username} 自动触发 \n branch: ${RefName} \n commit message: ${info_commits_0_message}"
BUILD_TRIGGER_BY="${info_user_username}"
BASEURL="${info_project_git_http_url}"
}
}catch(e){
BUILD_TRIGGER_BY="${currentBuild.getBuildCauses()[0].userId}"
currentBuild.description = "Trigger by user ${BUILD_TRIGGER_BY} 非自动触发 \n branch: ${branch} \ngit: ${BASEURL}"
}
pipeline{
//指定运行此流水线的节点
agent any
//管道运行选项
options {
skipDefaultCheckout true
skipStagesAfterUnstable()
buildDiscarder(logRotator(numToKeepStr: '2'))
}
//流水线的阶段
stages{
//阶段1 获取代码
stage("env"){
steps{
script{
println("${BASEURL}")
}
}
}
}
}
手动构建一次
通过命令构建
[root@linuxea-48 ~]# curl --location --request GET 'http://172.16.100.48:58080/generic-webhook-trigger/invoke/?onerun=gitlabs&token=marksugar' && echo
{"jobs":{"linuxea-2022":{"regexpFilterExpression":"","triggered":true,"resolvedVariables":{"info":"","onerun":"gitlabs","onerun_0":"gitlabs"},"regexpFilterText":"","id":14,"url":"queue/item/14/"}},"message":"Triggered jobs."}
如下
通过这样的配置,我们至少能从jenkins上看到构建的触发类型而已。
评论