持续集成交付CICD:GitLabCI 封装Python类 并结合 ArgoCD 完成前端项目应用发布

目录

一、实验

1. 环境

2. Python代码实现获取文件

3.Python代码实现创建文件

4.Python代码实现更新文件

5.GitLab更新库文件与运行流水线

6.ArgoCD 完成前端项目应用发布

二、问题

1.Python获取GitLab指定仓库文件报错

2. K8S master节点运行Python代码报错


一、实验

1. 环境

(1)主机

表1 主机

主机架构版本IP备注
master1K8S master节点1.20.6192.168.204.180

jenkins slave

(从节点)

argocd2.9.3192.168.204.180:31767
node1K8S node节点1.20.6192.168.204.181
node2K8S node节点1.20.6192.168.204.182
jenkins

 jenkins主节点      

2.414.2192.168.204.15:8080

 gitlab runner

(从节点)

harbor私有仓库1.2.2192.168.204.15
python2.7.5系统自带
gitlabgitlab 主节点     12.10.14192.168.204.8:82

jenkins slave

(从节点)

sonarqube9.6192.168.204.8:9000

2. Python代码实现获取文件

(1) GitLab官网查询通过API操作获取raw文件

Repository files API | GitLab

curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fmodels%2Fkey%2Erb/raw?ref=main"

(2)GitLab 创建TOKEN

(3)GitLab查看项目编号

(4)Postman测试完成,转换成Python代码

import requestsurl = "http://192.168.204.8:82/api/v4/projects/22/repository/files/deployment.yaml/raw?ref=master"payload = {}
headers = {'PRIVATE-TOKEN': 'Z6RKxDgK7ort7i9K6f6p'
}response = requests.request("GET", url, headers=headers, data=payload)print(response.text)

(3)python实现获取GitLab指定仓库deplyment.yaml文件

import requests
import jsonclass GitlabUtil():def __init__(self):self.gitlab_url = "http://192.168.204.8:82/api/v4"self.headers = {'PRIVATE-TOKEN': 'Z6RKxDgK7ort7i9K6f6p'}def http_req(self,method,apiUrl,data={}):url = "{0}/{1}".format(self.gitlab_url,apiUrl)response = requests.request(method,url,headers=self.headers,data=data)return response.textdef write_file(self,content,filePath):with open(filePath,'w') as f:f.write(content)def get_repo_file(self,projectId,filePath,branch,targetFile):apiurl = "projects/{0}/repository/files/{1}/raw?ref={2}".format(projectId,filePath,branch)response = self.http_req("GET",apiurl)# print(response.txt)self.write_file(response,targetFile)if __name__ == '__main__':runner = GitlabUtil()runner.get_repo_file("22","deployment.yaml","master","deployment.yaml")

(4)运行Python代码(Windows11 Python环境为3.8)

(5)本地生成deployment.yaml

(6)K8S master节点同样运行Python代码进行测试(Python环境为2.7)

1)创建目录及python文件
# mkdir pygitlabtest
# cd pygitlabtest/
# vim test.py
# ls2)查看版本
# python --version3)运行代码
# python test.py 

3.Python代码实现创建文件

(1)GitLab官网查询通过API操作在指定仓库创建文件

curl --request POST --header 'PRIVATE-TOKEN: <your_access_token>' \--header "Content-Type: application/json" \--data '{"branch": "main", "author_email": "author@example.com", "author_name": "Firstname Lastname","content": "some content", "commit_message": "create a new file"}' \"https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fproject%2Erb"

(2)Postman测试完成,转换成Python代码

import requests
import jsonurl = "http://192.168.204.8:82/api/v4/projects/22/repository/files/demo.yaml"payload = json.dumps({"branch": "master","content": "Hello World","commit_message": "commmit by autorobot"
})
headers = {'PRIVATE-TOKEN': 'Z6RKxDgK7ort7i9K6f6p','Content-Type': 'application/json'
}response = requests.request("POST", url, headers=headers, data=payload)print(response.text)

(3)GitLab查看项目生成了demo.yaml文件

(4)python实现在GitLab指定项目创建demo02.yaml文件

# -*- coding: utf-8 -*-
import requests
import json
import base64class GitlabUtil():def __init__(self,projectId):self.gitlab_url = "http://192.168.204.8:82/api/v4"self.gitlab_token = 'Z6RKxDgK7ort7i9K6f6p'self.projectId = projectIdself.encoding = "base64"def http_req(self,method,apiUrl,headers,data):url = "{0}/{1}".format(self.gitlab_url,apiUrl)response = requests.request(method,url,headers=headers,data=data)return response.textdef write_file(self,content,filePath):with open(filePath,'w') as f:f.write(content)def get_repo_file(self,filePath,branch,targetFile):apiurl = "projects/{0}/repository/files/{1}/raw?ref={2}".format(self.projectId,filePath,branch)headers = {'PRIVATE-TOKEN': self.gitlab_token,'Content-Type': 'application/json'}response = self.http_req("GET",apiurl,headers, {})# print(response.txt)self.write_file(response,targetFile)def create_repo_file(self,filePath,branch,content,commit_message):apiurl = "/projects/{0}/repository/files/{1}".format(self.projectId,filePath)data = json.dumps({"branch": branch,"content": content,"commit_message": commit_message# "encoding": self.encoding})headers = {'PRIVATE-TOKEN': self.gitlab_token,'Content-Type': 'application/json'}self.http_req("POST", apiurl,headers=headers,data=data)if __name__ == '__main__':runner = GitlabUtil("22")# runner.get_repo_file("deployment.yaml","master","deployment.yaml")f = open("deployment.yaml",'r',encoding='utf-8')content = f.read()f.close()# content = base64.b64encode(bytes(content,"utf-8"))runner.create_repo_file("demo02.yaml","master",content,"Hello World 2")

(5)运行Python代码(Windows11 Python环境为3.8)

(6)GitLab查看项目生成了demo2.yaml文件

4.Python代码实现更新文件

(1)GitLab官网查询通过API操作在指定仓库更新文件

curl --request PUT --header 'PRIVATE-TOKEN: <your_access_token>' \--header "Content-Type: application/json" \--data '{"branch": "main", "author_email": "author@example.com", "author_name": "Firstname Lastname","content": "some content", "commit_message": "update file"}' \"https://gitlab.example.com/api/v4/projects/13083/repository/files/app%2Fproject%2Erb"

(2)python实现在GitLab指定项目更新demo02.yaml文件

# -*- coding: utf-8 -*-
import requests
import json
import base64class GitlabUtil():def __init__(self,projectId):self.gitlab_url = "http://192.168.204.8:82/api/v4"self.gitlab_token = 'Z6RKxDgK7ort7i9K6f6p'self.projectId = projectIdself.encoding = "base64"def http_req(self,method,apiUrl,headers,data):url = "{0}/{1}".format(self.gitlab_url,apiUrl)response = requests.request(method,url,headers=headers,data=data)return response.textdef write_file(self,content,filePath):with open(filePath,'w') as f:f.write(content)# 下载文件def get_repo_file(self,filePath,branch,targetFile):apiurl = "projects/{0}/repository/files/{1}/raw?ref={2}".format(self.projectId,filePath,branch)headers = {'PRIVATE-TOKEN': self.gitlab_token,'Content-Type': 'application/json'}response = self.http_req("GET",apiurl,headers, {})# print(response.txt)self.write_file(response,targetFile)# 创建文件def create_repo_file(self,filePath,branch,content,commit_message):apiurl = "/projects/{0}/repository/files/{1}".format(self.projectId,filePath)data = json.dumps({"branch": branch,"content": content,"commit_message": commit_message# "encoding": self.encoding})headers = {'PRIVATE-TOKEN': self.gitlab_token,'Content-Type': 'application/json'}self.http_req("POST", apiurl,headers=headers,data=data)# 更新文件def update_repo_file(self,filePath,branch,content,commit_message):apiurl = "/projects/{0}/repository/files/{1}".format(self.projectId,filePath)data = json.dumps({"branch": branch,"content": content,"commit_message": commit_message# "encoding": self.encoding})headers = {'PRIVATE-TOKEN': self.gitlab_token,'Content-Type': 'application/json'}self.http_req("PUT", apiurl,headers=headers,data=data)if __name__ == '__main__':runner = GitlabUtil("22")# runner.get_repo_file("deployment.yaml","master","deployment.yaml")f = open("deployment.yaml",'r',encoding='utf-8')content = f.read()f.close()# content = base64.b64encode(bytes(content,"utf-8"))# runner.create_repo_file("demo02.yaml","master",content,"Hello World 2")runner.update_repo_file("demo02.yaml", "master", content, "Hello World 3")

(3)运行Python代码(Windows11 Python环境为3.8)

(4)GitLab查看项目更新了提交信息

5.GitLab更新库文件与运行流水线

(1)查看GitLab共享库

(2)新建流水线文件ui.gitlabutil.yaml

(3)复制raw格式

(4)在GitLab devops03-devops-env 环境库项目添加CI配置文件路径

(5)查看前端项目devops03-devops-ui 修改Dockerfile,注释本地CI流水线文件,避免后续运行错误

(6)查看前端项目目录下的index.html文件

(7) GitLab共享库新建目录util及GitLabUtil.py文件,用来封装python类

(8)GitLabUtil.py文件代码

import requests
import json
import base64
import sysclass GitlabUtil():def __init__(self,projectId):self.gitlab_url = "http://192.168.204.8:82/api/v4"self.gitlab_token = 'Z6RKxDgK7ort7i9K6f6p'self.projectId = projectIdself.encoding = "base64"def http_req(self,method,apiUrl,headers,data):url = "{0}/{1}".format(self.gitlab_url,apiUrl)response = requests.request(method,url,headers=headers,data=data)return response.textdef write_file(self,content,filePath):with open(filePath,'w') as f:f.write(content)def get_repo_file(self,filePath,branch,targetFile):apiurl = "projects/{0}/repository/files/{1}/raw?ref={2}".format(self.projectId,filePath,branch)headers = {'PRIVATE-TOKEN': self.gitlab_token,'Content-Type': 'application/json'}response = self.http_req("GET",apiurl,headers, {})# print(response.txt)self.write_file(response,targetFile)def create_repo_file(self,filePath,branch,content,commit_message):apiurl = "/projects/{0}/repository/files/{1}".format(self.projectId,filePath)data = json.dumps({"branch": branch,"content": content,"commit_message": commit_message# "encoding": self.encoding})headers = {'PRIVATE-TOKEN': self.gitlab_token,'Content-Type': 'application/json'}mes = self.http_req("POST", apiurl,headers=headers,data=data)if json.loads(mes)["message"] == "A file with this name already exists":raise Exception("A file with this name already exists")def update_repo_file(self,filePath,branch,content,commit_message):apiurl = "/projects/{0}/repository/files/{1}".format(self.projectId,filePath)data = json.dumps({"branch": branch,"content": content,"commit_message": commit_message})headers = {'PRIVATE-TOKEN': self.gitlab_token,'Content-Type': 'application/json'}self.http_req("PUT", apiurl,headers=headers,data=data)if __name__ == '__main__':if sys.argv[1] == "getfile":projectId,filename,branch,targetFile = sys.argv[2:]GitlabUtil(projectId).get_repo_file(filename,branch,targetFile)if sys.argv[1] == "updatefile":projectId, filename, branch, targetFile = sys.argv[2:]f = open(filename, 'r')content = f.read()f.close()try:GitlabUtil(projectId).create_repo_file(targetFile, branch, content, "Auto K8S Deployment")except Exception as e:print(e)GitlabUtil(projectId).update_repo_file(targetFile, branch, content, "Auto K8S Deployment")

(9)修改流水线文件ui.gitlabutil.yaml

include:- project: 'devops03/devops03-gitlabci-lib'ref: masterfile: "/jobs/CI.yaml"workflow:rules:#新建分支永远不执行- if: $CI_PIPELINE_SOURCE == "web"      #允许手动触发when: always- if: $CI_COMMIT_BEFORE_SHA == "0000000000000000000000000000000000000000"when: never# 其他情况永远执行- when: always#取消每个阶段自动下载代码,即全局关闭作业代码下载
variables:GIT_CHECKOUT: "false"  ## 全局关闭作业代码下载PROJECT_TYPE: "npm"   ## 定义项目类型BUILD_SHELL: "npm run build"   ## 构建命令TEST_SHELL: "echo test"                         ## 测试命令ARTIFACT_PATH: "dist/**"                                  ## 制品路径# TEST_REPORTS: "target/surefire-reports/TEST-*.xml"             ## 测试报告stages:- build- sonarscan- dockerbuild- releasefilepipelineInit:extends: - .pipelineInitcibuild:before_script:- "npm install"extends:- .cibuildreleasefile:tags:- buildstage: releasefilescript:- curl  "http://192.168.204.8:82/devops03/devops03-gitlabci-lib/-/raw/master/utils/GitLabUtil.py" -o GitLabUtil.py -s- python GitLabUtil.py getfile "22" "deployment.yaml" "master" "deployment.yaml"- ls -l- imageName=192.168.204.15/${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}:${CI_COMMIT_SHA}- sed -i 's#__PORT__#80#g' deployment.yaml- sed -i "s#__APPNAME__#${CI_PROJECT_NAME}#g" deployment.yaml- sed -i "s#__NAMESPACE__#${CI_PROJECT_NAMESPACE}#g" deployment.yaml- sed -i "s#__IMAGENAME__#${imageName}#g" deployment.yaml- python GitLabUtil.py updatefile "22" "deployment.yaml" "master" "${CI_PROJECT_NAME}%2f${CI_COMMIT_BRANCH}.yaml"#sonarscan:
# extends:
# - .sonarscan#pushartifact:
# extends:
# - .pushartifactdockerbuild:extends:- .dockerbuild

(10)共享库完整目录

(11)GitLab 前端项目运行流水线

(12)完成

(13)查看各阶段日志

(14)环境库项目显示更新master.yaml文件

(15) 查看master.yaml文件(已同步更新端口号、命名空间、项目名称及镜像名称)

6.ArgoCD 完成前端项目应用发布

(1)K8S查看集群状态

# kubectl get node

(2)K8S master节点另开一个终端用watch命令观察pod变化

# watch -n 1 "kubectl get pod -n devops03"

(3)外部测试访问

# curl http://devops03-devops-ui.devops.com:31291

(4)K8S 删除命名空间devops03

# kubectl delete ns devops03

(5) 观察pod变化

(5)ArgoCD 查看已有项目

(6)ArgoCD 删除已有项目

(7)GitLab环境库注释其他的yaml文件

(8)ArgoCD 创建application (手动策略、自动创建命名空间、指定仓库与集群)

(9)填写配置

(10)完成创建

(11)点击 SYNCHRONIZE (同步)

(12)观察pod变化

(13)ArgoCD 观察pod变化

(14)查看Harbor仓库镜像文件

(15)K8S node节点连接Harbor拉取镜像

# docker login -u admin -p Harbor12345 192.168.204.15# docker pull 192.168.204.15/devops03/devops03-devops-ui:RELEASE-1.1.7# docker logout 192.168.204.15

node1 节点

node2节点

(16)观察pod变化

(17)ArgoCD 再次观察pod变化

(18) 外部测试访问

# curl http://devops03-devops-ui.devops.com:31291

二、问题

1.Python获取GitLab指定仓库文件报错

(1)报错

(2)原因分析

函数名错误

(3)解决方法

修改函数名称。

修改前:

修改后:

2. K8S master节点运行Python代码报错

(1)报错

(2)原因分析

encoding不是有效的关键词。

(3)解决方法

去掉encoding。

修改前:

修改后:

成功:

3. GitLabCI 运行流水线报错

(1)报错

(2)原因分析

行尾缺少双引号

(3)解决方法

添加双引号。

成功:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/223624.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网络编程】网络通信基础——简述TCP/IP协议

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一、ip地…

C/C++ 基础函数

memcpy&#xff1a;C/C语言中的一个用于内存复制的函数&#xff0c;声明在 string.h 中&#xff08;C是 cstring&#xff09; void *memcpy(void *destin, void *source, unsigned n);作用是&#xff1a;以source指向的地址为起点&#xff0c;将连续的n个字节数据&#xff0c;…

如何利用PPT绘图并导出清晰图片

在写论文的过程中&#xff0c;免不了需要绘图&#xff0c;但是visio等软件绘图没有在ppt上绘图比较熟练&#xff0c;尤其流程图结构图. 但是ppt导出的图片也不够清晰&#xff0c;默认分辨率是96dpi&#xff0c;而杂志投稿一般要求至300dpi。解决办法如下&#xff1a; 1.打开注…

通过 Higress Wasm 插件 3 倍性能实现 Spring-cloud-gateway 功能

作者&#xff1a;韦鑫&#xff0c;Higress Committer&#xff0c;来自南京航空航天大学分布式系统实验室 导读&#xff1a;本文将和大家一同回顾 Spring Cloud Gateway 是如何满足 HTTP 请求/响应转换需求场景的&#xff0c;并为大家介绍在这种场景下使用 Higress 云原生网关的…

【银行测试】相关专业知识点+核心业务系统性能方法(汇总)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、银行测试相关专…

HarmonyOS4.0系统性深入开发03UIAbility组件详解(中)

UIAbility组件基本用法 UIAbility组件的基本用法包括&#xff1a;指定UIAbility的启动页面以及获取UIAbility的上下文UIAbilityContext。 指定UIAbility的启动页面 应用中的UIAbility在启动过程中&#xff0c;需要指定启动页面&#xff0c;否则应用启动后会因为没有默认加载…

Html / CSS刷题笔记

WebKit是一个开源的浏览器引擎&#xff0c;它最初是由苹果公司开发的&#xff0c;并且被广泛用于Safari浏览器和其他基于WebKit的浏览器&#xff0c;比如Google Chrome的早期版本。它也是构建许多移动设备浏览器的基础。WebKit的主要功能是解析HTML和CSS&#xff0c;并将其渲染…

爬虫工作量由小到大的思维转变---<第二十三章 Scrapy开始很快,越来越慢(医病篇)>

诊断篇https://blog.csdn.net/m0_56758840/article/details/135170994?ops_request_misc%257B%2522request%255Fid%2522%253A%2522170333243316800180644102%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id1703332433168001806441…

面试题:JVM 对锁都进行了哪些优化?

文章目录 锁优化自旋锁和自适应自旋锁消除锁粗化逃逸分析方法逃逸线程逃逸通过逃逸分析&#xff0c;编译器对代码的优化 锁优化 jvm 在加锁的过程中&#xff0c;会采用自旋、自适应、锁消除、锁粗化等优化手段来提升代码执行效率。 自旋锁和自适应自旋 现在大多的处理器都是…

node-red:使用node-red-contrib-amqp节点,实现与RabbitMQ服务器(AMQP)的消息传递

node-red-contrib-amqp节点使用 一、简介1.1 什么是AMQP协议?1.2 什么是RabbitMQ? -> 开源的AMQP协议实现1.3 RabbitMQ的WEB管理界面介绍1.3 如何实现RabbitMQ的数据采集? -> node-red 二、node-red-contrib-amqp节点安装与使用教程2.1 节点安装2.2 节点使用2.2.1 amq…

LTE之接口协议

一、接口协议栈 接口是指不同网元之间的信息交互方式。既然是信息交互&#xff0c;就应该使用彼此都能看懂的语言&#xff0c;这就是接口协议。接口协议的架构称为协议栈。根据接口所处位置分为空中接口和地面接口&#xff0c;响应的协议也分为空中接口协议和地面接口协议。空…

WEB 3D技术 three.js 通过lil-gui 控制x y z轴数值 操作分组 设置布尔值控制 颜色材质控制

上文 WEB 3D技术 three.js 通过lil-gui管理公共事件中 我们用 lil-gui 处理了一下基础事件和按钮的管理 那么 本文 我们来具体说说它能做的其他事 我们先将基础代码改成这样 import ./style.css import * as THREE from "three"; //引入lil-gui import { GUI } fro…

基于docker-compose 安装Sonar并集成gitlab

文章目录 1. 前置条件2. 编写docker-compose-sonar.yml文件3. 集成 gitlab4. Sonar Login with GitLab 1. 前置条件 安装docker-compose 安装docker 创建容器运行的特有网络 创建挂载目录 2. 编写docker-compose-sonar.yml文件 version: "3" services:sonar-postgre…

算法模板之队列图文详解

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;算法模板、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. ⛳️模拟队列1.1 &#x1f514;用数组模拟实现队列1.1.1 &#x1f47b;队列的定…

【设计模式】RBAC 模型详解

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、什么是 RBAC 呢&#xff1f; 二、RBAC 的组成 三、RBAC 的优缺点 3.1 优点&#xff1a; 3.2 缺点&#xff1a; 四、RBAC 的…

java定义三套场景接口方案

一、背景 在前后端分离开发的背景下&#xff0c;后端java开发人员现在只需要编写接口接口。特别是使用微服务开发的接口。resful风格接口。那么一般后端接口被调用有下面三种场景。一、不需要用户登录的接口调用&#xff0c;第二、后端管理系统接口调用&#xff08;需要账号密…

2024华为OD机试真题指南宝典—持续更新(JAVAPythonC++JS)【彻底搞懂算法和数据结构—算法之翼】

PC端可直接搜索关键词 快捷键&#xff1a;CtrlF 年份关键字、题目关键字等等 注意看本文目录-快速了解本专栏 文章目录 &#x1f431;2024年华为OD机试真题&#xff08;马上更新&#xff09;&#x1f439;2023年华为OD机试真题&#xff08;更新中&#xff09;&#x1f436;新…

《工具箱-SVN》SVN安装、备份、迁移教程

文章目录 一、服务器搭建SVN1.检查SVN是否存在2.安装SVN3.创建版本库4.创建版本库存放文件地址5.修改配置文件5.1 vim authz5.2 vim passwd5.3 vim svnserve.conf 6.启动并查看SVN7.SVN Checkout8.SVN Update9.SVN Commit 二、SVN-无法连接主机&#xff0c;目标计算机积极拒绝&…

【MySQL】表的基本查询

表的基本查询 表的增删查改1. Create&#xff08;1&#xff09;单行数据 全列插入&#xff08;2&#xff09;多行数据 指定列插入&#xff08;3&#xff09;插入否则更新&#xff08;4&#xff09;替换 2. Retrieve&#xff08;1&#xff09;select 列a. 全列查询b. 指定列查…

【第七在线】数据分析与人工智能在商品计划中的应用

随着技术的不断进步&#xff0c;数据分析和人工智能&#xff08;AI&#xff09;已经成为了现代商品计划的关键组成部分。在服装行业&#xff0c;这两项技术正在帮助企业更好地理解市场需求、优化库存管理、提高生产效率和提供更好的客户体验。本文将深入探讨数据分析和人工智能…