下篇:使用jenkins发布go项目到k8s,接上篇的手工体验改造为自动化发布

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 下篇:使用jenkins发布go项目到k8s,接上篇的手工体验改造为自动化发布

写在开篇

关于上篇

本篇在 《上篇:带你手工体验从写代码、编译、打包镜像、部署到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安装好。

  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 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
  1. 进入容器编译安装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
  1. 从容器提交镜像并推送到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
...
...
  1. 最后就可以删掉这个容器
[root@workhost jenkins]# docker stop jenkins-ser01
jenkins-ser01
[root@workhost jenkins]# docker rm jenkins-ser01
jenkins-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: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

  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/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
  1. 开始运行构建任务


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

最后

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

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
6天前
|
Kubernetes 监控 安全
Kubernetes实战:集群管理与自动化技术详解
【6月更文挑战第27天】Kubernetes实战聚焦集群自动化管理,涵盖核心概念如主从架构、API Server及工作节点,强调自动扩缩容、RBAC安全控制与日志监控。通过IaC工具如Helm实现配置自动化,结合Prometheus等进行持续监控,强调安全策略与资源优化,展现K8s在现代应用管理中的威力。
|
2天前
|
jenkins Java 持续交付
运用Jenkins实现Java项目的持续集成与自动化部署
在新建的Jenkins Job中,我们需要配置源码管理,通常选择Git、SVN等版本控制系统,并填入仓库地址和凭据。接着,设置构建触发器,如定时构建、轮询SCM变更、GitHub Webhook等方式,以便在代码提交后自动触发构建过程。
21 2
|
1天前
|
Java jenkins 持续交付
Jenkins是开源CI/CD工具,用于自动化Java项目构建、测试和部署。通过配置源码管理、构建触发器、执行Maven目标,实现代码提交即触发构建和测试
【7月更文挑战第1天】Jenkins是开源CI/CD工具,用于自动化Java项目构建、测试和部署。通过配置源码管理、构建触发器、执行Maven目标,实现代码提交即触发构建和测试。成功后,Jenkins执行部署任务,发布到服务器或云环境。使用Jenkins能提升效率,保证软件质量,加速上线,并需维护其稳定运行。
11 0
|
26天前
|
JSON 程序员 数据格式
豆瓣评分9.6!用81个项目带你从Python 3零基础到Python自动化
Python的名字来自超现实主义的英国喜剧团体,而不是来自蛇。Python程序员被亲切地称为Pythonistas。Monty Python和与蛇相关的引用常常出现在Python的指南和文档中。
|
25天前
|
jenkins Java 持续交付
|
1月前
|
JSON 程序员 数据格式
豆瓣评分9.6!用81个项目带你从Python 3零基础到Python自动化
Python的名字来自超现实主义的英国喜剧团体,而不是来自蛇。Python程序员被亲切地称为Pythonistas。Monty Python和与蛇相关的引用常常出现在Python的指南和文档中。
|
7天前
|
NoSQL 编译器 Linux
【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用
【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用
14 0
|
11天前
|
Java API Maven
Gradle 自动化项目构建-Gradle 核心之 Project
Gradle 自动化项目构建-Gradle 核心之 Project
27 0
|
2月前
|
运维 Kubernetes 持续交付
构建高效自动化运维体系:基于Docker和Kubernetes的实践
【5月更文挑战第30天】 在当今的快速迭代和持续部署的软件发布环境中,自动化运维的重要性愈发凸显。本文旨在探讨如何利用容器化技术与微服务架构,特别是Docker和Kubernetes,来构建一个高效、可伸缩且自愈的自动化运维体系。通过详细分析容器化的优势及Kubernetes的集群管理机制,文章将提供一个清晰的指南,帮助读者理解并实现现代软件部署的最佳实践。
|
13天前
|
安全 生物认证 网络安全
信息打点-红蓝队自动化项目&资产侦察&武器库部署&企查产权&网络空间
信息打点-红蓝队自动化项目&资产侦察&武器库部署&企查产权&网络空间