linuxea:gitlab和jenkins自动和手动触发构建(6)

marksugar
2022-07-01 / 0 评论 / 1,859 阅读 / 正在检测是否收录...

在前面几章里面,我们配置了基本的组件,围绕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的状态跟踪
  • 钉钉消息的构建状态推送

拓扑如下图:
image-20220629231142134.png

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

注意事项

匹配规则遵循 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

image-20220630001656263.png

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

image-20220617225657490.png

测试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

image-20220617231537277.png

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 eventstag push events和最下面的ssl verfication : Enable SSL verification兵点击Add webhook

image-20220617231721926.png

测试

在最下方 -> test下拉菜单中选择一个被我们选中过的事件,而后点击。模拟一次push

image-20220617231820982.png

在edit中 -> 最下方 View details 查看Request body,Request body就是发送的内容,这些内容可以被获取到并且解析

image-20220617232019754.png

回到jenkins,查看已经开始构建

image-20220617232047892.png

3.1 自动与手动关联

在上面已经配置了自动触发jenkins构建,但是这还不够,我们想在jenkins上体现出来,那一次是自动构建,那一次是手动点击,于是我们添加try和catch

因此,我们配置try,并且在现有的阶段添加两个必要的环境变量来应对手动触发

3.2 添加手动参数

  • branch: 分支

image-20220630172627935.png

  • BASEURL:git地址

image-20220701213231636.png

3.2 配置识别try语法

我们需要获取请求过来的数据,因此我们获取所有的json请求,配置如下

image-20220630173209524.png

自动触发而后获取的变量方式解析后,我将必要的值进行拼接后如下

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}")
                }
            }      
        }
    }
}

一旦被触发后,如下图

image-20220630173517183.png

3.3 判断gitlab

但这还没玩,尽管此时已经能够识别自动触发了,但是我们无法识别到底是从哪里来的自动触发。

但是,我们只需要知道那些是gitlab来的请求和不是gitlab来的请求即可。

简单来说,就是需要一个参数来判断触发这次构建的来源。于是,我们配置请求参数来识别判断

在Request parameters-> 输入onerun

  • onerun: 用来判断的参数

image-20220630174431103.png

而后在gitlab的url中添加上传递参数

http://172.16.100.48:58080/generic-webhook-trigger/invoke/?onerun=gitlabs&token=marksugar

这里的onerun=gitlabs,如下

image-20220701213501266.png

我们在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}")
                }
            }      
        }
    }
}

手动构建一次

image-20220701213705748.png

通过命令构建

[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."}

如下
image-20220701213837273.png

通过这样的配置,我们至少能从jenkins上看到构建的触发类型而已。

0

评论

博主关闭了所有页面的评论