文章目录

  • 前言
  • 一.CI/CD是什么
    • DevOps
  • 二.CI/CD流水线中的组件
    • Jenkins
    • Gogs
  • 三.Python容器化项目的CI/CD流水线设计

前言

本文的内容主要是为Python容器化项目设计一个CI/CD流水线。这个流水线中涉及到的应用有:Gogs,Jenkins,docker,Harbor,Kubernetes。本文会详细讲解如何安装以上几个应用,以及如何进行必要的设置来使流水线能够完成理想的功能。

一.CI/CD是什么

CI/CD是伴随着DevOps开发模式的兴起而产生的一种开发理念。软件开发模式的发展,从最初的瀑布模型,到后来的敏捷开发,而现在最为前沿的开发模式就是DevOps。

DevOps

DevOps(Development和Operations的组合词)是一组过程、方法与系统的统称。DevOps强调重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。

DevOps提出了持续集成(Continuous Integration)、持续交付(Continuous Delivery) 、持续部署(Continuous Deployment) 这几个重要的概念。

  • 持续集成的重点是将各个开发人员的工作集合到一个代码仓库中。通常,每天都要进行几次,主要目的是尽早发现集成错误,使团队更加紧密结合,更好地协作。
  • 持续交付的目的是最小化部署或释放过程中固有的摩擦。它的实现通常能够将构建部署的每个步骤自动化,以便任何时刻能够安全地完成代码发布(理想情况下)。
  • 持续部署是一种更高程度的自动化,无论何时对代码进行重大更改,都会自动进行构建/部署。

DevOps的出现让传统的软件开发和交付方法迅速变得过时。从历史上看,在敏捷时代,大多数公司会每月,每季度,每两年甚至每年发布部署/发布软件。然而,现在,在DevOps时代,每周,每天,甚至每天多次是常态。

二.CI/CD流水线中的组件

一个CI/CD流水线至少需要有一个持续集成工具和一个代码仓库,本文介绍的流水线选用Jenkins和Gogs,下文会详细介绍这两个工具的安装和配置。由于项目采用容器化的部署方式,所以还需要安装docker和kubernetes,而Harbor是一款非常好用的镜像仓库,docker和kubernetes的安装可以参考 使用Rancher搭建Kubernetes集群 ,Harbor的安装可以直接看Harbor官网

Jenkins

Jenkins是一个非常著名的持续集成工具,使用Java开发,主要用于持续、自动的构建/测试软件项目、监控外部任务的运行。Jenkins就像一个管理员,管理着软件集成和部署过程中各个组件的工作,使这个过程更加自动化,减轻开发人员和运维人员的工作负担。Jenkins发展到现在已经非常成熟,众多的开发者为它添加了各种各样的插件,使它几乎能为所有种类的项目做集成和构建。

下面这幅图是Jenkins的插件列表,从右侧的滑块可以看出它的插件之多

下面来详细介绍一下Jenkins的安装

首先从 Jenkins官网 下载安装包,进入下载页,选左侧更为稳定的版本

我才用的是rpm包的安装方式(我的系统是CentOS7.6),安装完成后,先修改Jenkins的配置文件
vim /etc/sysconfig/jenkins

JENKINS_HOME:设置Jenkins的存储目录,Jenkins在构建过程中会下载项目代码,所以这个目录最好还是自己专门定一个。
JENKINS_USER:设置默认用户,不设为root的话会遇到很多小问题,因为Jenkins构建项目需要用到一些组件,比如docker,不使用root用户经常会报权限问题。
JENKINS_PORT:改端口

JENKINS_HOME="/data/jenkins"
JENKINS_USER="root"
JENKINS_PORT="8000"

启动Jenkins,用浏览器访问

到指定目录下复制密码

安装推荐插件

安装过程需要等十几到几十分钟,具体看网速


创建管理员用户


安装完成

Gogs

CI/CD流水线中另一个必不可少的组件是代码仓库,代码仓库可以选GitHub,GitLab。如果是在局域网内的话,也可以用Gogs搭建一个代码仓库,轻便快捷,上传和下载速度都很快,非常好用

Gogs使用容器的方式搭建就可以了,输入命令

docker run -di --name=gogs -p 3000:3000 -p 10022:22  -v /var/gogs:/data gogs/gogs

端口映射可以自己定,浏览器中访问

选择数据库选SQLite3,其他数据库类型都比较麻烦,项目不大时这样最简便


注意域名必须要改,localhost只能你自己访问,别人访问不了,应用URL那里也记得改一下

三.Python容器化项目的CI/CD流水线设计

下图是整个CI/CD流水线的结构图。下面详细介绍下其中重要的几项配置


首先将代码上传到Gogs

在Jenkins中左侧菜单栏,选择新建Item流水线,选自由风格类型


源码管理选Git,代码地址选Gogs中的项目地址


构建可以选执行shell命令,Java项目可以使用DockerMaven插件,更加方便,Python项目就自己写脚本吧,自己写个脚本放到项目根目录下,然后在Jenkins构建命令中写两条命令,一条修改脚本执行权限,另一条执行脚本。


这是一个我写的脚本,可以自动的把我的项目构建成镜像然后部署到kubernetes集群上,可以参考一下:

#!/usr/bin/env bash
#设置rabbitmq和docker私有仓库的地址
export RABBITMQ_ADRESS=10.108.226.172
export DOCKER_REGISTRY_ADRESS=10.108.226.172:5000
export VERSION=v1.0#删除kubernetes中原有项目部署
#kubectl delete -f cetc54-server-config.yaml
#kubectl delete -f input_utils.yaml#删除之前的镜像
docker rmi ${DOCKER_REGISTRY_ADRESS}/cetc54/input_utils#构建镜像input_utils并上传到本地镜像仓库
tar -zcvf input_utils.tar.gz input_utils
mv input_utils.tar.gz ./input_utils
cd input_utils
docker build -t='input_utils' --build-arg rabbitmq_address=${RABBITMQ_ADRESS} .
docker tag input_utils ${DOCKER_REGISTRY_ADRESS}/cetc54/input_utils:${VERSION}
docker push ${DOCKER_REGISTRY_ADRESS}/cetc54/input_utils:${VERSION}
#docker run -di --name=input_utils input_utils
cd ..#删除本地镜像
docker rmi input_utils#部署到kubernetes集群
#kubectl create -f cetc54-server-config.yaml
#kubectl create -f input_utils.yaml

Jenkins配置完成后保存,点右边按钮执行构建。如果构建成功,流水线前面的圆圈会是蓝色,失败就是红色,圆圈右边一点有个天气图标,这是衡量这个项目的健康状况的,如果这个项目构建的几次种有很多次都构建失败了,那么这个天气图标就会是不好的天气,如多云,暴雨。如果构建很多次一次失败都没有,那就是晴天


左侧菜单栏,控制台输出可以查看构建日志


文本设计的这个流水线是最基础最简单的一种流水线,只用了Jenkins最基础的功能。而Jenkins是十分强大的,通过其他的配置它还能实现更复杂的功能,这里就不多介绍了

设计并搭建Python容器化项目的CI/CD流水线相关推荐

  1. Kubernetes集群搭建及容器化部署

    Kubernetes集群搭建及容器化部署 目录 一.k8s 集群部署 2 1.k8s 快速入门 2 2.k8s 集群安装 10 二.k8s 容器化部署 18 1.Kubectl命令行部署 18 2.K ...

  2. 如何从零开始搭建 CI/CD 流水线

    来源 | Saurabh Kulshrestha 译者 | 徐进 持续集成和持续部署成为现代 DevOps 趋势下的重要环节,很多角色岗位都要求 CI/CD 的相关技能.本文介绍了什么是 CI/CD ...

  3. go环境搭建_容器化 Go 开发环境的尝试

    Go语言中文网,致力于每日分享编码知识,欢迎关注我,会有意想不到的收获! 01 写在前面 昨天上午"起早"到附近的影院看<波西米亚狂想曲>,选的座位比较靠前,最后的二十 ...

  4. 手把手搭建一个容器化+代理网关+可视化管理环境

    作者 | togettoyou 来源 | SuperGopher 前言 本文主要分享个人服务器的应用部署方案现状,容器化+代理网关+可视化管理. 准备阶段 我购买的是腾讯云服务器(2 核 4GB 3M ...

  5. 利用 ELK 搭建 Docker 容器化应用日志中心

    概述 应用一旦容器化以后,需要考虑的就是如何采集位于 Docker 容器中的应用程序的打印日志供运维分析.典型的比如SpringBoot应用的日志收集. 本文即将阐述如何利用ELK日志中心来收集容器化 ...

  6. 【原】Jenkins持续集成环境搭建之创建java项目的job【centos6.5 java maven git 项目】...

    一.构建一个maven项目 在jenkins主页上,左侧,选择"新建",然后填写项目名称,选择"构建一个maven项目" 二.Git配置 保存之后,进入详细配置 ...

  7. 【项目自动发布】基于Docker/单节点Rancher/GitLab搭建简易的CI/CD流水线(备忘+补充完善)

    前言 最近面试好像也经常问到一个问题: 你们项目是怎么发布的 传统的Java项目都是本地打包成 jar包 或者 war包, 上传到服务器, 然后通过shell脚本的方式启动的 要求我们具备一定的she ...

  8. 马哥python数据分析课程设计_搭建python数据分析平台

    基本结构 其实没什么高深的东西,无非是常用的那一套: pandas, numpy, matplotlib- 但是为了更方便使用,加持了 jupyter notebook(即以前的ipython not ...

  9. prism项目搭建 wpf_新WPF项目的Prism和MVVM

    这里有几个问题,所以我会尽我最大的努力把它们都包括进去. 我在一个项目中工作,这个项目在其他框架的旁边有wpf.mvvvm和prism.最好的建议是在把它们粘在一起之前,先了解它们的力量和功能.在这种 ...

  10. Jenkins 2.X free-style CI/CD流水线搭建(一)

    前面介绍了Jenkins的安装和插件管理,这篇文章我们介绍下Jenkins free-style CI流水线的搭建.虽然现在不推荐使用这种方式搭建流水线.但是它可以帮助初学者快速了解和体验Jenkin ...

最新文章

  1. Semtech与Lacuna从太空接收信息
  2. httpurlconnect设置中文参数_CNC数控机床三菱系统参数的设置及报警解除
  3. ORA-32004 参数设置过时的解决办法
  4. C# 获得窗体句柄并发送消息(利用windows API可在不同进程中获取)
  5. Linux网络编程---I/O复用模型之epoll
  6. 字符串操作截取后面的字符串_对字符串的5个必知的熊猫操作
  7. VB:读取及设定NumLock/CapsLock/ScrollLock的值
  8. TCP/IP协议详解内容总结(怒喷一口老血)
  9. 解决Ajax请求时无法重定向的问题
  10. Java 面向对象 之 多态实例2
  11. 【实战】Axis2后台Getshell
  12. plc 触控屏 c语言开发,工业串口触摸屏在PLC工控板的人机界面应用开发示例
  13. arcgis软件环境安装
  14. wingdings字体符号在哪_wingdings2字体
  15. Lightbend就收购OpsClarity一事与InfoQ的对话
  16. 输出图案(四)----输出正多边形图案:(难度系数:半颗星)
  17. Hiveserver2源码剖析---如何实现代理用户
  18. 诚意干货:如何神不知鬼不觉破解你家路由器 | 硬创公开课
  19. react native FlatList
  20. STM32系统滴答_及不可不知的延时技巧 - (下)

热门文章

  1. html单元格竖着排列,html表格,表头竖向固定,横向滚动的例子
  2. asp.net html 扩展,StaticHtml
  3. ubuntu18.04配置ORB-SLAM3
  4. 论文笔记_S2D.51_2016-IEEE TOR_Past, Present, and Future of Simultaneous Localization and Mapping
  5. Panoptic FPN-Panoptic Feature Pyramid Networks用于全景分割的特征金字塔网络
  6. 经典的观点挖掘算法(文本挖掘系列)
  7. ROS2 Galactic Depth to World coordinate RGBD相机的深度数据转换到世界坐标系
  8. java4选择结构 二
  9. 对于文章的字母、单词、短语,(无用词表)的检索Java代码实现
  10. 15-2 mysql的数据类型