首页 文章 精选 留言 我的

精选列表

搜索[CODING DevOps],共7261篇文章
优秀的个人博客,低调大师

字节和腾讯都在使用,DevOps工具Zadig究竟有何魔力

项目名称:Zadig 项目作者:koderover 团队 开源许可协议:Apache-2.0 项目地址:https://gitee.com/koderover/zadig 项目简介 Zadig 是 KodeRover 公司基于 Kubernetes 自主设计、研发的开源分布式持续交付 (Continues Delivery) 产品,为开发者提供云原生运行环境,支持开发者本地联调、微服务并行构建和部署、集成测试等。Zadig 内置了面向 Kubernetes、Helm、云主机、大体量微服务等复杂业务场景的最佳实践,为工程师一键生成自动化工作流 (workflow)。 Zadig 不改变现有流程,无缝集成 GitHub/GitLab、Jenkins、多家云厂商等,运维成本极低。 项目截图 项目特色 高并发的工作流 基于云原生设计,经过简单配置,系统自动生成工作流,实现多服务高并发执行构建部署测试任务,以解决微服务架构下带来的多服务构建部署效率低下问题。 以服务为核心的集成环境 一套服务配置,分钟级创建多套数据隔离的测试环境。为开发者进行日常调试、为测试人员做集成测试、为产品经理对外 Demo 提供强力支撑。 对于现有的环境无需担心迁移成本,一键托管,轻松浏览、调试环境中的所有服务。 无侵入的自动化测试 便捷且无侵入的对接已有自动化测试框架,通过 GitHub/GitLab Webhook 自动构建、部署及测试。 通过办公通讯机器人为开发者提供第一时间质量反馈,精准高效。有效落地“测试左移”工程实践,让测试价值得到体现。 *开发本地联调 CLI 开发本地编辑完代码,一键进行本地代码构建,部署到联调环境,无需再陷入复杂且繁琐的工作流程,让本地联调不再成为难事。解放工程师双手,去创造更多产品价值。 安装与配置 Zadig 提供了三种安装模式供开发者选择。 前置条件 一台至少配置为 4 核 8 G 可联网的 Linux 主机或一个标准的 Kubernetes 集群。 三种安装模式: All in One 一键安装和基于现有的 Kubernetes 集群安装。其中,All in One 一键安装包含了完整的单节点 Kubernetes 集群的安装。 第一种模式:All in One 一键安装 以 root 用户登录 Linux 主机执行以下命令: export IP=<IP> # 主机 IP,用于访问 Zadig 系统 curl -SsL https://github.com/koderover/zadig/releases/latest/download/install_with_k8s.sh | bash 第二种模式:基于现有的 Kubernetes 集群安装 以集群管理员身份,执行以下命令: export IP=<IP> # 集群任一节点公网 IP,用于访问 Zadig 系统 curl -SsL https://github.com/koderover/zadig/releases/latest/download/install.sh | bash 第三种模式:基于 Helm 命令安装 详细的安装过程和更多有关项目的信息,开发者们可以前往项目主页查看:https://gitee.com/koderover/zadig

优秀的个人博客,低调大师

go程序基于阿里云CodePipeline的一次devops实践

背景 最近朋友有个项目代码托管用的码云,测试服务器(阿里云ECS)只有一台,三四个人开发,于是想基于阿里云的CodePipeline快速打造一套自动化cicd的流程,使用docker来进行多套环境部署。 CodePipeline 介绍 阿里云CodePipeline是兼容Jenkins标准的、提供快速可靠的持续集成与持续交付服务。基于容器技术和阿里云基础服务架构,提供稳定和安全的代码/Docker编译构建,测试,扫描和部署的工具服务,并提供Pipeline As Code的编码级配置模式,满足应用程序和基础设施快速可靠的交付和更新。 上面是阿里云的官方介绍,兼容jekins的标准,一次无意的点击出现了下图的图标,感觉就是jenkins的基础上做了一次二次开发。 新建构建项目 构建项目基本配置 基本信息配置 由于项目使用到了一些国外的lib,当然选择国内的节点也是可以的,不过在写Dockerfile的时候记得加上代理。 源码管理配置 选择合适的代码仓库,也可以是私仓,不过需要配上自己的账号和ssh key相关信息。 构建配置 我这里使用的是阿里云的私有的镜像仓库基于Dockerfile来构建镜像,注意配置凭证。![在这里插入图片描述] 项目目录 gin_demo ├── app │ └── app.go ├── conf │ └── app.ini ├── Dockerfile ├── docs │ └── sql │ └── mjs.sql ├── go.mod ├── go.sum ├── main.go ├── middleware │ ├── jwt │ │ └── jwt.go │ └── logging │ └── logger.go ├── mjs.exe ├── models │ ├── mongo │ │ └── db.go │ └── mysql │ ├── db.go │ ├── teacher.go │ └── user.go ├── pkg │ ├── app │ │ ├── form.go │ │ ├── request.go │ │ └── response.go │ ├── def │ │ └── def.go │ ├── e │ │ ├── code.go │ │ ├── def.go │ │ └── msg.go │ ├── file │ │ └── file.go │ ├── gredis │ │ └── redis.go │ ├── logging │ │ ├── file.go │ │ └── log.go │ ├── setting │ │ └── setting.go │ ├── upload │ │ └── image.go │ └── util │ ├── jwt.go │ ├── md5.go │ ├── pagination.go │ └── util.go ├── README.en.md ├── README.md ├── routers │ ├── api │ │ └── v1 │ └── router.go ├── runtime │ └── logs │ ├── log20190528.log │ └── log20190529.log └── service ├── teacher_service │ └── teacher.go └── user_service └── user.go Dockerfile FROM golang:1.12.4 as build #ENV GOPROXY https://goproxy.io WORKDIR /go/cache ADD go.mod . ADD go.sum . RUN go mod download WORKDIR /go/release ADD . . RUN GOOS=linux CGO_ENABLED=0 go build -ldflags="-s -w" -installsuffix cgo -o gin_demo main.go FROM scratch as prod COPY --from=build /usr/share/zoneinfo/Asia/Shanghai /etc/localtime COPY --from=build /go/release/gin_demo / COPY --from=build /go/release/conf ./conf CMD ["/gin_demo"] 注:如果选择国内节点构建必须配上代理 ENV GOPROXY https://goproxy.io 配置触发器 这里选择一个构建的代码分支,然后点击生成,将生成后的url可以在对应的代码仓库配上webhook之类的配置。选择合适的触发方式。 配置部署 阿里云构建步骤里面部署到ECS上(不方便)和部署到k8s(收费)都不能满足项目场景需求,不过上面支持shell脚本,于是自己想在朋友的那台阿里云ECS上跑个ci的web server,这里构建完之后就去通知下这个接口,然后去执行一些docker指令的脚本,拉取构建完之后的镜像并且重新启动,启动完之后邮件通知。于是写了这样一个很简单的web server。main package main import ( "fmt" "log" "net/http" "os/exec" "path" ) /* * @Author:hanyajun * @Date:2019/5/28 16:44 * @Name:ci_tools * @Function: ci 工具 */ // func HandleCi(w http.ResponseWriter, req *http.Request) { user := path.Base(req.URL.Path) //针对不同开发人员的push拉取不同的镜像和映射不同的端口 var port string switch user { case "zhangsan": port = "8088" case "lisi": port = "8087" case "wangmazi": port = "8086" case "dev": port = "8085" case "master": port = "8084" } println(user) result := Run(user,port) client:=NewMailClient("smtp.qq.com",465,"******@qq.com","*********")//注意使用465 ssl发送,25端口阿里云ecs禁止了。 s:=&SendObject{ ToMails:[]string{"******@qq.com","******@qq.com","******@qq.com"}, CcMails:[]string{"******@qq.com"}, Object:"cicd流程结果通知", ContentType:"text/html", Content:user+" has push something to the branch: "+user+"\n"+"result: "+string(result), } err:=client.SendMail(s) if err!=nil{ println("send mail fail",err) } _, _ = w.Write(result) } func main() { http.HandleFunc("/ci/", HandleCi) err := http.ListenAndServe(":8080", nil) if err != nil { log.Fatal("ListenAndServe: ", err) } } func Run(user string,port string) []byte { shellPath := "/root/ci/ci.sh" command := exec.Command(shellPath, user,port) err := command.Start() if nil != err { fmt.Println(err) return []byte(err.Error()) } fmt.Println("Process PID:", command.Process.Pid) err = command.Wait() //等待执行完成 if nil != err { fmt.Println(err) return []byte(err.Error()) } fmt.Println("ProcessState PID:", command.ProcessState.Pid()) return []byte("success") } mail.go package main import ( "fmt" "gopkg.in/gomail.v2" ) /* * @Author:15815 * @Date:2019/5/8 17:47 * @Name:mail * @Function:邮件发送 */ type Client struct { Host string Port int Mail string Password string } type SendObject struct { ToMails []string CcMails []string Object string ContentType string Content string } func NewMailClient(host string, port int, sendMail, password string) *Client { return &Client{ Host: host, Port: port, Mail: sendMail, Password: password, } } func (m *Client) SendMail(s *SendObject) error { mgs := gomail.NewMessage() mgs.SetHeader("From", m.Mail) mgs.SetHeader("To", s.ToMails...) mgs.SetHeader("Cc", s.CcMails...) mgs.SetHeader("Subject", s.Object) mgs.SetBody(s.ContentType, s.Content) d := gomail.NewDialer(m.Host, m.Port, m.Mail, m.Password) if err := d.DialAndSend(mgs); err != nil { fmt.Printf("send mail err:%v", err) return err } return nil } ci.sh #!/bin/bash funCiTools() { docker pull registry.cn-shanghai.aliyuncs.com/***/***:$1 docker rm -f $1 docker run -d -p $2:8000 --name $1 registry.cn-shanghai.aliyuncs.com/***/***:$1 } funCiTools $1 $2 第一个参数是对应开发人员启动容器的名字以及构建镜像的tag和上面构建的配置一致,第二个参数是映射的端口。构建ci_web_server自己的电脑是windows的,朋友的阿里云ecs上又没有go环境,想构建基于linux的二进制程序,于是直接利用docker image 来构建了镜像,一个指令解决问题。build.sh docker run --rm -i -v `pwd`:/go/src/ci -w /go/src/ci golang:1.11.5 go build -o ci ci 使用nohup直接将ci server放置后台运行。 nohup ./ci >output 2>&1 & 效果测试 直接修改点东西提交代码后就等邮件通知了,是不是感觉很爽。提交完代码后就开始触发构建了。最后构建完完成后触发ci server 进行deploy,完成邮件通知。登录到阿里云Ecs上我们发现我们的容器已经启动成功了。

优秀的个人博客,低调大师

DevOps之旅:运维人员阅读源代码的实用技巧

作者简介 陈晨,基础架构工程师,目前就职于中国银联。主要负责IaaS平台、容器平台以及运维管理平台的建设工作。本文将着重介绍运维人员学习源代码的一些技巧。 一、准备阶段 1.制定计划 读源码和读书一样,必须有时间计划,deadline是第一生产力。 合理的制定计划可能需要你先全局掌握一下代码的结构,以及各个函数的重要程度、难易程度。 2.选择一本好书 作为学习资料,书一定是最好的。 网上资料太零散,学习起来可能不系统; 较为系统的书一般都会将开源代码的配置、集成进行详细的讲解;然后会介绍一些通用模块,最后再对每一个组件或者流程进行代码的跟踪分析。 在选书的时候,也应该注意选择。 可以通过书的各个章节介绍,来看该书是否按照这样的逻辑去讲述。 例如,笔者当初学习openstack的时候,根据目录选择了这样一本书:他的四个篇幅分别是基础-安装-代码-二次开发。这就是一个非常好的循序渐进的书。 3.选择一个好的IDE 笔者除了Java以外,全部使用Vim。当然,这完全取决于每一个人的习惯。 笔者一般比较喜欢轻量级的IDE,因此推荐一些轻量级的: Vim Sublime SourceInsight IDE的全称是集成开发环境。如果只是要将代码运行起来,只需要编译器或者解释器。代码完全可以在纯文本上进行编辑。 IDE提供更多的开发辅助功能,使得开发人员专注于代码的逻辑。 最常见的如自动纠错、代码补全、函数查询等功能。C的很多IDE还自动生成makefile,也省去很大的繁琐内容。 不过,IDE的功能性和简约型永远是一个悖论。 读者在选择IDE的时候,应当选择一个符合自己需求的IDE,不要过分追求功能强大。 一般来说,我们使用IDE可能有哪些辅助性的需求呢: 测试工具的集成 自动打包 代码定位 定制化、插件丰富 错误检查 调试 项目模板 4.下载完整版本库 完整的代码库是指反映代码迭代过程的各个历史版本。这样做有很多好处: 你可以获取代码的修改记录。 你还可以获取到完整的测试代码,当你要提交patch的时候,你可以借助版本管理工具生成针对不同版本的patch。 二、初识代码 1.阅读项目文档 大部分的开源项目都会对其架构有一定的描述,通读一下会让你项目有一个比较深入的认识。 重点关注类似Getting started、Example之类的文档,从中学习如何下载、安装、使用该项目所需要的知识。 比如openstack,官网上的网络拓扑讲解是最全面、准确的: 2.分类文件 分清楚代码库的各个文件的作用。 在恰当的时候,对所有文件做一个总体把握,有助于后续阅读代码的时候的优先级的选择。清楚哪些是核心、哪些是可以定制的。 如下是笔者收藏的nova的源码文件的部分内容: /nova/api/auth.py:通用身份验证的中间件,访问keystone; /nova/api/manager.py:Metadata管理初始化; /nova/api/ec2/__init__.py:Amazon EC2 API绑定,路由EC2请求的起点; /nova/api/ec2/apirequest.py:APIRequest类; /nova/api/metadata/__init__.py:Nova元数据服务; 。。。 。。。 刚开始写注释的时候,其实有的东西自己也不是很确定。这样的注释也没有最终能让你对代码的所有文件的关系有非常清晰的了解。 不过不要紧,在初期的时候就尝试去做这样的事情是有好处的,这可能是你掌握源码整体结构的第一步。 3.掌握开发框架 框架存在的目的就是简化开发。但是也会让代码不那么直观。 举个例子,很多用spring开发的开源软件,如果你连spring都不懂,你就会发现连代码入口都找不到。因为在开发框架下的代码都被“劫持”啦! 我们举个例子,spring+springmvc+mybatis开发web应用的时候。如果理解了这三个基础框架,你就可以很清楚的知道如下文件的作用: 所有的url对应的controller都在com.dc.controller中 所有的数据接口都在com.dc.dao中 所有的实体对象都在com.dc.entity中 所有数据接口和sql语句对应关系都在com.dc.dao.mapper中 所有的服务定义都在com.dc.service和com.dc.service.Impl中 更具体的,当我看到这样一个函数: 马上就知道是spring中的一个处理url路径时/的controller函数。 所以,如果确信开源代码使用了成熟的开发框架,请一定先熟悉该框架。 三、熟悉代码行为 1. 组件执行流程 较为复杂的系统都是分组件的,分别熟悉各个组件,理清他们之间的关系。 例如,openstack的执行流程图: 虚拟机启动过程如下: a. 界面或命令行通过RESTful API向keystone获取认证信息。 b. keystone通过用户请求认证信息,并生成auth-token返回给对应的认证请求。 c. 界面或命令行通过RESTful API向nova-api发送一个boot instance的请求(携带auth-token)。 d. nova-api接受请求后向keystone发送认证请求,查看token是否为有效用户和token。 2. 利用示例代码和单元测试 示例代码可以帮助你学会使用相关开源项目的API。 大部分的开源项目在开发的过程中,为了验证其实现的功能,都会写很多单元测试代码。这些代码其实是非常好的示例代码。 读单元测试的好处太多了,这里给大家罗列一下知乎网友总结出来的好处: 由于一个单元测试一般也就是几个小时的开发工作量,你很容易就能读懂相关的代码。 每个单元测试都是可以独立运行的,这样节省你跟踪调试的时间。 单元测试在很大程度定义了软件的功能,可以帮助你快速掌握项目的相关API。 如果你修改的开源项目的代码,你可以通过修改单元测试来验证你的修改是否正确。 注1:原文链接https://www.zhihu.com/question/19637879/answer/13545260 如果该项目有提供现成的example工程: 首先尝试按照开始文档的介绍运行example,如果运行顺利,那么恭喜你顺利开了个好头;如果遇到问题,首先尝试在项目的FAQ等文档里查找答案。 再次,可以将问题(例如异常信息)当成关键词去搜索,查找相关的解决办法,你遇到了,别人一般也会遇到,热心的朋友会记录下解决的过程。 最后,可以将问题提交到项目的邮件列表,请大家帮你看看。在没有成功运行example之前,不要尝试修改example。 运行了第一个example之后,尝试根据你的理解和需要修改example,测试高级功能等。 3. 跟踪分析 复杂的开源软件几乎没有一个是一个流程走到底的,这个时候就需要我们选择一个主要流程。 例如,在openstack中,笔者一开始就画了大量功夫去梳理创建虚拟机的流程。 第一步,从代码入口处沿着创建虚拟机这条流程进行一行一行的注释: 当该流程基本注释完成,自己也有所掌握后,抽丝剥茧,总结出更为直观、简介的表现方式: 当你逐渐理解了一个或者两个主要流程后,一般会发现其他的分支流程都十分类似。这就为掌握整个流程打下了很好的基础。 4. 对需要详细了解的函数进行排序 在安排自己深入阅读时,应该根据预估的工作量进行合理安排。 一般来说,初始化、读取参数等都是次要的,也是相对简单的。而核心模块就复杂的多。 还是以haproxy为例,main函数中最核心的代码就是run_poll_loop()。 笔者曾经尝试从init()函数开始,但是发现很多初始化的数据压根就不知道干什么,看过一遍后就都什么都记不得了。 但是直接从主函数开始,不断的发现对一些参数进行处理的时候,反向追踪他的初始化过程,则更容易理解。 四、掌握数据状态 1. 掌握数据流 从数据流的角度来讲,所有的代码逻辑都是在加工数据。 比如说openstack,从最初用户输入的虚拟机名称、配置等数据开始,openstack的代码逻辑对数据进行加工、处理、过滤、选择等内容,最终传递给libvirt,进行虚拟机的最后创建。 因此,掌握数据的组织方式,对理解代码逻辑是很有帮助的,也是二次开发的前提条件。 所以,在学习代码的时候,不断询问自己,我掌握数据的组织方式了吗?我掌握数据在整个流程中不断加工的流程了吗? 2. 使用debug观察数据状态 前面说到细化研究某一个流程的时候,一定要注意研究数据传递的方式和内容。数据流是理解流程的基础,扩展数据流也是二次开发常用的技能。 例如,在eclipse通过debug打断点,获取流程中某个点的数据内容: 3. 使用标准输出观察数据状态 笔者有时候也喜欢直接使用console进行输出,打印对象的一些信息。这个用于验证某段代码有没有被执行、或者查看某个数据的时候,也十分有效。 例如,通过chrome的标准输出查看javascript的输出: 五、举一反三阶段 1.研究底层调用 研究底层调用往往是运维的常用手段。比如在openstack的运行初期,我们对openstack的源码不熟悉,怎么办呢? 直接研究openstack的底层调用。Openstack底层都是调用libvirt的接口,创建虚拟机等基本操作我们都研究了个遍。 因此,对于大多数openstack的问题,我们都能直击问题现场,进行恢复和排查。 那研究底层调用对理解源代码有什么好处呢? 笔者在基本熟悉了openstack的所有底层调用之后,带着这样的问题去看源码“代码究竟是如何从入口逐渐运行到我所知道的那个底层调用的呢?”,笔者很快就梳理了代码的执行流程。 2. 学会在社区或者stackoverflow提问题 社区里面的热心人是相当多的。 当然笔者认为,提问也需要一定的技巧,这里引用知乎网友的话: stackoverflow很多人问问题有一个共性,就是对提出的问题先发表自己的见解,描述自己的思路,自己达到了什么地方,这是对各位回答者的尊重。 你在阐述自己所能达到的地步,你表明了你已经做出了什么样的努力,这是你对问题的诚意。 这样回答者才会觉得有回答的价值,或许是想起自己过去也曾经小白却努力的岁月,或许是觉得你有相助的价值,或者等等。所谓自助者人助罢了。 原文链接:http://www.zhihu.com/question/24228283/answer/27102646 3. 学会画流程图 流程图可以更方便的展现代码执行的逻辑。忽略不重要的代码,强调主要的函数。 概要设计中常用的框图: 思维导图: 作者:陈晨 来源:51CTO

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

用户登录
用户注册