jenkins的前提是要有10个G的内存,磁盘40GB 否则会报错
如果出现访问不了,或者ssh超时,重启下虚拟机,重启docker,关闭防火墙,配置防火墙端口
docker安装gitlab_我是一只代码狗的博客-CSDN博客
安装maven
cd /usr/local
wget https://dlcdn.apache.org/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz
tar zxvf apache-maven-3.8.6-bin.tar.gz
mv apache-maven-3.8.6 maven
cd /usr/local/maven/conf
vi settings.xml
配置阿里云
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
安装jdk
下载jdk
https://www.oracle.com/java/technologies/downloads/#java8
cd /usr/local
tar zxvf jdk-8u341-linux-x64.tar.gz
mv jdk1.8.0_341 jdk
删除压缩包
rm -f jdk-8u341-linux-x64.tar.gz
rm -f apache-maven-3.8.6-bin.tar.gz
删除之前的jenkins,并且创建新的jenkins授权
rm -rf /var/jenkins/
docker rm -f jenkins
mkdir -p /var/jenkins/
chmod -R 777 /var/jenkins/
挂载jdk,和maven,jenkins的目录,并且启动jenkins
docker run -p 8080:8080 --name jenkins \
--restart=always \
-v /var/jenkins/:/var/jenkins_home/ \
-v /usr/local/jdk:/usr/local/jdk \
-v /usr/local/maven:/usr/local/maven \
-e JENKINS_UC=https://mirrors.cloud.tencent.com/jenkins/ \
-e JENKINS_UC_DOWNLOAD=https://mirrors.cloud.tencent.com/jenkins/ \
-d jenkins/jenkins:lts
浏览器输入
192.168.184.136:8080
查看密码
docker logs -f jenkins
拿到这个密码
放入这里
然后选择安装推荐的插件下一步
用户名密码都是root
安装插件
安装这2个插件
选中,重启jenkins
配置挂载的jdk和maven目录
保存,应用
进入系统配置
拉倒最后,找到Ssh Servers ,输入其他服务器的信息
username就是其他服务器的账号,password就是其他服务的密码
在高级选项有密码
新建任务
git的项目地址,就是一进来你的项目路径,不要.git后缀
http://192.168.184.136:8090/root/test
分支选dev
git这里要注意,分支下面不能有项目名字,否则不能打包
然后构建 打包命令
sh /usr/local/maven/bin/mvn package
然后再构建后操作,选择下面的选项
target/*.jar
先杀掉进程,在后台启动 并退出nohup
ps -ef | grep demo3-0.0.1-SNAPSHOT.jar | grep -v grep |awk '{print $2}' | xargs kill -9
nohup java -jar /usr/local/target/demo3-0.0.1-SNAPSHOT.jar & sleep 1
然后应用 保存
立即构建
也可以点击,任务选择箭头 选择控制台输出 看详情
出现这样就表示构建成功
我们输入另一台机器的ip端口和接口访问,就可以看到数据了
http://192.168.184.132:9003/aa
我们进入另一台机器,看一下他的目录,有了发版后的数据了
接下来我们在项目中添加Dockerfile文件
FROM openjdk:8-slim
WORKDIR /usr/local
COPY demo3-0.0.1-SNAPSHOT.jar .
CMD java -jar demo3-0.0.1-SNAPSHOT.jar
然后在jenkins项目中重新配置
在构建后操作,这里重新配置,使得target目录下的jar和docker目录下的Dockerfile文件
在同一个目录,并且删除调target和docker文件夹,以前配置的target的exec command里面的数据要删除掉
我们在docker下面的exec command输入,docker构建删除并且启动的命令
docker build -t mydemo3:0.1 /usr/local
docker rm -f demo3
docker run -d -p 9003:9003 --name demo3 mydemo3:0.1
前提是在另一台服务器要安装好docker
然后点击应用 保存
之前的普通项目要先删除掉进程。然后点击立即构建
然后我们在另一台服务器看下,他们2个处于同一个目录了,这样我们的docker命令就好使了
再次访问
http://192.168.184.132:9003/aa
接下来我们先安装下harbor
安装好之后,我们先保证public 下的镜像仓库是空的
还要确保,我们的192.168.184.132的机器上配置过harbor仓库的地址
然后我们在jenkins的配置 修改,构建后操作
先推送到harbor,在从harbor的镜像启动
docker build -t 192.168.184.136:80/public/mydemo3:0.1 /usr/local
docker login -u admin -p Harbor12345 192.168.184.136:80
docker push 192.168.184.136:80/public/mydemo3:0.1
docker rm -f demo3
docker run -d -p 9003:9003 --name demo3 192.168.184.136:80/public/mydemo3:0.1
点击应用 保存 立即构建
然后访问,我们的微服务的接口
http://192.168.184.132:9003/aa
我们在看下harbor,已经有了数据
接下来我们在gitlab中打下标签
选择分支,写入标签名称
接下来我们在回到jenkins的配置里面
在参数化构建过程,选择Git参数
名称:tag
参数类型:标签
默认值:origin/dev
在构建这里,切换分支
git checkout $tag
sh /usr/local/maven/bin/mvn package
然后在构建后操作,将版本号都改成我们的标签
docker build -t 192.168.184.136:80/public/mydemo3:$tag /usr/local
docker login -u admin -p Harbor12345 192.168.184.136:80
docker push 192.168.184.136:80/public/mydemo3:$tag
docker rm -f demo3
docker run -d -p 9003:9003 --name demo3 192.168.184.136:80/public/mydemo3:$tag
应用 保存
选中箭头指向的位置
这里就会显示不同的版本,你可以选中最新的构建,也可以选择历史的进行回退
这个时候我们的harbor就有了新的数据了
访问我们的微服务接口,也变成新的数据了
http://192.168.184.132:9003/aa
接下来我们看下流水线的操作
新建任务,选择流水线
选择参数化构建过程
名称:tag
参数类型:标签
默认值:origin/dev
在流水线这里选择hello world
点击流水线语法
选择这里的步骤
输入仓库地址:http://192.168.184.136:8090/root/test
指定分支:$tag
然后点击生成流水线脚本,复制,然后粘贴到流水线 拉取源代码这里
然后再次选择流水线语法
选择步骤为shell script,输入打包的命令,生成流水线脚本
然后复制粘贴,到流水线的打包这里
然后再次选择流水线语法
选择步骤为sshPublisher,先连接到另一台机器上,输入发布镜像,启动容器的命令,生成流水线脚本
这里输入的内容 和我们之前的构建后操作一样
然后把流水线脚本,复制粘贴到,发布镜像,启动容器这里
完整的脚本如下
pipeline {
agent any
stages {
stage('拉取源代码') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '$tag']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.184.136:8090/root/test']]])
}
}
stage('打包') {
steps {
sh '/usr/local/maven/bin/mvn package'
}
}
stage('发布镜像,启动容器') {
steps {
sshPublisher(publishers: [sshPublisherDesc(configName: 'target-132', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '/target', sourceFiles: 'target/*.jar'), sshTransfer(cleanRemote: false, excludes: '', execCommand: '''docker build -t 192.168.184.136:80/public/mydemo3:$tag /usr/local
docker login -u admin -p Harbor12345 192.168.184.136:80
docker push 192.168.184.136:80/public/mydemo3:$tag
docker rm -f demo3
docker run -d -p 9003:9003 --name demo3 192.168.184.136:80/public/mydemo3:$tag''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '/docker', sourceFiles: 'docker/*')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
}
}
应用 保存
然后选择
在选择对应的分支 ,进行构建
如果出现了这种情况,先点击开始构建
然后再次回到这里,就出现我们的标签了
构建后就会出现这样的流水线,悬浮上去,选择logs就可以看到每一块的日志
然后可以看到,harbor对应的推送时间已经发生了变化
接下来我们在代码中,新建一个file,名字叫Jenkinsfile
把我们之前写好的流水线代码粘过来
然后提交到我们的gitlab中
我们在gitlab创建一个新的标签
然后在jenkins这里修改流水线项目的配置
把流水线脚本清空,选择scm结尾的,选择Git
输入仓库地址,分支
脚本路径就是我们创建的Jenkinsfile的文件名称要一致
然后 应用保存,选择dev-0.3的标签,构建
可以看到harbor就有了新的数据了
在浏览器输入我们的微服务接口,就变成了新的数据
http://192.168.184.132:9003/aa
接下来我们对k8s进行一些配置,先提前安装好k8s
使用kubeode快速部署k8s_我是一只代码狗的博客-CSDN博客
然后我们在代码中创建deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 2
selector:
matchLabels:
app: my-pod
template:
metadata:
labels:
app: my-pod
spec:
containers:
- name: demo3
image: 192.168.184.136:80/public/mydemo3:<TAG>
ports:
- containerPort: 9003
---
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: NodePort
ports:
- port: 9003
name: service-port
nodePort: 31000
selector:
app: my-pod
这里我们吧Deployment和Service的yaml放在了一起,然后通过3个-做分隔符
然后再镜像后面使用<TAG>做动态的版本,然后上传到gitlab中
我们在创建一个新的标签
然后我们回到jenkins的系统管理-》系统配置这里,找到Publish over SSH
添加k8s服务器的配置,选择高级输入密码
name: target-128 随便起
hostname: 192.168.184.128 k8s服务器的ip地址
username: root 登录用户
Remote Directory: /usr/local 远程文件夹,存放到k8s服务器的这个目录下
Passphrase / Password:k8s服务器的密码
点击高级会显示密码
然后点击应用 保存
然后我们重新配置下流水线的任务
在流水线语法这里,改造一下之前的推送镜像,启动容器,变成只推送镜像
命令如下
docker build -t 192.168.184.136:80/public/mydemo3:$tag /usr/local
docker login -u admin -p Harbor12345 192.168.184.136:80
docker push 192.168.184.136:80/public/mydemo3:$tag
生成流水线脚本,复制 粘贴,放入到发布镜像这里
然后我们在流水线语法这里选择k8s的服务器,就是之前我们在ssh配置的,然后生成流水线脚本
Source files:deployment.yml 就是我们在gitlab上传的那个
Exec command:就是把代码写的<TAG> 替换成在git哪里配置的$tag,就是下面的这个
然后删除之前的容器 和服务,并且创建新的容器和服务
命令如下
sed -i 's/<TAG>/$tag/' /usr/local/deployment.yml
kubectl delete deployment my-deployment
kubectl delete service my-service
kubectl apply -f /usr/local/deployment.yml
然后复制流水线脚本 到流水线语法的 启动k8s 这里面 粘贴
然后点击 应用 保存
完整的脚本如下,第1,第二步都没动过,还是之前的,只是吧第3步拆开了,然后加入了第四步
pipeline {
agent any
stages {
stage('拉取源代码') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '$tag']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.184.136:8090/root/test']]])
}
}
stage('打包') {
steps {
sh '/usr/local/maven/bin/mvn package'
}
}
stage('发布镜像') {
steps {
sshPublisher(publishers: [sshPublisherDesc(configName: 'target-132', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/usr/local', remoteDirectorySDF: false, removePrefix: '/target', sourceFiles: 'target/*.jar'), sshTransfer(cleanRemote: false, excludes: '', execCommand: '''docker build -t 192.168.184.136:80/public/mydemo3:$tag /usr/local
docker login -u admin -p Harbor12345 192.168.184.136:80
docker push 192.168.184.136:80/public/mydemo3:$tag''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/usr/local', remoteDirectorySDF: false, removePrefix: '/docker', sourceFiles: 'docker/*')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
stage('启动k8s') {
steps {
sshPublisher(publishers: [sshPublisherDesc(configName: 'target-128', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''sed -i \'s/<TAG>/$tag/\' /usr/local/deployment.yml
kubectl delete deployment my-deployment
kubectl delete service my-service
kubectl apply -f /usr/local/deployment.yml''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'deployment.yml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
}
}
然后选择我们之前创建好的标签 进行构建
然后我们去k8s的服务器看一下
cd /usr/local/
cat deployment.yml
可以看到标签已经动态更新为,0.4的版本
我们在看下harbor
我们在访问下微服务的接口,注意这里使用的是service的端口,不是微服务内部的端口
http://192.168.184.128:31000/aa
可以看到已经更新了
如果出现ssh超时,先在这里点击测试一下,那一定是你的网络有问题了,关机重启
,然后出现success表示连接上了
接下来我们在Jenkins安装Generic Webhook Trigger插件
系统管理-》插件管理
接下来,我们对流水线的任务再次配置,在构建触发器这里
选择Generic Webhook Trigger
我们先在浏览器测试下,jenkins对外暴露端口是否成功
http://JENKINS_URL/generic-webhook-trigger/invoke
这里的jenkins_url就是你的jenkins的地址
我的是
http://192.168.184.136:8080/generic-webhook-trigger/invoke
显示这个就没问题了
我们先在gitlab配置一下
在菜单-》管理员-》设置-》网络,找到外发请求,展开
然后2个选项全部选中,点击保存修改
先找到我们的项目
点击设置-》Webhooks
我们吧推送事件取消,要不然每次提交代码都会部署项目
所以我们这里选择推送标签事件,在每一次创建新的标签的时候自动发版
地址就是输入的我们之前在jenkins那个webhook的地址
http://192.168.184.136:8080/generic-webhook-trigger/invoke
令牌我们设置 123456 你可以自定义但是要和jenkins配置那边的token一样
启用ssl验证 勾选上 然后点击add webhook
然后我们回到jenkins的流水线配置这里,填写token 123456
然后再Post content parameters 点击新增
Variable:tag 和我们的git参数配置哪里一样的名字
Expression: $.ref 这里是正则表达式以ref开头的
Value filter : refs/tags/ 意思是吧这一段路径过滤掉,只保留我们的动态的标签
Default value:如果没有找到最新的标签话,我们默认发布0.1的版本 你可以自定义
JSONPath 也要选中
然后点击 应用 保存
接下来我们在gitlab新创建一个标签,看看创建标签后,jenkins会不会自动发版
可以看到自动触发了 发版
我们看下harbor
我们在看下微服务的接口,已经发生了变化
流水线webhook配置过滤是因为在参数这里会显示 refs/tags/webhook-0.6
我这里过滤了,所以就显示的只有标签,这样他才能拉取到最新的标签
否则报错,拉取不到
接下来我们基于helm结合jenkins动态发布
先提前安装好helm
然后再jenkins我们新建任务 my-helm-k8s
选择流水线,复制之前写好的流水线的任务 点击确定
可以看到 之前的这些数据都自动带过来了
然后点击流水线语法
选择ssh
选择k8s的那台机器
命令如下,卸载掉之前的安装,然后安装仓库,更新仓库,在安装xm 动态传入副本数 和标签
helm uninstall xm
helm repo add my-repo http://192.168.184.136:18080/
helm repo update
helm install xm my-repo/my-charts --set replicas=$replicas --set tag=$tag
然后生成流水线脚本,复制粘贴到启动k8s这里
然后我们在添加参数这里
选择字符参数
名称:replicas 就是之前命令那里$replicas 对应的就是这个
默认值:1 发布的副本数量
点击应用
然后新增一个Variable 变量
Variable 输入replicas
JSONPath 选中
Default value 默认 1
然后点击 应用 保存
接下来我们先把之前的my-pipiline配置的webhook停用,要不然就会自动发布2个
在Generic Webhook Trigger这里取消选中,然后应用保存
接下来我们在gitlab创建一个新的标签
我们在回到jenkins上,可以看到自动发版了
我们访问下微服务,可以看到已经变化了
接下来我们选择 Build with Parameters 可以看到分支和副本数都有了
那么我们设置副本数为3,再次构建下
然后我们回到k8s的服务器 看下效果
kubectl get deploy
kubectl get pods
可以看到副本数已经更新了
接下来我们对于charts进行优化,把charts目录做成压缩包
cd /usr/local
zip -r charts.zip /usr/local/charts
然后把压缩包下载到windows的机器上,然后解压,并把charts目录放入到我们的代码里面
然后提交到gitlab
接下来我们回到jenkins这台服务器
我们进入
cd /usr/bin
然后安装下helm
wget https://get.helm.sh/helm-v3.10.0-linux-amd64.tar.gz
tar zxvf helm-v3.10.0-linux-amd64.tar.gz
mv -f linux-amd64/helm /usr/bin
查看下helm是否安装成功
ll|grep helm
然后把宿主机的helm拷贝到jenkins容器里面去,我这里的jenkins名称就是jenkins,你也可以改成容器id
docker cp /usr/bin/helm jenkins:/usr/bin/helm
我们进入容器看一下有没有成功
docker exec -it jenkins /bin/bash
cd /usr/bin
ls|grep helm
可以看到已经存在了
然后我们退出容器,回到jenkins界面上
exit
回到我们的my-helm-k8s的配置里面
然后再流水线这里,打包下面在加一个阶段,叫helm构建和上传
然后点击流水线语法
选择shell,生成流水线脚本
这里的命令意思是,先删除原来的压缩包
curl -X DELETE http://192.168.184.136:18080/api/charts/my-charts/0.1.0
然后再生成压缩包,注意这里是./charts/my-charts
helm package ./charts/my-charts
然后再上传压缩包到chartmuseum
curl --data-binary "@my-charts-0.1.0.tgz" http://192.168.184.136:18080/api/charts
然后把流水线脚本复制,粘贴到 helm构建和上传 里面
完整的脚本如下
pipeline {
agent any
stages {
stage('拉取源代码') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '$tag']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.184.136:8090/root/test']]])
}
}
stage('打包') {
steps {
sh '/usr/local/maven/bin/mvn package'
}
}
stage('helm构建和上传') {
steps {
sh 'curl -X DELETE http://192.168.184.136:18080/api/charts/my-charts/0.1.0'
sh 'helm package ./charts/my-charts'
sh 'curl --data-binary "@my-charts-0.1.0.tgz" http://192.168.184.136:18080/api/charts'
}
}
stage('发布镜像') {
steps {
sshPublisher(publishers: [sshPublisherDesc(configName: 'target-131', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '/target', sourceFiles: 'target/*.jar'), sshTransfer(cleanRemote: false, excludes: '', execCommand: '''docker build -t 192.168.184.136:80/public/mydemo3:$tag /usr/local
docker login -u admin -p Harbor12345 192.168.184.136:80
docker push 192.168.184.136:80/public/mydemo3:$tag''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '/docker', sourceFiles: 'docker/*')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
stage('启动k8s') {
steps {
sshPublisher(publishers: [sshPublisherDesc(configName: 'target-128', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''helm uninstall xm
helm repo add my-repo http://192.168.184.136:18080/
helm repo update
helm install xm my-repo/my-charts --set replicas=$replicas --set tag=$tag''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
}
}
我们其他的stage阶段都不用动
然后点击应用 保存
接下来我们在gitlab在创建一个标签
然后我们在做一个副本的变更
在看下k8s的机器
kubectl get pods
kubectl get deploy
副本数已经发生了变化
微服务接口 也更新了
至此我们就把k8s上面的helm迁移到了jenkins里面
最后我们通过helm管理k8s应用包
Gitlab管理代码和docker脚本,jenkinsfile文件和helm
通过gitlab创建标签后,jenkins自动发布版本