云原生(六)、CICD - Jenkins快速入门

Jenkuns快速入门

一、CICD概述

CICD是持续集成(Continuous Integration)和持续部署(Continuous Deployment)的缩写。它是软件开发中的一种流程和方法论,旨在通过自动化的方式频繁地将代码集成到共享存储库中,并自动部署到生产环境中。

  • 持续集成(Continuous Integration):开发者将代码频繁地合并到共享存储库中,然后自动运行测试以确保代码的质量和稳定性。这有助于发现和解决潜在的问题,并促使开发团队保持代码库的健康状态。

  • 持续部署(Continuous Deployment):一旦代码通过了持续集成的测试,并且达到了部署到生产环境的标准,就可以自动地将代码部署到生产环境中,以供最终用户访问和使用。这可以大大减少发布新功能或修复bug的时间,提高交付速度。

传统软件开发流程:

1、项目经理给你们分配模块开发任务给开发人员(项目经理-开发)

2、每个模块单独开发完毕(开发),单元测试(测试)

3、开发完毕后,集成部署到服务器(测试、运维)

4、测试出现问题,提交bug,开发继续修复bug(开发)

5、bug修改完毕,继续提交测试…

问题:

1、模块之间依赖负载,集成部署经常出问题

2、测试人员经常在等待…

3、按时交付也会出问题

思考:

1、测试时间能否提前(开发一提交代码,问题就能直接暴露出来:自动化测试)

2、人工集成部署(能否使用自动化工具构建)

持续集成

持续集成的好处:

1、自动化集成部署,提高了集成效率。

2、更快的修复问题。

3、更快的进行交付。

4、提高了产品质量。

DevOps

DevOps是一种软件开发和IT运维(Operations)的方法论或文化。它旨在通过改进开发团队和运维团队之间的沟通、协作和集成,以实现更快、更可靠的软件交付。DevOps强调自动化、持续集成(Continuous Integration)、持续交付(Continuous Delivery)、持续部署(Continuous Deployment)等实践,以便将软件的开发、测试和部署过程整合到一个无缝的流程中。通过DevOps实践,团队可以更快地响应用户需求,更快地交付软件,并且更容易地应对市场变化和技术挑战。

二、GitLab安装使用

1、安装
# 拉取镜像
docker pull gitlab/gitlab-ce#创建目录
mkdir -p /home/gitlab/etc
mkdir -p /home/gitlab/data
mkdir -p /home/gitlab/logs#启动容器
docker run --name="gitlab" -d --hostname=139.9.199.4 -p 4443:443 -p 8888:80 -p 8022:22 -v /home/gitlab/etc:/etc/gitlab -v /home/gitlab/data:/var/opt/gitlab -v /home/gitlab/logs:/var/log/gitlab --privileged=true gitlab/gitlab-ce:latest#查看启动日志
docker logs -f gitlab#配置修改
#cd /home/gitlab/etc/gitlab.rb
external_url 'http://139.9.199.4'# /home/gitlab/data/gitlab-rails/etc/gitlab.yaml#查看初始密码
cat /home/gitlab/etc/initial_root_passwordPassword: BjIDRuFBLJpw8RqsbR//VOBAOYkE4nu0eN7mM/FLLJs=

使用用户名root+上面获得的密码登录
请添加图片描述
请添加图片描述
登录成功后先修改密码,初始密码只保留24h

2、使用

直接像使用git一样使用

yum update -y
yum install git -y
git version

由于centos停止维护,安装git时,镜像源的安装存在问题。解决方案

#克隆项目git config --global user.name "Administrator"git config --global user.email "admin@exmple.com"git config --global credential.helper storegit clone http://139.9.199.4:8888/root/base-test.gitcd base-testtouch README.mdgit add .git commit -m "update"git push -u origin main

三、Jenkins

中文官方文档
Jenkins是一个开源的持续集成(CI)和持续部署(CD)工具,用于自动化软件开发过程中的构建、测试和部署。它允许开发团队在一个可视化的界面中设置和管理工作流程,以确保代码的频繁集成和部署。

Jenkins的主要功能包括:

  1. 持续集成:Jenkins可以定期或在代码提交时触发构建过程,自动编译源代码、运行测试并生成构建报告。

  2. 持续部署:通过Jenkins可以设置自动化的部署流程,一旦代码通过了测试,就可以自动部署到生产环境中。

  3. 插件生态系统:Jenkins具有丰富的插件生态系统,使得它可以与各种不同的工具和技术集成,如版本控制系统(如Git、SVN)、构建工具(如Maven、Gradle)、测试框架(如JUnit、Selenium)等等。

  4. 可扩展性:Jenkins是一个可扩展的平台,可以根据具体的需求定制和扩展功能。

  5. 可视化界面:Jenkins提供了直观的用户界面,使得用户能够轻松地查看和管理构建和部署任务。

Jenkins是一个强大而灵活的工具,可以帮助开发团队实现持续集成和持续部署,从而提高软件交付的质量和效率。

1、使用docker安装jenkins
docker run -u root --rm -d -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean 
  • 根据提示获取登录密码
 cat /var/jenkins_home/secrets/initialAdminPassword

请添加图片描述

  • 安装推荐插件

安装前,需要更换配置文件中的外网访问地址

#进入目录  cd /var/jenkins_home/updates
#替换default.json的外网地址
sed -i 's/https:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.jsonsed -i 's/https:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json

修改完成后开始安装请添加图片描述

  • 部分插件安装成功,直接继续,填写信息。保存并完成
    请添加图片描述
  • 不要重启,直接刷新页面,重启容器会挂掉
    请添加图片描述
2、安装插件 gitlab docker

请添加图片描述

3、纠正未成功安装的插件

请添加图片描述
纠正完成后重启容器即可。

四、JenKins使用

1、使用案例: Hello-JenKins

新建流水线项目,添加脚本

//最外层的 pipeline
pipeline {
//agent环境agent {docker 'maven;3.3.3'}//步骤的集合stages {//分步骤stage('build'){steps{sh 'mvn --version'}}stage('Test'){steps{sh 'echo "test"'}}}
}

通过菜单栏的 Blue Ocean查看具体信息。请添加图片描述

2、超时重试

开发与测试常用到的命令。retry、timeout

pipeline {agent anystages {stage('build'){steps{retry(3){sh './start.sh'}timeout(time:3,unit:'MINUTES'){//未来会有许多的测试脚本sh './health-check.sh'}}}}
}
3、钩子函数

生命周期函数,当pipeline执行到某一个步骤时,做一些特殊的事件。post

pipeline {agent anystages {stage('TEST'){steps{retry(3){sh ‘echo "fail";exit 1'}	}}post {always {echo 'always'}success{echo 'success'}failure{echo 'failure'}unstable{echo 'unstable'}changed{echo 'changed'}}}
}
4、定义执行环境

您可能已经注意到每个示例中的 agent指令。agent 指令告诉jenkins在哪里以及如何执行Pipeline或者Pipeline子集。正如您所预料的, 所有的Pipeline都需要 agent 指令,
在执行引擎中,指令会引起以下操作的执行:

  • 所有在块block中的步骤steps会被]enkins保存在一个执行队列中。 一旦一个执行器 executor 是可以利用的,这些步骤将会开始执行。

  • 一个工作空间 workspace 将会被分配,工作空间中会包含来自远程仓库的文件和一些用于Pipelin的工作文件

  • 工作目录为 /var/jenkins_home/workspace

在Pipeline中可以很容易的运行 Docker 镜像和容器。 Pipeline可以定义命令或者应用运行需要的环境和工具,不需要在执行代理中手动去配置各种各样的系统工具和依赖。 这种方式可以让你使用 Docker容器工具包 中的任何工具

pipeline {agent anystages {//执行步骤dockerfiledocekrcomposeshell其他程序的相关命令。。。}
}

例子

pipeline {agent {docker {image 'node:7-alpine'}}stages {//执行步骤stage('TEST'){steps {sh 'node --version'}}}
}

请添加图片描述

5、环境变量

配置全局的环境变量environment。这个配置在所有的step中都可以使用。

pipeline {agent anyenvironment {DB_PSD = '123456'DB_ENGINE = 'sqlite'}stages {//执行步骤stage('Build'){steps {sh 'printenv'}}}
}	

请添加图片描述

6、多步骤
pipeline {agent anyenvironment {DB_PSD = '123456'DB_ENGINE = 'sqlite'}stages {//项目构建stage('Build'){steps {//git、dockerfile等构建工作。。。echo 'Build'}}//项目测试stage('Test'){steps {//shell测试、web测试、压测。。。echo 'Test'}}//部署stage('Deploy'){steps {//访问、集群、分布式。。。echo 'Deploy'}}}
}

会产生多个步骤的进程任务,方便管理与排查
请添加图片描述

7、人工确认

人工确认后,完成上线发布的工作。input

pipeline {agent anyenvironment {DB_PSD = '123456'DB_ENGINE = 'sqlite'}stages {//项目构建stage('Build'){steps {//git、dockerfile等构建工作。。。echo 'Build'}}//项目测试stage('Test'){steps {//shell测试、web测试、压测。。。echo 'Test'}}//人工确认stage('isSure'){steps {input "是否确认发布上线"}}//部署stage('Deploy'){steps {//访问、集群、分布式。。。echo 'Deploy'}}}
}

请添加图片描述
请添加图片描述

五、WebHook触发器

通过以上的步骤。我们有了自己的gitlab,也学会了jenkins的CICD。现在,我们想做的是,一旦我的代码提交,jenkins就自动触发服务更新。

首先关闭防火墙,使容器之间互通! system stop firewalld

1、构建触发器,自动触发构建!有一个webhook触发器!

逻辑:提交代码后,jenkins能够感知到代码提交了,流水线工程(项目打包,构建镜像,运行容器,测试接口,人工确认,部署上线)就自动执行

2、创建一个jenkins流水线。配置gitlab的触发器,生成Secret token请添加图片描述
在gitlab的项目中设置项目的webhook请添加图片描述
成功后,可以在项目中看到多出一个钩子请添加图片描述
测试

通过gitlab钩子中的测试push操作,会发现jenkins自动触发了构建。并且描述为Started by GitLab push by Administrator请添加图片描述
请添加图片描述

六、官方流水线项目

官方文档 :https://www.jenkins.io/zh/doc/tutorials/build-a-java-app-with-maven/

1、clone 仓库到本地,然后推倒我们自己的gitlab中

git clone https://github.com/jenkins-docs/simple-java-maven-app.git

2、重复上一小节webhook的内容,实现一个流水线工程。

3、添加脚本代码时,不需要再自己编写,直接使用仓库中的jenkins脚本,指定jenkinsfile文件的路径。

4、添加jenkins脚本的git地址时,会出现权限问题,需要在jenkins全局配置中添加gialab的token凭证。

#jenkins脚本文件的内容
pipeline {agent {docker {image 'maven:3.9.0'args '-v /root/.m2:/root/.m2'}}stages {stage('Build') {steps {sh 'mvn -B -DskipTests clean package'}}stage('Test') {steps {sh 'mvn test'}post {always {junit 'target/surefire-reports/*.xml'}}}stage('Deliver') {steps {sh './jenkins/scripts/deliver.sh'}}}
}

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

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

相关文章

Jira 软件缺陷管理 (软件测试)

内容来源:总结黑马课程 1.软件缺陷信息 2.创建缺陷问题 2.1 缺陷模板 2.2 创建缺陷问题模板

vite+vue3使用模块化批量发布Mockjs接口

在Vue3项目中使用Mock.js可以模拟后端接口数据,方便前端开发和调试。下面是使用vitevue3使用模块化批量发布Mockjs接口的步骤: 1. 安装Mock.js 在Vue3项目的根目录下,使用以下命令安装Mock.js: npm install mockjs --save-dev …

flutter Got socket error trying to find package nested at

flutter Got socket error trying to find package nested at xxx 报错信息:“Got socket error trying to find package nested at” 通常出现在Flutter尝试从pub.dev获取依赖包时,由于网络问题导致无法连接到pub.dev或者无法正确解析包的路径。 例如&…

element-ui inputNumber 组件源码分享

今日简单分享 inputNumber 组件的实现原理,主要从以下四个方面来分享: 1、inputNumber 组件的页面结构 2、inputNumber 组件的属性 3、inputNumber 组件的事件 4、inputNumber 组件的方法 一、inputNumber 组件的页面结构。 二、inputNumber 组件的…

HarmonyOS实战开发-使用List组件实现导航与内容联动的效果。

1 卡片介绍 使用ArkTS语言,实现一个导航与内容二级联动的效果。 2 标题 二级联动(ArkTS) 3 介绍 本篇Codelab是主要介绍了如何基于List组件实现一个导航和内容的二级联动效果。样例主要包含以下功能: 切换左侧导航&#xff…

【ROS 笔记1】Topic message通俗理解

前言: topic 能够将所有的独立的模块, 进行有序的交流,链接。 可以想象, roscore, 假设是一个铁路系统的总的开关,当打开总的开关(run roscore), 铁路路就可以畅通起来, 铁路畅通后, 如何进行北京站(机器人recognition)与上海站(机器人抓取)的交流。 那么我们可以从…

iOS UIFont-实现三方字体的下载和使用

UIFont 系列传送门 第一弹加载本地字体:iOS UIFont-新增第三方字体 第二弹加载线上字体:iOS UIFont-实现三方字体的下载和使用 前言 在上一章我们完成啦如何加载使用本地的字体。如果我们有很多的字体可供用户选择,我们当然可以全部使用本地字体加载方式,可是这样就增加了…

新能源汽车充电桩常见类型及充电桩站场的智能监管方案

随着新能源汽车市场的迅猛发展,充电桩作为支持其运行的基础设施,也呈现出多样化的类型。这些充电桩不仅在外形和功能上存在差异,更在充电速度、充电方式以及使用场景等方面展现出独特的优势。 一、充电桩类型及区别 1、慢充桩(交…

【力扣】300. 最长递增子序列(DFS+DP两种方法实现)

目录 题目传送最长递增子序列[DFS 方法]DFS方法思路图思路简述代码大家可以自行考虑有没有优化的方法 最长递增子序列[DP]方法DP方法思路图思路简述代码方案 题目传送 原题目链接 最长递增子序列[DFS 方法] DFS方法思路图 思路简述 对于序列中的每一个数字只有选择和不选择两…

CVE-2023-38408漏洞修复 - 升级openssl和openssh

CVE-2023-38408 OpenSSH 代码问题漏洞修复 - 升级openssl和openssh ※ 重要说明: 1、升级后会导致无法用ssh远程登录,提示“Permission denied, please try again.” 2、解决方案请查看本章节【三、解决升级后无法用ssh远程登录】 目录 CVE-2023-38408 O…

神经网络与深度学习(一)

线性回归 定义 利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法 要素 训练集(训练数据)输出数据拟合函数数据条目数 场景 预测价格(房屋、股票等)、预测住院时间&#…

什么是防火墙,部署防火墙有什么好处?

与我们的房屋没有围墙或界限墙一样,没有防护措施的计算机和网络将容易受到黑客的入侵,这将使我们的网络处于巨大的风险之中。因此,就像围墙保护我们的房屋一样,虚拟墙也可以保护和安全我们的设备,使入侵者无法轻易进入…

API成网络攻击常见载体,如何确保API安全?

根据Imperva发布的《2024年API安全状况报告》,API成为网络攻击者的常见载体,这是因为大部分互联网流量(71%)都是API调用,API是访问敏感数据的直接途径。根据安全公司Fastly的一项调查显示,95%的企业在过去1…

送朋友的生日祝福静态页面代码!(小白也能轻松GET!)

Hey亲爱的小白们!👋 知道你们想给朋友一个独特又有心的生日祝福,却苦于没有编程基础吗?别担心,来白嫖!🎁 🚀【生日祝福静态页面代码】来啦!只需简单几步,就能…

python--os和os.path模块

>>> import os >>> #curdir #获取当前脚本的绝对路径 >>> os.curdir . >>> import os.path >>> #获取绝对路径 >>> os.path.abspath(os.curdir) C:\\Users\\GUOGUO>>> #chdir #修改当前目录 >&g…

springboot上

springboot spring概述 https://spring.io 特点 springboot主要特性 依赖管理 场景starter 自动配置 默认包和扫描路径 自定义包扫描路径 spring配置介绍 yml书写 常用注解介绍

【第三方登录】Twitter

创建应用 APPID 和 相关回调配置 重新设置api key 和 api secret 设置回调和网址 还有 APP的类型 拿到ClientID 和 Client Secret 源码实现 获取Twitter 的登录地址 public function twitterUrl() {global $db,$request,$comId;require "inc/twitter_client/twitte…

线程安全(二)--死锁

TOC 一:什么是死锁??? public class Demo1 {public static void main(String[] args) {Object lockernew Object();Thread threadnew Thread(()->{synchronized(locker){synchronized (locker){System.out.println("hello thread");}}});thread.start();} }上…

深度学习入门简单实现一个神经网络

实现一个三层神经网络 引言测试数据 代码 引言 今天我们实现一个简单的神经网络 俩个输入神经元 隐藏层两个神经元 一个输出神经元 激活函数我们使用sigmoid 优化方法使用梯度下降 我们前期准备是需要把这些神经元的关系理清楚 x1:第一个输入 x2:第二个…

python中pow()函数的使用

在Python中,pow() 函数用于计算指定数字的幂。它的语法如下: pow(x, y) 这个函数返回 x 的 y 次方。相当于 x**y。 pow() 函数也可以接受一个可选的第三个参数,用于指定一个取模值,即计算结果与该模值的余数。其语法如下&#…