写在开篇
对于上篇
本篇在《上篇:带你手工体验从写代码、编译、打包镜像、部署到 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 version
WARNING: 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
# 编译装置 golang
bash-5.1# export GOARCH=amd64
bash-5.1# export GOOS=linux
bash-5.1# wget https://go.dev/dl/go1.20.4.src.tar.gz
bash-5.1# tar -zxf go1.20.4.src.tar.gz
bash-5.1# apk add --no-cache --virtual .build-deps bash gcc go musl-dev
bash-5.1# export GOROOT_BOOTSTRAP="$(go env GOROOT)" GOHOSTOS="$GOOS" GOHOSTARCH="$GOARCH"
bash-5.1# cd ./go/src
bash-5.1# ./make.bash
bash-5.1# go install std
# 查看版本
bash-5.1# which go
/usr/bin/go
bash-5.1#
bash-5.1# go version
go 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# exit
exit
- 从容器提交镜像并推送到 harbor
[root@workhost jenkins]# docker commit jenkins-ser01 192.168.11.254:8081/jenkins/jenkins:20230505v1
sha256:34685da4c262a14229d4aee5de9a294a877f4974c68f2bcff5e57d3f1420f101
[root@workhost jenkins]# docker push 192.168.11.254:8081/jenkins/jenkins:20230505v1
The push refers to repository [192.168.11.254:8081/jenkins/jenkins]
334b6fe88500: Pushing [====>] 78.86MB/838.3MB
18df88a5f0e3: Pushed
704921b7ee47: Pushing [====================>] 94.57MB/235MB
...
...
- 最初就能够删掉这个容器
[root@workhost jenkins]# docker stop jenkins-ser01
jenkins-ser01
[root@workhost jenkins]# docker rm jenkins-ser01
jenkins-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:20230505v1
a052d6f503d6ef9a90d8cc99bf606daa92b5c890a8bff885d2b189fa1174492a
[root@workhost jenkins]#
[root@workhost jenkins]# docker ps -a | grep jenk
a052d6f503d6 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 bash
bash-5.1# go version
go version go1.18.7 linux/amd64
bash-5.1# kubectl version
WARNING: 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:latest
WORKDIR /app
COPY static /app/static
COPY main /app
EXPOSE 80
CMD ["./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/v1
kind: Deployment
metadata:
labels:
app: goweb
name: goweb
spec:
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: v1
kind: Service
metadata:
labels:
app: goweb
name: goweb
spec:
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,svc
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/goweb 6/6 6 6 73m
NAME READY STATUS RESTARTS AGE
pod/goweb-d59b979bb-2xrxm 1/1 Running 0 58s
pod/goweb-d59b979bb-jllgt 1/1 Running 0 56s
pod/goweb-d59b979bb-nd8dl 1/1 Running 0 56s
pod/goweb-d59b979bb-prl7m 1/1 Running 0 55s
pod/goweb-d59b979bb-r5csh 1/1 Running 0 58s
pod/goweb-d59b979bb-t2v5n 1/1 Running 0 58s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/goweb NodePort 10.96.6.121 <none> 5678:30080/TCP 55m
service/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