
jenkins/jenkins:2.332.2-centos7-jdk8
gitlab-ce:14.9.3-ce.0
链接:https://pan.baidu.com/s/1u6LAk1I6SQSe4_4vkQ3xWg?pwd=0hro
提取码:0hro
2022.5.21-构建工具实践-code

初始化一个springboot项目 https://start.spring.io/ (也可以下载一个ide)
如果打不开也可以使用:https://start.aliyun.com/bootstrap.html
后端:
目前Java用的最多的就是Maven了;
Gradle的性能比Maven是要强一些;(有时候,安卓打包也会用到这个Gradle)
现在基本很少用Ant了,新项目用的是Gradle;
前端:
nodeJs工具:react,vue
官网:http://maven.apache.org/download.cgi
Maven是一个项目的构建依赖管理工具。通常项目的根目录会存在一个pom.xml文件(该文件用于定义项目的依赖包信息和构建配置)
🍀 在调流水线的时候,遇到很多Maven构建失败的问题。大家都去找Jenkins的问题,但最后发现是Maven这个工具出现了一些问题(使用时可能参数调错了)。Maven在构建代码的时候,经常会出现构建失败,编译不通过现象。Maven跑测试的时候也可能会报错。这个和你的项目也可能有关系,比如你项目的类找不到了,那可能也会报错了。也就是说,后续在排错时,不仅要考虑工具问题,也要考虑代码本身层面的因素。
一个spring boot项目其实有很多依赖。
| 💘 实践:maven构建流水线(测试成功)-2022.5.18 |
生成一个标准的maven项目:

🍂 自己实际配置过程:
下载代码包
打开链接:
如果打不开也可以使用:https://start.aliyun.com/bootstrap.html

按如下进行配置:

选择一个spring web组件,再添加一个spring mvc示例:


配置完成后,下载代码:

代码下载完成 后,可以用vscode打开,看下项目代码结构:

🍂 (1)安装maven
本次在gitlanci-runner上下载maven:(后面的环境为gitlab runner和jenkins agent都在一台机器上)
先在上面安装好java环境
如何安装java,请查看我的另一篇文章!
[[02 实战:linux下jdk环境安装(二进制包方式)-泽阳-2022.4.16(博客分享)]]

https://blog.csdn.net/weixin_39246554/article/details/124221560

###下载代码
[root@gitlab-runner ~]#wget https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.8.5/binaries/apache-maven-3.8.5-bin.zip --no-check-certificate
[root@gitlab-runner ~]#ll -h apache-maven-3.8.5-bin.zip
-rw-r--r-- 1 root root 8.4M Mar 5 23:51 apache-maven-3.8.5-bin.zip
[root@gitlab-runner ~]#unzip apache-maven-3.8.5-bin.zip
[root@gitlab-runner ~]#mv apache-maven-3.8.5 /usr/local/
[root@gitlab-runner ~]#cd /usr/local/apache-maven-3.8.5/
[root@gitlab-runner apache-maven-3.8.5]#pwd
/usr/local/apache-maven-3.8.5
###配置环境
[root@gitlab-runner apache-maven-3.8.5]#vim /etc/profile
……
export M2_HOME=/usr/local/apache-maven-3.8.5
export PATH=$M2_HOME/bin:$PATH
[root@gitlab-runner apache-maven-3.8.5]#source /etc/profile
###验证
[root@gitlab-runner apache-maven-3.8.5]#mvn -v
Apache Maven 3.8.5 (3599d3414f046de2324203b78ddcf9b5e4388aa0)
Maven home: /usr/local/apache-maven-3.8.5
Java version: 1.8.0_322, vendor: Temurin, runtime: /usr/local/jdk8u322-b06/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-957.el7.x86_64", arch: "amd64", family: "unix"
🍀 注意:这里容易混淆的一点是,pom.xml和maven里settings.xml之间的关系:

1.项目的根目录会存在一个pom.xml文件:(该文件用于定义项目的依赖包信息和构建配置);
2.maven软件包里的settings.xml:是管理maven的;(后期会该改个配置文件)
(2)将代码上传到gitlab
本次新建一个项目
名称叫:devops4-maven-service:

在本地git端将项目代码上传到刚才创建的项目里:

hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/demo/demo
$ pwd
/c/Users/hg/Desktop/demo/demo
hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/demo/demo
$ ls
HELP.md README.md mvnw* mvnw.cmd pom.xml src/
###初始化仓库
hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/demo/demo
$ git init
Initialized empty Git repository in C:/Users/hg/Desktop/demo/demo/.git/
hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/demo/demo (master)
$ git remote add origin http://172.29.9.101/devops4/devops4-maven-service.git
hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/demo/demo (master)
$ git add .
hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/demo/demo (master)
$ git commit -m "Initial commit"
#推送代码到仓库
hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/demo/demo (master)
$ git push -u origin master #以master分支推送

配置阿里maven源 、 本地仓库;(配置方法见下面部分!)
🍀 源课件内容:
stage("build"){
steps {
script{
sh "mvn clean package"
}
}
}
更加严谨的方式:使用绝对路径
def buildTools = ["maven": "/usr/local/apache-maven-3.8.1"]
pipeline {
agent { label "build" }
stages {
stage("GetCode"){
steps{
script{
println("下载代码 --> 分支: ${env.branchName}")
checkout([$class: 'GitSCM', branches: [[name: "${env.branchName}"]],
extensions: [],
userRemoteConfigs: [[credentialsId: 'b874381c-20e9-4578-be9d-f1f691c25b23',
url: "${env.gitHttpURL}"]]])
}
}
}
stage("Build"){
steps {
script {
//sh "/usr/local/apache-maven-3.8.1/bin/mvn clean package"
sh "${buildTools["maven"]}/bin/mvn clean package"
}
}
}
stage("UnitTest"){
steps{
script{
sh "${buildTools["maven"]}/bin/mvn test"
}
}
post {
success {
script{
junit 'target/surefire-reports/*.xml'
}
}
}
}
}
post {
always {
script{
echo "always......"
}
}
success {
script {
echo "success....."
}
}
}
}
def EmailUser(userEmail,status){
emailext body: """
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0">
<img src="http://192.168.1.200:8080/static/0eef74bf/images/headshot.png">
<table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
<tr>
<td><br />
<b><font color="#0B610B">构建信息</font></b>
</td>
</tr>
<tr>
<td>
<ul>
<li>项目名称:${JOB_NAME}</li>
<li>构建编号:${BUILD_ID}</li>
<li>构建状态: ${status} </li>
<li>项目地址:<a href="${BUILD_URL}">${BUILD_URL}</a></li>
<li>构建日志:<a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
</ul>
</td>
</tr>
<tr>
</table>
</body>
</html> """,
subject: "Jenkins-${JOB_NAME}项目构建信息 ",
to: userEmail
}
pipeline {
agent {
label "build"
}
parameters {
string defaultValue: 'http://192.168.1.200/devops4/devops4-maven-service.git', name: 'srcUrl'
string defaultValue: 'master', name: 'branchName'
}
stages{
stage('CheckOut') {
steps {
script{
checkout([$class: 'GitSCM',
branches: [[name: "${params.branchName}"]],
extensions: [],
userRemoteConfigs: [[credentialsId: '62a3150f-38f8-4c9d-9334-79072b1d75cc',
url: "${params.srcUrl}"]]])
}
}
}
stage("Build"){
steps {
script {
//sh "/data/devops4/tools/apache-maven-3.8.5/bin/mvn clean package "
sh "/data/devops4/tools/gradle-7.4.2/bin/gradle build"
}
}
}
}
}
🍂 自己实践过程:
新创建一个流水线:
名称和gitlab上项目名称一样:devops4-maven-service

这里直接写流水线,代码可以用上节课的代码:
生成并编写代码:


pipeline {
agent {
label "build"
}
parameters {
string defaultValue: 'http://172.29.9.101/devops4/devops4-maven-service.git', name: 'srcUrl', trim: true
string defaultValue: 'master', name: 'branchName', trim: true
}
stages {
stage('CheckOut') {
steps {
script {
checkout([$class: 'GitSCM',
branches: [[name: "${params.branchName}"]],
extensions: [],
userRemoteConfigs: [[credentialsId: '54df701e-d369-4f69-85c6-7209d45c283b',
url: "${params.srcUrl}"]]])
}
}
}
}
}

构建流水线:

可以看到,构建成功。
继续编写代码:
把打包命令放进去:
注意下:因为是在jenkins的slave节点构建的,因此salve节点也要安装maven工具的!(安装方法见上文)

运行查看构建效果:
pipeline {
agent {
label "build"
}
parameters {
string defaultValue: 'http://172.29.9.101/devops4/devops4-maven-service.git', name: 'srcUrl', trim: true
string defaultValue: 'master', name: 'branchName', trim: true
}
stages {
stage('CheckOut') {
steps {
script {
checkout([$class: 'GitSCM',
branches: [[name: "${params.branchName}"]],
extensions: [],
userRemoteConfigs: [[credentialsId: '54df701e-d369-4f69-85c6-7209d45c283b',
url: "${params.srcUrl}"]]])
}
}
}
stage('Build') {
steps {
script {
sh "mvn clean package"
}
}
}
}
}


奇怪,为什么这里报没mvn命令呢?
pipeline {
agent {
label "build"
}
parameters {
string defaultValue: 'http://172.29.9.101/devops4/devops4-maven-service.git', name: 'srcUrl', trim: true
string defaultValue: 'master', name: 'branchName', trim: true
}
stages {
stage('CheckOut') {
steps {
script {
checkout([$class: 'GitSCM',
branches: [[name: "${params.branchName}"]],
extensions: [],
userRemoteConfigs: [[credentialsId: '54df701e-d369-4f69-85c6-7209d45c283b',
url: "${params.srcUrl}"]]])
}
}
}
stage('Build') {
steps {
script {
sh "/usr/local/apache-maven-3.8.5/bin/mvn clean package"
}
}
}
}
}

再次运行流水线,观察效果:
发现此时,mvn打包就是从官网拉取依赖包了,很慢的:


我们可以进到构建目录看下效果:
[root@devops ~]#cd /opt/jenkins/workspace/devops4-maven-service
[root@devops devops4-maven-service]#ls
mvnw mvnw.cmd pom.xml README.md src target
[root@devops devops4-maven-service]#ls target/
classes generated-sources generated-test-sources maven-status test-classes #target目录下应该有个jar包的,但是本次侯建失败了就没看到
[root@devops devops4-maven-service]#ls ~/.m2/
repository #mvn构建时产生的缓存
[root@devops devops4-maven-service]#ls ~/.m2/repository/
backport-util-concurrent ch classworlds com commons-cli commons-io io jakarta junit net org

<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
开始配置:
[root@devops devops4-maven-service]#which mvn
/usr/local/apache-maven-3.8.5/bin/mvn
[root@devops devops4-maven-service]#cd /usr/local/apache-maven-3.8.5
[root@devops apache-maven-3.8.5]#ls
bin boot conf lib LICENSE NOTICE README.txt
[root@devops apache-maven-3.8.5]#cd conf/
[root@devops conf]#ls
logging settings.xml toolchains.xml
[root@devops conf]#vim settings.xml
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>



可以看到产生了一个jar包:

构建成功。
因此:强烈推荐使用mvn的完整路径!


stages:
- build
- test
variables:
GIT_CHECKOUT: "false"
RUNNER_TAG: "maven"
pipelineInit:
stage: .pre
tags:
- "${RUNNER_TAG}"
variables:
GIT_CHECKOUT: "true"
script:
- ls -l
cibuild:
tags:
- "${RUNNER_TAG}"
stage: build
script:
- /usr/local/apache-maven-3.8.5/bin/mvn clean package
citest1:
tags:
- "${RUNNER_TAG}"
stage: test
script:
- /usr/local/apache-maven-3.8.5/bin/mvn test

确认下runner上有maven标签:

因为前面jenkins的slave节点和gitlabci-runner不是同一个节点,因此这里还需要把maven环境的源修改为阿里源,然后构建:
修改方法见jenkins构建部分:



可以看到,能够成功构建了。


这次构建就没有下载包了,速度很快,这是因为使用了maven缓存:

注意:gitlabCI-runner的用户是gitlab-runner,因此缓存位置要清楚。
🍀 配置maven全局缓存:
[root@gitlab-runner ~]#mkdir -p /data/maven_build_cache
[root@gitlab-runner ~]#mv /home/gitlab-runner/.m2/repository/* /data/maven_build_cache/
[root@gitlab-runner ~]#vim /usr/local/apache-maven-3.8.5/conf/settings.xml
……
<localRepository>/data/maven_build_cache</localRepository>



可以看到,配置的全局缓存起作用了:

测试完成。😘
| 💘 实践:gradle构建流水线(测试成功)-2022.5.18 |
注意:同一个项目用gradle要比maven构建时间要快一些!
初始化一个springboot项目 https://start.spring.io/ (也可以下载一个ide)
如果打不开也可以使用:https://start.aliyun.com/bootstrap.html

devops4-gradle-service
devops4-gradle-service仓库里:hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/gradle/demo
$ pwd
/c/Users/hg/Desktop/gradle/demo
hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/gradle/demo
$ ls
HELP.md build.gradle gradle/ gradlew* gradlew.bat settings.gradle src/
hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/gradle/demo
$ git init
Initialized empty Git repository in C:/Users/hg/Desktop/gradle/demo/.git/
hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/gradle/demo (master)
$ git remote add origin http://172.29.9.101/devops4/devops4-gradle-service.git
hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/gradle/demo (master)
$ git add .
hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/gradle/demo (master)
$ git commit -m "Initial commit"
hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/gradle/demo (master)
$ git push origin master
Username for 'http://172.29.9.101': root
Counting objects: 26, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (26/26), 59.36 KiB | 4.24 MiB/s, done.
Total 26 (delta 0), reused 0 (delta 0)
To http://172.29.9.101/devops4/devops4-gradle-service.git
* [new branch] master -> master
上传完成后到gitlab查看:

下载gradle安装包:
https://gradle.org/releases/

直接下载即可。
配置gradle环境:
因为本人jenkins slave节点和gitlabci-runner节点是2台机器,这里如下配置都要在其上面配置:(以下只展示在jenkins slave节点上的配置过程)
#将安装包上传到linux服务器:
[root@devops ~]#ll -h gradle-7.4.2-bin.zip
-rw-r--r-- 1 root root 111M May 18 16:42 gradle-7.4.2-bin.zip
[root@devops ~]#unzip gradle-7.4.2-bin.zip -d /usr/local/
#配置:
[root@devops ~]#vim /etc/profile
……
export GRADLE_HOME=/usr/local/gradle-7.4.2/
export PATH=$GRADLE_HOME/bin:$PATH
[root@devops ~]#source /etc/profile
#验证:
[root@devops ~]#gradle -v
------------------------------------------------------------
Gradle 7.4.2
------------------------------------------------------------
Build time: 2022-03-31 15:25:29 UTC
Revision: 540473b8118064efcc264694cbcaa4b677f61041
Kotlin: 1.5.31
Groovy: 3.0.9
Ant: Apache Ant(TM) version 1.10.11 compiled on July 10 2021
JVM: 1.8.0_322 (Temurin 25.322-b06)
OS: Linux 3.10.0-957.el7.x86_64 amd64
🍂 老师源代码:
stage("build"){
steps{
script {
sh "gradle clean && gradle build "
}
}
}
pipeline {
agent {
label "build"
}
parameters {
string defaultValue: 'http://192.168.1.200/devops4/devops4-gradle-service.git', name: 'srcUrl'
string defaultValue: 'master', name: 'branchName'
}
stages{
stage('CheckOut') {
steps {
script{
}
}
}
stage("Build"){
steps {
script {
//sh "/data/devops4/tools/apache-maven-3.8.5/bin/mvn clean package "
sh "/data/devops4/tools/gradle-7.4.2/bin/gradle build"
}
}
}
}
}
🍂 自己实际测试过程:
jenkins上创建一个流水线:devops4-gradle-service

这里修改下gradle里的镜像源地址为阿里的:
https://developer.aliyun.com/mirror/maven?spm=a2c6h.13651102.0.0.14df1b11toLu0x

allprojects {
repositories {
maven { url 'https://maven.aliyun.com/repository/public/' }
mavenLocal()
mavenCentral()
}
}
本次直接在gitlab上gradle项目的gradle.build文件里配置即可:

然后提交。
pipeline {
agent {
label "build"
}
parameters {
string defaultValue: 'http://172.29.9.101/devops4/devops4-gradle-service.git', name: 'srcUrl', trim: true
string defaultValue: 'master', name: 'branchName', trim: true
}
stages {
stage('CheckOut') {
steps {
script {
checkout([$class: 'GitSCM',
branches: [[name: "${params.branchName}"]],
extensions: [],
userRemoteConfigs: [[credentialsId: '54df701e-d369-4f69-85c6-7209d45c283b',
url: "${params.srcUrl}"]]])
}
}
}
stage('Build') {
steps {
script {
// sh "/usr/local/apache-maven-3.8.5/bin/mvn clean package"
sh "/usr/local/gradle-7.4.2/bin/gradle build"
}
}
}
}
}


gradle的tag:

stages:
- build
- test
variables:
GIT_CHECKOUT: "false"
RUNNER_TAG: "gradle"
pipelineInit:
stage: .pre
tags:
- "${RUNNER_TAG}"
variables:
GIT_CHECKOUT: "true"
script:
- ls -l
cibuild:
tags:
- "${RUNNER_TAG}"
stage: build
script:
- /usr/local/gradle-7.4.2/bin/gradle build


能够看到,构建成功了。
官网:https://ant.apache.org/bindownload.cgi Ant现在用的比较少了,也是一个项目构建依赖管理工具,使用xml的文件保存配置(build.xml)
安装配置:
wget
tar
export
export
source
ant -version
常用命令:
ant
ant -f ../build.xml
Jenkins集成:
stage("build"){
steps{
script {
sh "ant -f build.xml"
}
}
}
🍀 Go配置环境
见我的另外2篇文章:
1.本地路径:
[[01 实战:windows上基于vscode的golang环境搭建(博客分享-测试成功)-kk-2022.4.28]]

[[04 实战:centos上安装Go软件(博客分享-成功测试)-kk-2022.5.18]]

2.csdn路径:
https://blog.csdn.net/weixin_39246554/article/details/124495828
https://blog.csdn.net/weixin_39246554/article/details/124507926


| 💘 实践:Go项目构建流水线(测试成功)-2022.5.19 |
import (
“fmt”
)
func main() {
fmt.Println(“hello world!”)
}
推送过程:
```bash
hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/golang/demo
$ pwd
/c/Users/hg/Desktop/golang/demo
hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/golang/demo
$ ls
demo.go
hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/golang/demo
$ git init
Initialized empty Git repository in C:/Users/hg/Desktop/golang/demo/.git/
hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/golang/demo (master)
$ git add .
hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/golang/demo (master)
$ git commit -am"init commit"
[master (root-commit) 900a326] init commit
1 file changed, 9 insertions(+)
create mode 100644 demo.go
hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/golang/demo (master)
$ git remote add origin http://172.29.9.101/devops4/devops4-golang-service.git
hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/golang/demo (master)
$ git push origin master
Username for 'http://172.29.9.101': root
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 273 bytes | 136.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To http://172.29.9.101/devops4/devops4-golang-service.git
* [new branch] master -> master
hg@LAPTOP-G8TUFE0T MINGW64 ~/Desktop/golang/demo (master)
在gitlab上查看:

jenkins上新建一个叫做devops4-golang-service的流水线:

编写jenkinsfile流水线:

完整代码:
pipeline {
agent {
label "build"
}
parameters {
string defaultValue: 'http://172.29.9.101/devops4/devops4-golang-service.git', name: 'srcUrl', trim: true
string defaultValue: 'master', name: 'branchName', trim: true
}
stages {
stage('CheckOut') {
steps {
script {
checkout([$class: 'GitSCM',
branches: [[name: "${params.branchName}"]],
extensions: [],
userRemoteConfigs: [[credentialsId: '54df701e-d369-4f69-85c6-7209d45c283b',
url: "${params.srcUrl}"]]])
}
}
}
stage('Build') {
steps {
script {
sh "/usr/local/go/bin/go build demo.go"
}
}
}
}
}


🍀 gitlabCI集成
在gitlab上新建一个.gitlab-ci.yml文件,并编写代码,提交测试:

完整代码:
stages:
- build
- test
variables:
GIT_CHECKOUT: "false"
RUNNER_TAG: "go"
pipelineInit:
stage: .pre
tags:
- "${RUNNER_TAG}"
variables:
GIT_CHECKOUT: "true"
script:
- ls -l
cibuild:
tags:
- "${RUNNER_TAG}"
stage: build
script:
- /usr/local/go/bin/go build demo.go
提交后观看效果:

测试结束。😘
| 💘 实践:npm项目构建流水线(测试成功)-2022.5.19 |
(2)配置
[root@devops ~]#tar xf node-v16.15.0-linux-x64.tar.gz -C /usr/local/
[root@devops ~]#vim /etc/profile
……
export NODE_HOME=/usr/local/node-v16.15.0-linux-x64
export PATH=
N
O
D
E
H
O
M
E
/
b
i
n
:
NODE_HOME/bin:
NODEHOME/bin:PATH
[root@devops ~]#source /etc/profile
(3)验证
[root@devops ~]#npm -v
8.5.5
#### 2.项目生成
💧 老师源代码:
通过下面的命令,初始化一个vue项目:
```bash
# npm install -g vue-cli
+ vue@2.6.12
added 1 package from 1 contributor in 3.342s
# vue-init webpack vuedemo
? Project name vuedemo
? Project description A Vue.js project
? Author adminuser <2560350642@qq.com>
? Vue build standalone
? Install vue-router? No
? Use ESLint to lint your code? No
? Set up unit tests No
? Setup e2e tests with Nightwatch? No
? Should we run `npm install` for you after the project has been created? (recommended) npm
vue-cli · Generated "vuedemo".
💧 自己测试过程:
[root@devops ~]#mkdir npm
[root@devops ~]#cd npm/
[root@devops npm]#npm install -g vue-cli
[root@devops npm]#vue-init webpack vuedemo


devops4-npm-ui工程:
[root@devops vuedemo]#git config --global user.email "2675263825@qq.com"
[root@devops vuedemo]#git config --global user.name "hg"
[root@devops npm]#cd vuedemo/
[root@devops vuedemo]#ls
build config index.html node_modules package.json package-lock.json README.md src static
[root@devops vuedemo]#git init
Initialized empty Git repository in /root/npm/vuedemo/.git/
[root@devops vuedemo]#git remote add origin http://172.29.9.101/devops4/devops4-npm-ui.git
[root@devops vuedemo]#git add .
[root@devops vuedemo]#git commit -m "Initial commit"
[root@devops vuedemo]#git push origin master
Username for 'http://172.29.9.101': root
Password for 'http://root@172.29.9.101':
Counting objects: 31, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (27/27), done.
Writing objects: 100% (31/31), 211.92 KiB | 0 bytes/s, done.
Total 31 (delta 0), reused 0 (delta 0)
To http://172.29.9.101/devops4/devops4-npm-ui.git
* [new branch] master -> master
来到gitlab上查看代码:

npm install <moduleName> -g 包安装到全局
npm list:查看当前已安装的包。
npm config set registry https://registry.npm.taobao.org 设置淘宝源
npm config set cache "/opt/npmcache/" 设置缓存路径
💧 注意:淘宝npm源不维护了(本次使用默认源就好)

💧 Jenkins集成
来到jenkins,创建一个devops4-npm-ui项目,编写jenkins流水线代码,运行并观察效果:
代码:
pipeline {
agent {
label "build"
}
parameters {
string defaultValue: 'http://172.29.9.101/devops4/devops4-npm-ui.git', name: 'srcUrl', trim: true
string defaultValue: 'master', name: 'branchName', trim: true
}
stages {
stage('CheckOut') {
steps {
script {
checkout([$class: 'GitSCM',
branches: [[name: "${params.branchName}"]],
extensions: [],
userRemoteConfigs: [[credentialsId: '54df701e-d369-4f69-85c6-7209d45c283b',
url: "${params.srcUrl}"]]])
}
}
}
stage('Build') {
steps {
script {
// sh "/usr/local/apache-maven-3.8.5/bin/mvn clean package"
sh "/usr/local/node-v16.15.0-linux-x64/bin/npm install && /usr/local/node-v16.15.0-linux-x64/bin/npm run build"
}
}
}
}
}
构建并观察效果:


💧 GitlabCI集成
创建一个gitlab-ci.yml文件,编写代码,提交并观察效果:

stages:
- build
- test
variables:
GIT_CHECKOUT: "false"
RUNNER_TAG: "build"
pipelineInit:
stage: .pre
tags:
- "${RUNNER_TAG}"
variables:
GIT_CHECKOUT: "true"
script:
- ls -l
cibuild:
tags:
- "${RUNNER_TAG}"
stage: build
script:
- /usr/local/node-v16.15.0-linux-x64/bin/npm install
- /usr/local/node-v16.15.0-linux-x64/bin/npm run build
以上代码构建后可能存在问题:

因此这里方便演示,将tag改为npm,然后再次提交构建,观察效果:

stages:
- build
- test
variables:
GIT_CHECKOUT: "false"
RUNNER_TAG: "npm"
pipelineInit:
stage: .pre
tags:
- "${RUNNER_TAG}"
variables:
GIT_CHECKOUT: "true"
script:
- ls -l
cibuild:
tags:
- "${RUNNER_TAG}"
stage: build
script:
- /usr/local/node-v16.15.0-linux-x64/bin/npm install
- /usr/local/node-v16.15.0-linux-x64/bin/npm run build

可以看到,流水线构建成功。
yarn,facebook取代npm的包管理工具,速度快。Yarn 缓存包,无需重复下载。 并行下载,安装速度快。

npm install -g yarn
yarn info
代码:
yarn config set registry https://registry.npm.taobao.org
yarn config set sass_binary_site "https://npm.taobao.org/mirrors/node-sass/"
注意:本次yarn流水线集成部分省略,都一样。
| 💘 实践:Jenkins共享库封装(测试成功)-2022.5.20 |
1、创建共享库
2、配置共享库
3、创建作业核进行调试
在jenkins上创建一个devops4的视图:

然后,接下来这个devops4下的所有项目统一由一个Jenkinsfile来管理:

在gitlab创建一个叫做devops4-jenkinslib-service的项目:

创建它的目录结构:
把这个项目用wed ide打开:
创建src/org/devops目录:
创建Jenksfile文件:
具体目录结构如下:


// 下载代码
package org.devops
def GetCode(srcUrl, branchName){
checkout([$class: 'GitSCM',
branches: [[name: branchName]],
extensions: [],
userRemoteConfigs: [[credentialsId: '54df701e-d369-4f69-85c6-7209d45c283b',
url: srcUrl]]])
}
注意:这里的凭据是gitlab代码仓库里的gitlab账号信息,然后通过jenkins代码生成器生成的,最后是写在代码里的!

package org.devops
def MavenBuild(){
sh "/usr/local/apache-maven-3.8.5/bin/mvn clean package"
}
def GradleBuild(){
sh "/usr/local/gradle-7.4.2/bin/gradle build"
}
def NpmBuild(){
sh "/usr/local/node-v16.15.0-linux-x64/bin/npm install && /usr/local/node-v16.15.0-linux-x64/bin/npm run build"
}
def YarnBuild(){
sh "yarn"
}
def CodeBuild(type){
switch(type){
case "maven":
MavenBuild()
break;
case "gradle":
GradleBuild()
break;
case "npm":
NpmBuild()
break;
case "yarn":
YarnBuild()
break;
default:
error "No such tools ... [maven/ant/gradle/npm/yarn/go]"
break
}
}
package org.devops
//Maven
def MavenTest(){
sh "mvn test "
junit 'target/surefire-reports/*.xml'
}
//Gradle
def GradleTest(){
sh "gradle test"
junit 'build/test-results/test/*.xml'
}
//Ant
//def AntBuild(configPath="./build.xml"){
// sh "ant -f ${configPath}"
//}
//Golang
def GoTest(){
sh " go test"
}
//Npm
def NpmTest(){
sh "npm test"
}
//Yarn
def YarnTest(){
sh "yarn test "
}
//Main
def CodeTest(type){
switch(type){
case "maven":
MavenTest()
break;
case "gradle":
GradleTest()
break;
default:
println("No such tools ... [maven/ant/gradle/npm/yarn/go]")
break
}
}
此时库文件都创建好了,现在就剩编写Jenkinsfile了:



因为之前跑过流水线,所以这个job里已经存在配置了,没的话要自己添加下!
我们找一个规律吧:


进行如下配置:


最终Jenkinsfile完整代码如下:
@Library("mylib@main") _ //加载共享库
import org.devops.* // 导入库
def checkout = new Checkout() //New实例化
def build = new Build()
def unittest = new UnitTest()
env.buildType = "${JOB_NAME}".split("-")[1]
//流水线
pipeline {
agent { label "build" }
options {
skipDefaultCheckout true
}
stages{
stage("Checkout"){
steps{
script {
println("GetCode")
checkout.GetCode("${env.srcUrl}", "${env.branchName}")
}
}
}
stage("Build"){
steps{
script{
println("Build")
build.CodeBuild("${env.buildType}")
}
}
}
stage("UnitTest"){
steps{
script{
unittest.CodeTest("${env.buildType}")
}
}
}
}
}
进行提交一下:
复制一下这个仓库的链接:
http://172.29.9.101/devops4/devops4-jenkinslib-service.git
进入Jenkins 设置, 定义共享库名称 mylib 默认的版本 main 。设置共享库的Git地址 [http://192.168.1.200/devops4/devops4-jenkinslib-service.git](http://192.168.1.200/devops02/jenkinslib.git) , 设置共享库的凭据。(如果没有提前创建好凭据,需要先去创建好然后再重新配置这个页面。)
全局配置那里,搜索下share:

注意:这里的仓库地址就是jenkins共享库的地址!

这里也是要加一个凭据的:凭据就是gitlab的账号!(gitlab共享库账号)



注意:一般要求job name要有一定的规范,如果不规范的话,就要在这里的jenkins ui里添加 一个类型或命令:(是后面那种情况)

开始构建:

观察现象:

可以看到是构建是已经成功了,但是提示没有测试报告,我们来看下原因:


发现target目录真没有这个文件,这里直接把测试部分注销掉,然后再次提交,并再次构建,观察效果:

构建成功:







此时就出现了参数化构建选项了:

这里总还是很奇怪,需要改进下:
因为根据项目名称去命名基本是不可能的:
先来配置下jenkins的这个gradle项目,添加一个选项参数:

再来修改下代码:
这里的代码直接不用了:

修改完,提交就好:

此时,已gradle项目为例,进行构建:

可以看到,构建成功:


🍀 我们来看更加灵活的一种解决方法:
现在还有一个问题就是:
当你的构建参数比较多的时候,开发要执行的命令不规范,比如我再构建之前要执行一些其他的命令:
此时,我们该怎么办呢?
我们给开发一个shell命令,他自己去写:
你想怎么打包就怎么打包,你自己写:
但是,此时我们的平台就要有个命令的检查机制了:
例如:他来一个rm命令,虽然也没事儿,但可能也会把构建节点给搞坏了!
如果是容器也没啥问题:
这种方式就非常灵活了:
本次gradle这里就改为gradle build

再到gitlab上修改下代码:

比这个要灵活很多了:

如下环境:
平台提供了一个流水线的能力,去创建流水线是开发的同事去创建的,他会去选一些参数,例如构建类型,打包命令是什么,都是由开发同事去填的。填完之后会对应的在jenkins上生成这样一个job,最后devops平台在点构建的时候,它无非也是调用jenkins去构建的。
可以看到gradel项目构建成功:

最后,也把maven项目按如上方法改造下:

最终完整的Jenkinsfile文件:
@Library("mylib@main") _ //加载共享库
import org.devops.* // 导入库
def checkout = new Checkout() //New实例化
def build = new Build()
def unittest = new UnitTest()
//env.buildType = "${JOB_NAME}".split("-")[1]
//流水线
pipeline {
agent { label "build" }
options {
skipDefaultCheckout true
}
stages{
stage("Checkout"){
steps{
script {
println("GetCode")
checkout.GetCode("${env.srcUrl}", "${env.branchName}")
}
}
}
stage("Build"){
steps{
script{
println("Build")
//build.CodeBuild("${env.buildType}")
sh "${env.buildShell}"
}
}
}
/*stage("UnitTest"){
steps{
script{
unittest.CodeTest("${env.buildType}")
}
}
}*/
}
}
测试结束。😘
| 💘 实践:GitLab模板库(测试成功)-2022.5.20 |
jobs/CI.yaml
.pipelineInit:
tags:
- "${RUNNER_TAG}"
stage: .pre
variables:
GIT_CHECKOUT: "true" ##局部开启作业的代码下载
script:
- ls -l
.cibuild:
tags:
- "${RUNNER_TAG}"
stage: build
script:
- echo "${BUILD_SHELL}"
- ${BUILD_SHELL}
artifacts:
paths:
- ${ARTIFACT_PATH}
.citest:
tags:
- "${RUNNER_TAG}"
stage: test
script:
- echo "${TEST_SHELL}"
- ${TEST_SHELL}
artifacts:
reports:
junit: ${TEST_REPORTS}
gitlabci.yaml
include:
- project: 'devops4/devops4-gitlablib-service'
ref: main
file:
- '/jobs/CI.yaml'
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "web"
when: always
- if: $CI_COMMIT_BEFORE_SHA == "0000000000000000000000000000000000000000"
when: never
- when: always
variables:
GIT_CHECKOUT: "false" ## 全局关闭作业代码下载
BUILD_SHELL: "sh -x build.sh" ## 构建命令
# TEST_SHELL: "mvn test " ## 测试命令
# ARTIFACT_PATH: "target/*jar" ## 制品路径
# TEST_REPORTS: "target/surefire-reports/TEST-*.xml" ##测试报告
RUNNER_TAG: "builder"
stages:
- build
- test
pipelineInit:
extends:
- .pipelineInit
cibuild:
extends:
- .cibuild

打开gitlab-ci.yml文件的raw格式:
http://172.29.9.101/devops4/devops4-gitlablib-service/-/raw/main/.gitlab-ci.yml
但是:注意,这个项目必须是公开的,因为它不支持认证访问!

这里用maven项目测试:




测试结束。😘
https://mp.weixin.qq.com/s/ZgvPsHFRCgDogZDDCNHAGQ

我的博客主旨:






好了,关于本次就到这里了,感谢大家阅读,最后贴上我女神的photo,祝大家生活快乐,每天都过的有意义哦,我们下期见!
