写在开篇
对于上篇
本篇在 《上篇:带你手工体验从写代码、编译、打包镜像、部署到K8S的全过程》 的根底上,将手动的过程通过jenkins工具将其革新成自动化。
环境筹备
我的环境阐明:
组件 | 装置形式 | 拜访IP | 拜访端口 |
---|---|---|---|
jenkins | docker | 192.168.11.254 | 8086 |
gitlab | docker | 192.168.11.254 | 8088 |
harbor | docker | 192.168.11.254 | 8081 |
下面的3个组件均以docker的形式装置在同一台宿主机上,且是在k8s集群内部。即便Jenkins、GitLab、Harbor都部署在K8S集群内部,也是能够将Go web我的项目公布到K8S集群中的。那么,对于如何装置下面的组件,可参考我之前公布过的文章 《云原生下的CICD-3件套疾速搭建合集:jenkins+harbor+gitlab》。
当然也能够将CICD的相干组件部署在K8S集群外部,这些内容前面有工夫的时候再作分享。
制作jenkins镜像
因jenkinsci/blueocean镜像中没有装置go和kubectl,因而基于它来从新制作一个新的镜像,把go和kubectl装置好。
- 从jenkinsci/blueocean镜像启动jenkins容器
[root@workhost jenkins]# docker run -d -u root --name jenkins-ser01 --restart=always -p 8086:8080 -p 50000:50000 -v /data/jenkins/data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean
- 将筹备好的kubectl工具拷贝到容器外面
# 我的宿主机曾经有kubectl二进制包[root@workhost jenkins]# docker cp /usr/local/bin/kubectl jenkins-ser01:/bin/kubectl# 拷贝后进入容器查看是否失常执行bash-5.1# kubectl versionWARNING: This version information is deprecated and will be replaced with the output from kubectl version --short. Use --output=yaml|json to get the full version.Client Version: version.Info{Major:"1", Minor:"25", GitVersion:"v1.25.4", GitCommit:"872a965c6c6526caa949f0c6ac028ef7aff3fb78", GitTreeState:"clean", BuildDate:"2022-11-09T13:36:36Z", GoVersion:"go1.19.3", Compiler:"gc", Platform:"linux/amd64"}Kustomize Version: v4.5.7
- 进入容器编译装置golang
因为jenkins镜像是基于Alpine Linux的,须要从源代码编译装置go,不然其它发行版的二进制包是不能间接应用的
# 进入容器[root@workhost jenkins]# docker exec -it jenkins-ser01 bash# 编译装置golangbash-5.1# export GOARCH=amd64bash-5.1# export GOOS=linuxbash-5.1# wget https://go.dev/dl/go1.20.4.src.tar.gzbash-5.1# tar -zxf go1.20.4.src.tar.gzbash-5.1# apk add --no-cache --virtual .build-deps bash gcc go musl-devbash-5.1# export GOROOT_BOOTSTRAP="$(go env GOROOT)" GOHOSTOS="$GOOS" GOHOSTARCH="$GOARCH"bash-5.1# cd ./go/srcbash-5.1# ./make.bashbash-5.1# go install std# 查看版本bash-5.1# which go/usr/bin/gobash-5.1# bash-5.1# go versiongo version go1.18.7 linux/amd64# 清理现场和退出容器bash-5.1# cd /bash-5.1# rm -rf go go1.20.4.src.tar.gz bash-5.1# exitexit
- 从容器提交镜像并推送到harbor
[root@workhost jenkins]# docker commit jenkins-ser01 192.168.11.254:8081/jenkins/jenkins:20230505v1sha256:34685da4c262a14229d4aee5de9a294a877f4974c68f2bcff5e57d3f1420f101[root@workhost jenkins]# docker push 192.168.11.254:8081/jenkins/jenkins:20230505v1The push refers to repository [192.168.11.254:8081/jenkins/jenkins]334b6fe88500: Pushing [====> ] 78.86MB/838.3MB18df88a5f0e3: Pushed 704921b7ee47: Pushing [====================> ] 94.57MB/235MB......
- 最初就能够删掉这个容器
[root@workhost jenkins]# docker stop jenkins-ser01jenkins-ser01[root@workhost jenkins]# docker rm jenkins-ser01jenkins-ser01
- 从制作好的镜像启动jenkins容器
[root@workhost jenkins]# docker run -d -u root --name jenkins-ser01 --restart=always -p 8086:8080 -p 50000:50000 -v /data/jenkins/data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock 192.168.11.254:8081/jenkins/jenkins:20230505v1a052d6f503d6ef9a90d8cc99bf606daa92b5c890a8bff885d2b189fa1174492a[root@workhost jenkins]# [root@workhost jenkins]# docker ps -a | grep jenka052d6f503d6 192.168.11.254:8081/jenkins/jenkins:20230505v1 "/sbin/tini -- /usr/…" 7 seconds ago Up 6 seconds 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp, 0.0.0.0:8086->8080/tcp, :::8086->8080/tcp jenkins-ser01[root@workhost jenkins]# [root@workhost jenkins]# docker exec -it jenkins-ser01 bashbash-5.1# go versiongo version go1.18.7 linux/amd64bash-5.1# kubectl versionWARNING: This version information is deprecated and will be replaced with the output from kubectl version --short. Use --output=yaml|json to get the full version.Client Version: version.Info{Major:"1", Minor:"25", GitVersion:"v1.25.4", GitCommit:"872a965c6c6526caa949f0c6ac028ef7aff3fb78", GitTreeState:"clean", BuildDate:"2022-11-09T13:36:36Z", GoVersion:"go1.19.3", Compiler:"gc", Platform:"linux/amd64"}Kustomize Version: v4.5.7
构建形式的抉择
在 Jenkins 中,Freestyle Project 和 Pipeline 都是罕用的构建作业类型,它们都能够用来实现自动化构建和继续集成,但它们的利用场景略有不同,还是得提前理解一下:
- 如果我的项目比较简单,例如只须要执行一些 Shell 命令、构建 Maven 我的项目、执行 Ant 构建等简略操作,那么应用 Freestyle Project 就能够满足需要,因为 Freestyle Project 的配置界面非常简单,能够疾速地实现配置和构建。
- 如果我的项目比较复杂,例如须要解决多个 Git 仓库、执行多个步骤、分支流程等,那么应用 Pipeline 可能更加适宜,因为 Pipeline 具备灵便的流程控制能力,能够反对简单的我的项目构建过程。同时,Pipeline 也反对以代码的模式进行定义,具备更好的可维护性和可重用性。
倡议依据我的项目的具体需要,抉择应用适宜的构建形式。通过对这两种构建形式的理解,置信你曾经晓得了哪种适合本人了。当然,还有其它的构建形式,比方“多分支流水线”等等,这些当前用到了再去理解吧。
波及到的插件
上面的插件是我当前要用到的,先提前装置好。本次打算先用“自由软件格调我的项目”来公布goweb利用,有些插件在本篇还未用到,比方Pipeline,不过装上也不妨。因篇幅无限,本篇不讲如何装置插件,请自行装置好即可。
- Kubernetes:提供了在 Jenkins 中治理和部署应用程序到 Kubernetes 集群的能力。
- Kubernetes CLI:提供了在 Jenkins 中应用 kubectl 命令行工具与 Kubernetes 集群交互的能力。
- Git:用于在 Jenkins 中集成 Git 版本控制系统。
- Docker:用于在 Jenkins 中构建和推送 Docker 镜像。
- Credentials:用于在 Jenkins 中配置和治理 GitLab 和 Harbor 的认证凭据。
- Config File Provider
- Pipeline:用于在 Jenkins 中创立和治理流水线(Pipeline)作业。
- Go:是一个官网反对的Jenkins插件,它提供了构建和部署Go应用程序的能力。
提醒:如果只须要应用 kubectl 命令行工具与 Kubernetes 集群交互,那么只须要装置 Kubernetes CLI 插件即可。如果须要在 Jenkins 构建管道中应用 Kubernetes 插件提供的更丰盛的性能和 Jenkins 语法来治理 Kubernetes 资源,那么须要装置 Kubernetes 插件。在这里,我先把两个都装置上。
goweb我的项目构造
[root@workhost goweb]# tree.├── Dockerfile├── go.mod├── main.go├── README.md└── static └── login.html[root@workhost goweb]#
Dockerfile代码:
FROM alpine:latestWORKDIR /appCOPY static /app/staticCOPY main /appEXPOSE 80CMD ["./main"]
将dockerfile和我的项目代码一并提交到gitlab:
git add .git commit -m "add code"git push
提交后:
在jenkins公布goweb
- 凭据筹备
配备好k8s、gitlab、harbor的凭据
![图片]()
连贯k8s的凭据,我间接上传了kubeconfig文件:
![图片]()
- 创立自在格调的软件我的项目
![图片]()
- 在参数化构建选项中筹备好要用到的参数
- VERSION:这个变量我打算用来作为公布版本的用处,当构建镜像时,会作为镜像的标签
- HARORB_ADMIN_PASSWD:因为推送镜像时我用到是shell命令的形式,登录harbor的时候援用这个明码变量
- 源码治理,配置git
这里要留神指定分支,我的是 “/main”,在gitlab上进入代码仓库里可看到。
- 在构建环境中配置连贯k8s
- 构建步骤中配置编译go代码
![图片]()
- 构建步骤中配置构建镜像和推送镜像
![图片]()
- 构建步骤中,配置创立deployment和service
cat <<EOF | kubectl apply -f -apiVersion: apps/v1kind: Deploymentmetadata: labels: app: goweb name: gowebspec: replicas: 6 selector: matchLabels: app: goweb template: metadata: labels: app: goweb spec: containers: - image: 192.168.11.254:8081/webdemo/goweb:${VERSION} imagePullPolicy: Always name: goweb ports: - containerPort: 80---apiVersion: v1kind: Servicemetadata: labels: app: goweb name: gowebspec: ports: - name: http-port port: 5678 protocol: TCP targetPort: 80 nodePort: 30080 selector: app: goweb type: NodePort
- 开始运行构建工作
![图片]()
- 到k8s上查看
[root@k8s-b-master ~]# kubectl get deployment,pod,svcNAME READY UP-TO-DATE AVAILABLE AGEdeployment.apps/goweb 6/6 6 6 73mNAME READY STATUS RESTARTS AGEpod/goweb-d59b979bb-2xrxm 1/1 Running 0 58spod/goweb-d59b979bb-jllgt 1/1 Running 0 56spod/goweb-d59b979bb-nd8dl 1/1 Running 0 56spod/goweb-d59b979bb-prl7m 1/1 Running 0 55spod/goweb-d59b979bb-r5csh 1/1 Running 0 58spod/goweb-d59b979bb-t2v5n 1/1 Running 0 58sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEservice/goweb NodePort 10.96.6.121 <none> 5678:30080/TCP 55mservice/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8d[root@k8s-b-master ~]#
- 拜访
最初
本次采纳的是Freestyle Project的构建形式,这是最常见,也是比拟传统的形式。下次在k8s部署 jenkins 主从架构,并以 Pipeline 的形式来构建公布。
本文转载于WX公众号:不背锅运维(喜爱的盆友关注咱们):https://mp.weixin.qq.com/s/yJ6rkYrwn8RAMLt5uCF9mw