如何基于开源组件使用CI/CD

77次阅读
没有评论

共计 4397 个字符,预计需要花费 11 分钟才能阅读完成。

本篇文章给大家分享的是有关如何基于开源组件使用 CI/CD,丸趣 TV 小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着丸趣 TV 小编一起来看看吧。

前言

应对敏捷开发的需求,对 CI(持续集成))/CD(持续交付)的提出了更高的标准,今天来讨论下,如何基于开源组件(gitlab/jenkins/harbor/kubernetes)使用 CI/CD,赋能团队的开发、运维。

核心组件组件名称版本备注 kubernetesv1.15.310.0.0.182:6443jenkins2.176.2 集群内部署 / namespace: devopsgitlab11.8 主机部署 harborv1.7.4docker-compose 部署基本流程

在 GitLab 创建对应的项目。

开发者将代码提交到 GitLab。

Jenkins 创建对应的任务(Job),集成该项目的 Git 地址和 Kubernetes 集群。

如有配置钩子,推送(Push)代码会自动触发 Jenkins 构建,如没有配置钩子,需要手动构建。

Jenkins 控制 Kubernetes(使用的是 Kubernetes 插件)创建 Jenkins Slave。

Jenkins Slave 根据流水线(Pipeline)定义的步骤执行构建。

检出代码、打包、编译。

通过 Dockerfile 生成镜像。

将镜像提送(Push)到私有 Harbor。

Jenkins 再次控制 Kubernetes 进行最新的镜像部署。

注:

上面所述为一般步骤,中间还可能会涉及自动化测试等步骤,可自行根据业务场景添加。

上面流水线步骤一般由应用代码库的根目录下 Jenkinsfile 决定,Jenkins 会自动读取该文件;另外如果需要对具体的应用流水线实施强管控,可以独立管理 jenkinsfile 模板,然后根据 jenkins API 接口即时生成流水线。

默认使用的 Dockerfile 放置在代码仓库的根目录下。

组件部署

kubernetes 第 3 篇 Kubernetes 集群安装部署

gitlab 无忌过招: 手把手教你搭建自己的 GitLab 库

harbor 安装配置指南

jenkins

注: 本文主要说明下 jenkins 的部署及配置,其他组件如果你部署有问题,欢迎留言。

Jenkins 部署及配置

说明:

以下的 yaml 文件均在 k8s master 节点的 /home/jenkins_deploy 目录下,

部署示例的 depployment.yaml 的注解

nodeName ipaddress , ipaddress 请确认其为一个有效的 ip.

示例中 jenkins 的目录 /var/jenkins_home 是直接挂载到 host_path, 如果你有条件,建议替换为共享存储。

因使用的 jenkins-master 的基础镜像来自公网,需要 k8s maste 节点也要可以访问公网,或者你可以将 jenkins/jenkins:lts-alpine 推送至自己的内网镜像仓库。

部署示例的 ingress.yaml 的注解

需要你也需要办公网(集群外)访问,请将 jenkins.dev.hanker.net, 改为有效的域名地址,或是你也可以通过 NodePort 的形式声明 service,就可以直接通过 ip:port 的形式访问 jenkins 了。

1. 准备部署 yaml

deployment.yaml

apiVersion: v1
kind: Namespace
metadata:
 name: devops
# Deployment 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
 name: jenkins
 namespace: devops
spec:
 replicas: 1
 revisionHistoryLimit: 3
 template:
 metadata:
 labels:
 app: jenkins
 spec:
 nodeName: 1.1.1.1
 serviceAccountName: jenkins-admin
 containers:
 - image: jenkins/jenkins:lts-alpine
 imagePullPolicy: IfNotPresent
 name: jenkins
 volumeMounts:
 - name: jenkins-volume
 mountPath: /var/jenkins_home
 - name: jenkins-localtime
 mountPath: /etc/localtime
 env:
 - name: JAVA_OPTS
 value:  -Xms256m -Xmx1024m -Duser.timezone=Asia/Shanghai 
 - name: TRY_UPGRADE_IF_NO_MARKER
 value:  true 
 ports:
 - name: http
 containerPort: 8080
 - name: agent
 containerPort: 50000
 resources:
 requests:
 cpu: 1000m
 memory: 1Gi
 limits:
 cpu: 1200m
 memory: 2Gi
 volumes:
 - name: jenkins-localtime
 hostPath:
 path: /etc/localtime
 - name: jenkins-volume
 hostPath:
 path: /home/jenkins/jenkins_home

配置 service, services.yaml

---
apiVersion: v1
kind: Service
metadata:
 name: jenkins-service
 namespace: devops
spec:
 ports:
 - name: http
 protocol: TCP
 port: 8080
 targetPort: 8080
 - port: 50000
 targetPort: 50000
 name: agent
 selector:
 app: jenkins

授权 jenkins 对 k8s 的访问 rbac.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
 labels:
 k8s-app: jenkins
 name: jenkins-admin
 namespace: devops
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
 name: jenkins-rbac
 namespace: devops
rules:
 - apiGroups: [, extensions , app]
 resources: [pods , pods/exec , deployments , replicasets]
 verbs: [get , list , watch , create , update , patch , delete]
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
 name: jenkins-admin
 namespace: devops
 labels:
 k8s-app: jenkins
subjects:
 - kind: ServiceAccount
 name: jenkins-admin
 namespace: devops
roleRef:
 kind: ClusterRole
 name: jenkins-rbac
 apiGroup: rbac.authorization.k8s.io

为了便于办公网(集群外)访问,ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
 name: jenkins-ingress
 namespace: devops
spec:
 rules:
 - host: jenkins.dev.hanker.net
 http:
 paths:
 - backend:
 serviceName: jenkins-service
 servicePort: 8080
 path: /

2. 应用 yaml,部署 jenkins

$ pwd
$ /home/jenkins_deploy
$ kubectl apply -f *.yaml

3. 确认 jenkins 服务状态

[root@node0 jenkins_deploy]# kubectl -n devops get deployment jenkins
NAME READY UP-TO-DATE AVAILABLE AGE
jenkins 1/1 1 1 51d
[root@node0 jenkins_deploy]#

4. 访问 jenkins 安装插件、设置

注: 步骤 1 声明的域名 jenkins.dev.hanker.net 已经解析至 ingress,故可直接访问;如果你也想通过自定义域名访问 jenkins,麻请解析至正确的 ingress 服务节点,即可。

确认你也已经安装了 kubernetes/ kubernetes cli 插件

操作指引:【Manage Jenkins】–【Manage Plugins】

你应该可以通过类似的指令获取 jenkins-master 的密码

$ kubectl -n devops exec jenkins-pod-name cat /var/jenkins_home/secrets/initialAdminPassword

配置 Kubernetes 插件

操作指引:【Manage Jenkins】-【Configure System】

图中标注:

请修改为你所在环境对应的 k8s master

声明 jenkins-agent 的命令空间,也可以根据需要调整;

jenkins-master 的访问地址,本示例使用的是 service-name 的形式访问。

测试与 k8s 分享群的连接情况。如果你获取到『
Connection test successful』,恭喜你可以继续。

配置 Kubernetes Pod Template

图中标注:

设置基础的 jenkins-agent 镜像;

指定工作目录;

如果你需要下载、导出或是缓存构建的话,指定一个为共享存储的目录就很有意义了。

设置目录挂载

如步骤 2 如说,你可以将宿主机的目录或是网络存储挂载至 jenkins-agent.

以上就是如何基于开源组件使用 CI/CD,丸趣 TV 小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注丸趣 TV 行业资讯频道。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-04发表,共计4397字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)