写在开篇

对于上篇

本篇在 《上篇:带你手工体验从写代码、编译、打包镜像、部署到K8S的全过程》 的根底上,将手动的过程通过jenkins工具将其革新成自动化。

环境筹备

我的环境阐明:

组件装置形式拜访IP拜访端口
jenkinsdocker192.168.11.2548086
gitlabdocker192.168.11.2548088
harbordocker192.168.11.2548081

下面的3个组件均以docker的形式装置在同一台宿主机上,且是在k8s集群内部。即便Jenkins、GitLab、Harbor都部署在K8S集群内部,也是能够将Go web我的项目公布到K8S集群中的。那么,对于如何装置下面的组件,可参考我之前公布过的文章 《云原生下的CICD-3件套疾速搭建合集:jenkins+harbor+gitlab》。

当然也能够将CICD的相干组件部署在K8S集群外部,这些内容前面有工夫的时候再作分享。

制作jenkins镜像

因jenkinsci/blueocean镜像中没有装置go和kubectl,因而基于它来从新制作一个新的镜像,把go和kubectl装置好。
  1. 从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
  1. 将筹备好的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
  1. 进入容器编译装置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
  1. 从容器提交镜像并推送到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......
  1. 最初就能够删掉这个容器
[root@workhost jenkins]# docker stop jenkins-ser01jenkins-ser01[root@workhost jenkins]# docker rm jenkins-ser01jenkins-ser01
  1. 从制作好的镜像启动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

  1. 凭据筹备

配备好k8s、gitlab、harbor的凭据

![图片]()

连贯k8s的凭据,我间接上传了kubeconfig文件:

![图片]()

  1. 创立自在格调的软件我的项目

![图片]()

  1. 在参数化构建选项中筹备好要用到的参数

  • VERSION:这个变量我打算用来作为公布版本的用处,当构建镜像时,会作为镜像的标签
  • HARORB_ADMIN_PASSWD:因为推送镜像时我用到是shell命令的形式,登录harbor的时候援用这个明码变量
  1. 源码治理,配置git

这里要留神指定分支,我的是 “/main”,在gitlab上进入代码仓库里可看到。

  1. 在构建环境中配置连贯k8s

  1. 构建步骤中配置编译go代码

![图片]()

  1. 构建步骤中配置构建镜像和推送镜像

![图片]()

  1. 构建步骤中,配置创立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
  1. 开始运行构建工作

![图片]()

  1. 到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 ~]# 
  1. 拜访

最初

本次采纳的是Freestyle Project的构建形式,这是最常见,也是比拟传统的形式。下次在k8s部署 jenkins 主从架构,并以 Pipeline 的形式来构建公布。

本文转载于WX公众号:不背锅运维(喜爱的盆友关注咱们):https://mp.weixin.qq.com/s/yJ6rkYrwn8RAMLt5uCF9mw