Jenkins搭建 笔记总结

news2024/9/24 7:18:52

文章目录

  • 1. 什么是CI/CD(DI)?
  • 2. 环境 安装部署
  • 3. 搭建 GitLab服务器(ssh方式搭建)
  • 4. 搭建 GitLab服务器(Docker方式搭建)
    • 4.1 搭建Docker环境
    • 4.2 docker容器 安装gitlab
  • 5. GitLab 提交代码
  • 6. Jenkins 配置Maven + Git自动构建jar包(第一步)
  • 7. Jenkins 将jar包远程发送给其他服务器上并自动运行(第二步)
  • 8. publish over ssh 配置
  • 9. Pre Steps 通过SSH Publishers执行脚本文件 进行运行前清理
  • 10. Jenkins的 构建方式
  • 11. 测试报告邮件通知
  • 12. Jenkins 自动化部署到docker容器几种方式
  • 13. Jenkins集群/并发构建
  • 14. 流水线 pipeline(重点!!!,脚本式流水线)
  • 15. 比较声明式流水线 和 脚本式流水线

1. 什么是CI/CD(DI)?


CI:Continuous integration,持续集成。
CD:Continuous deployment,持续部署。

其实就可以理解为了DevOps开发兼运维的效果。

一般Jenkins在项目所处位置:
在这里插入图片描述

2. 环境 安装部署


GitLab服务器、Jenkins服务器、项目测试服务器。
在这里插入图片描述

3. 搭建 GitLab服务器(ssh方式搭建)


GitLab官方:https://about.gitlab.com/

1. 前提:准备一个6G服务器。

  • 环境依赖:安装好sshd即可。

2. 配置镜像:

curl -fsSL https://packages.gitlab.cn/repository/raw/scripts/setup.sh | /bin/bash

3. 开始安装:

sudo EXTERNAL_URL="http://192.168.43.241" yum install -y gitlab-jh

4. 记得修改密码。
在这里插入图片描述

5. gitlab常用命令。
在这里插入图片描述

按照上面就可以搭建出一个GitLab服务器来。

4. 搭建 GitLab服务器(Docker方式搭建)

4.1 搭建Docker环境


GitLab Docker镜像:https://docs.gitlab.cn/jh/install/docker.html

前提:

  • 内存至少4G
  • 系统内核至少3.10以上 uname -r 命令可查看系统内核版本

1. 更新yum源。

yum update

2. 安装依赖 和 添加镜像。

# 安装第三方包,不执行这一步,下一步的阿里镜像无法配置的!
yum install -y yum-utils device-mapper-persistent-data lvm2
# 国外镜像
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 阿里镜像
https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3. 查看源中可使用版本

# docker-ce是社区版本。
yum list docker-ce --showduplicates | sort -r
# docker-io 是以前早期的版本,版本号是 1.*,最新版是 1.13,而 docker-ce 是新的版本,分为社区版 docker-ce 和企业版 docker-ee,版本号是 17.* ,最新版是 17.12。

4. 安装指定版本

yum install docker

5. 配置开机启动项

systemctl start docker
systemctl enable docker
docker version

这样docker环境搭建完成。

4.2 docker容器 安装gitlab


1. 添加容器

docker run --detach \
  --hostname 192.168.44.103 \
  --publish 443:443 --publish 80:80 \
  --name gitlab \
  --restart always \
  --volume $GITLAB_HOME/config:/etc/gitlab:Z \
  --volume $GITLAB_HOME/logs:/var/log/gitlab:Z \
  --volume $GITLAB_HOME/data:/var/opt/gitlab:Z \
  --shm-size 256m \
  registry.gitlab.cn/omnibus/gitlab-jh:latest

2. 启动容器

docker start gitlab

3. 查看已存在的容器

docker ps -a

4. 进入容器

docker exec -it  gitlab /bin/bash

5. 访问

http://192.168.44.101

6. 当首次运行出现502错误的时候排查两个原因

1. 虚拟机内存至少需要4g
2. 稍微再等等刷新一下可能就好了

7. 获取管理员账号登录

  • 用户名:root ,密码存在下面文件中,登录后需要改密码不然24小时之后会失效。
cat /etc/gitlab/initial_root_password

5. GitLab 提交代码


根据git操作进行提交就行了。
在这里插入图片描述

6. Jenkins 配置Maven + Git自动构建jar包(第一步)


1.创建一个maven任务。


2.填写git地址。
在这里插入图片描述
在这里插入图片描述


3. Maven配置

  • 系统全局配置:
    在这里插入图片描述

  • 全局以及任务中可能还需要配置setting文件的位置:
    在这里插入图片描述


4. Root POM配置。

  • 如果git上面有多个项目,那么就一节一节路径的找。
    在这里插入图片描述

javahome配置(可选):

/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64
export JRE_HOME=$JAVA_HOME/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH

jdk
/etc/alternatives/jre_openjdk
source /etc/profile 立即生效

问题: 报错找不到jdk?

默认yum安装java的时候会显示安装的是openjdk1.8 实则实际上只安装了jre
yum install -y java-devel


完成以上内容:就实现了git远程仓库拉取代码,maven构建构建出项目jar包

7. Jenkins 将jar包远程发送给其他服务器上并自动运行(第二步)


第一步:安装一个插件:Publish Over SSH。

在这里插入图片描述

通过Publish Over SSH 可以根据ssh进行一个文件传送实现。

8. publish over ssh 配置

首先,准备一台测试服务器(建议使用docker)。

在系统配置中,进行配置服务器。

之后,再配置 任务项目的配置 参考如下:
在这里插入图片描述

解释一下执行命令的操作:

nohup java -jar /root/dev/demo*.jar >mylog.log 2>&1 &

# >mylog.log的作用:将日志导入mylog.log中。 
# 2>&1的作用,如下:
# 数据流重定向:
数据流重定向就是将某个命令执行后应该要出现在屏幕上的数据传输到其他地方

标准输入(stdin):代码为0,使用<<<;
标准输出(stdout):代码为1,使用>>>;
标准错误输出(stderr):代码为2,使用2>2>>

\> 覆盖写
\>> 追加写

9. Pre Steps 通过SSH Publishers执行脚本文件 进行运行前清理

可以配置一个脚本,从而杀死之前运行的进程:

  • 配置sh脚本如下:
#!/bin/bash

#删除历史数据
rm -rf xxoo

appname=$1
#获取传入的参数
echo "arg:$1"


#获取正在运行的jar包pid
# awk '{printf $2}'的作用:获取第2个数据,也就是进程id
pid=`ps -ef | grep $1 | grep 'java -jar' | awk '{printf $2}'`

echo $pid

#如果pid为空,提示一下,否则,执行kill命令
#使用-z 做空值判断
if [ -z $pid ];
        then
                echo "$appname not started"

        else
               kill -9 $pid
                echo "$appname stoping...."

check=`ps -ef | grep -w $pid | grep java`
if [ -z $check ];

        then
                echo "$appname pid:$pid is stop"
        else
                echo "$appname stop failed"

fi


fi

10. Jenkins的 构建方式


在这里插入图片描述

  • 快照依赖构建/Build whenever a SNAPSHOT dependency is built
    • 当依赖的快照被构建时执行本job
  • 触发远程构建 (例如,使用脚本)
    • 远程调用本job的restapi时执行本job(例如:git的webhook钩子调用,或者直接用浏览器发送对应的url地址也能调用。)
  • job依赖构建/Build after other projects are built
    • 当依赖的job被构建时执行本job
  • 定时构建/Build periodically
    • 使用cron表达式定时构建本job
  • 向GitHub提交代码时触发Jenkins自动构建/GitHub hook trigger for GITScm polling
    • Github-WebHook出发时构建本job
  • 定期检查代码变更/Poll SCM
    • 使用cron表达式定时检查代码变更,变更后构建本job

Jenkins cron表达式的 定时构建:

标准cron官方地址:https://crontab.guru

Jenkins cron不是标准的cron表达式

第一个 * 表示每个小时的第几分钟,取值0~59

H * * * *
H:每小时执行一次

第二颗 * 表示小时,取值0~23

* 15 * * * 表示每天下午3点
* 1 * * *  表示每天凌晨1点

第三颗 * 表示一个月的第几天,取值1~31
* 1 5 * *  表示每月5日凌晨1点

第四颗 * 表示第几月,取值1~12
* 15 5 1 *  表示每年几月执行

第五颗 * 表示一周中的第几天,取值0~7,其中0和7代表的都是周日

“/”

表示每隔多长时间,比如 */10 * * * * 表示 每隔10分钟

“H”

hash散列值,以job名取值,获取到以job名为入参的唯一值,相同名称值也相同,这个偏移量会和实际时间相加,获得一个真实的运行时间

意义在于:不同的项目在不同的时间运行,即使配置的值是一样的,比如 都是15 * * * * ,表示每个小时的第15分钟开始执行任务,那么会造成同一时间内在Jenkins中启动很多job,换成H/15 * * * *,那么在首次启动任务时,会有随机值参与进来,有的会在17分钟启动 有的会在19分钟启动,随后的启动时间也是这个值。这样就能错开相同cron值的任务执行了。

H的值也可以设置范围

H * * * *表示一小时内的任意时间

*/10 * * * *每10分钟

H/10 * * * *每10分钟,可能是7,17,27,起始时间hash,步长不变

45 3 * * 1-6 每个周一至周六,凌晨3点45 执行1次

45 3-5 * * 1-6 每个周一至周六,凌晨3点45 ,凌晨4点45,凌晨5点45 各执行1次

H(40-48) 3-5 * * 1-6 在40~48之间取值 其他同上

45 3-5/2 * * 1-6 每个周一至周六,凌晨3点45 ,凌晨5点45 各执行1次

45 0-6/2 * * 1-6 * * 1-6 0点开始,每间隔2小时执行一次 0:45、2:45、4:45


使用Poll SCM 方式与Build periodically一样,也是用的cron表达式操作。

会主动定期检查代码托管服务器上是否有变化,一旦发生变化执行job构建

11. 测试报告邮件通知


使用163免费邮箱发送邮件时注意密码填认证码,也就是发送手机短信后给的那个,不要用登录邮箱的密码。

类似下面。。

KDWJUWEQBWYOYGDC   

进入163网易邮箱开启一个POP3/SMTP服务:获取到密钥。

请添加图片描述

**需要去系统配置里面配置Location 、邮件通知、Extended E-mail Notification。*请添加图片描述

12. Jenkins 自动化部署到docker容器几种方式


第一种方式:通过docker外挂目录

docker run -d -p 8080:8080 --name demo-out -v /root/jarfile/demo-1-0.0.1-SNAPSHOT.jar:/app.jar openjdk:11 java -jar app.jar

第二种方式:docker容器打包。

  • 查看官方的镜像地址(搜索jdk):https://hub.docker.com/_/openjdk

第三种方式:docker镜像创建,之后再容器打包。

13. Jenkins集群/并发构建


集群化构建可以有效提升构建效率,尤其是团队项目比较多或是子项目比较多的时候,可以并发在多台机器上执行构建

14. 流水线 pipeline(重点!!!,脚本式流水线)


流水线既能作为任务的本身,也能作为Jenkinsfile

使用流水线可以让我们的任务从ui手动操作,转换为代码化,像docker的dockerfile一样,从shell命令到配置文件,更适合大型项目,可以让团队其他开发者同时参与进来,同时也可以编辑开发Jenkinswebui不能完成的更复杂的构建逻辑,作为开发者可读性也更好。

完整语法:

  • 5个必备的组成部分
pipeline:整条流水线
agent:指定执行器
stages:所有阶段 
stage:某一阶段,可有多个
steps:阶段内的每一步,可执行命令

项目任务的pipeline中执行自动化构建如下:

pipeline {
    agent any

    tools {
        maven 'maven3.8.7'
    }

    stages {
        stage('git操作') {
            steps {
                echo 'git操作'
                git 'https://gitee.com/itholmes/demo-server.git'
            }
        }
        stage('maven build') {
            steps {
                echo 'mvn操作'
                sh 'mvn clean package'
            }
        }

        stage('delete file'){
            steps {
                sshPublisher(publishers: [sshPublisherDesc(configName: 'centos-test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''rm -rf *
docker stop demo-project-pipeline
docker rm demo-project-pipeline 
docker rmi demo-project-pipeline ''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '/root')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            }
        }

        stage('send file'){
            steps {
                echo '发送jar和Dockerfile'
                sshPublisher(publishers: [sshPublisherDesc(configName: 'centos-test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'demo-project-pipeline/jarfile', remoteDirectorySDF: false, removePrefix: 'target/', sourceFiles: '**/demo-server*.jar'), sshTransfer(cleanRemote: false, excludes: '', execCommand: '''cd demo-project-pipeline/
docker build -t demo-project-pipeline .
docker run -d -p 12346:12345 --name demo-project-pipeline demo-project-pipeline''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'demo-project-pipeline/', remoteDirectorySDF: false, removePrefix: 'Docker/', sourceFiles: '**/Dockerfile')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            }
        }
    }
}

两种方式:第一种可以直接配置在Jenkins ,第二种也可以远程走Jenkins。

  • 一般配到项目里面,像这种Dockerfile和groovy配置文件。
    在这里插入图片描述

blue ocean可视化界面:

  • 全新的流水线控制ui,可重复执行某阶段代码
  • 插件中心搜索blue ocean安装即可

流水线完成后可执行的任务

  • always 无论流水线或者阶段的完成状态。
  • changed 只有当流水线或者阶段完成状态与之前不同时。
  • failure 只有当流水线或者阶段状态为"failure"运行。
  • success 只有当流水线或者阶段状态为"success"运行。
  • unstable 只有当流水线或者阶段状态为"unstable"运行。例如:测试失败。
  • aborted 只有当流水线或者阶段状态为"aborted "运行。例如:手动取消。

15. 比较声明式流水线 和 脚本式流水线

声明式流水线:

好处

  • 更像是在Jenkins web ui中的操作
  • 可读性比较高
  • 可以使用blue ocean自动生成
  • 支持语法检查

坏处

  • 代码逻辑能力比脚本式弱,不能完成特别复杂的任务

脚本式流水线:

好处

  • 更少的代码和弱规范要求
  • 更灵活的自定义代码操作
  • 不受约束,可以构建特别复杂的工作流和流水线

坏处

  • 读写对编程要求比较高
  • 比声明式流水线代码更复杂

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【信息论与编码 沈连丰】第五章:离散信道及其信道编码

【信息论与编码 沈连丰】第五章&#xff1a;离散信道及其信道编码第五章 离散信道及其信道编码5.1 信道的分类及其描述5.2 无扰离散信道的传输特性5.3 有扰离散信道的传输特性5.4 译码准则5.5 有扰离散信道的信道编码定理5.6 信道编码定理的应用第五章 离散信道及其信道编码 5…

6\8. 语义分析和中间代码生成

6&8. 语义分析和中间代码生成 从几个问题说起&#xff1a; 要计算 34*5 的值如何计算&#xff1f;按照以前的方法&#xff0c;我们会想到利用符号栈和数值栈来完成这个运算。但是有了语法分析之后我们不再需要进行这么复杂的代码构造了。第一&#xff0c;我们可以使用自顶…

AcWing1206.剪格子——学习笔记(未AC)

题目&#xff1a;1206. 剪格子 - AcWing题库https://www.acwing.com/problem/content/description/1208/ import java.util.Scanner;public class Main {public static void main(String args[]){//读数据Scanner input new Scanner(System.in);String MN input.nextLine();S…

Apache ShardingSphere分表的简单使用和常见问题

目录 简介 什么是 Apache ShardingSphere? 分库分表的背景 使用 pom 配置 1&#xff0c;application.properties配置文件 2&#xff0c;创建配置类 分表 验证分表 常见问题 自定义分表规则未生效 简介 官网&#xff1a;Apache ShardingSphere 版本&#xff1a;4…

ArcGIS基础实验操作100例--实验42创建渔网Fishnet

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验42 创建渔网Fishnet 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&a…

深度学习推理框架调研总结

深度学习推理框架1.移动端深度学习推理框架调研1.1 小米的MACE&#xff08;2017&#xff09;1.2 阿里的MNN1.3 腾讯的TNN1.4 ARM的tengine1.5 百度的paddle-mobie1.6 Facebook的Caffe2&#xff08;*&#xff09;1.7 Google的TensorFlow Lite &#xff08;*&#xff09;1.8 Appl…

南京晓庄操作系统期末复习【背诵部分】

操作系统期末复习背诵部分第一章1.操作系统的特征&#xff1a;2.操作系统的最基本特征是什么&#xff0c;为什么3.操作系统的目标4.操作系统的主要功能5.计算机资源6.多道程序设计时应解决什么问题7.三种操作系统及特点第二章1.进程的定义2.进程的特征3.进程的三种基本状态4.进…

Spark04: Transformation与Action开发

一、创建RDD的三种方式 RDD是Spark编程的核心&#xff0c;在进行Spark编程时&#xff0c;首要任务是创建一个初始的RDD这样就相当于设置了Spark应用程序的输入源数据然后在创建了初始的RDD之后&#xff0c;才可以通过Spark 提供的一些高阶函数&#xff0c;对这个RDD进行操作&a…

python学生管理系统(pyqt5 含界面)

学生管理系统项目流程 项目模块 账号登陆 人脸识别 增添学生信息 删除学生信息 改动学生信息 查询学生信息 项目主体框架 app.py为主代码&#xff0c;负责用于界面打开展示。img文件夹负责放置项目qrc的图像page文件夹为单独页面的类plugin文件夹为功能模块的类ui文件夹…

机器人中的数值优化|【一】数值优化基础

数值优化基础 凸集 Convex Sets 凸集的定义 令X是线性空间。如果对于X的子集S中的所有x和y&#xff0c;并且在区间 [0,1]中的所有t&#xff0c;点 (1−t)xty(1-t)x ty(1−t)xty也属于S&#xff0c;则S称为凸集。 不失一般性&#xff0c;对于所有的凸集&#xff0c;其线性组…

Zookeeper详解(二)——API 事件监听

Java API znode是zooKeeper集合的核心组件&#xff0c;zookeeper API提供了一小组方法使用zookeeper集合来操纵znode的所有细节。 客户端应该遵循以下步骤&#xff0c;与zookeeper服务器进行清晰和干净的交互。 连接到zookeeper服务器。zookeeper服务器为客户端分配会话ID。…

uniapp 之 接入小程序客服

目录 前言 小程序客服 代码只需要一步 配置也需要一步​​​​​​​ 前言 小程序客服 因老大 看到别人家有在线客服这个功能&#xff0c;就让我也做一个&#xff0c;这个功能很简单 效果图1 代码只需要一步 <button type"default" open-type"con…

MATLAB | 绘图复刻(六) | 分组环形热图

有粉丝问我Ecology Letters, (2021) 24: 1018–1028 Soil carbon persistence governed by plant input and mineral protection at regional and global scales 这篇文章中的Figure 2咋画&#xff0c;原图长这样&#xff1a; 复刻效果&#xff1a; 完整步骤 0 数据定义 按…

node.js创建网站实例1

1.node.js安装 我的电脑环境&#xff1a;win10 网址&#xff1a;https://nodejs.org/en/ 我下载了18.12.1版本 一路next默认安装&#xff0c;安装完成后&#xff0c;运行cmd&#xff0c;查看版本号 会同时安装npm&#xff0c;也可以同时查看版本号 2.创建第一个网站实例hell…

内卷对于2022是一种无奈,也是一种修行

其实我们谁也不知道2023年对于我们普通的开发人员来说会有什么样的试炼&#xff0c;因为2022年身边有太多的人&#xff0c;为了工作&#xff0c;为了生活&#xff0c;为了家庭&#xff0c;为了理想&#xff0c;不得不选择走向别人看似很卷的那条路。 对于我们周围的人来说&…

【Vim】基本操作及命令集详解

概述 Vim 是从 vi 发展出来的一个文本编辑器。vi 内置在Linux系统中&#xff0c;是vim的简化版编辑器&#xff0c;vim则需要进行安装使用。Vim代码补全、编译及错误跳转等方便编程的功能特别丰富&#xff0c;可以实现高效率移动和高效的输入&#xff0c;在程序员中被广泛使用。…

CPT203-Software Engineering(3)

文章目录9. Software Design9.1 Architecture Design9.1.1 Architectural patterns9.2 Component-level Design9.2.1 Component9.2.2 Views of component9.2.3 Component-level design process9.3 User Interface Design9.3.1 Interface Design Process9.3.2 Interface Design …

蓝桥杯Python练习题16-最大最小公倍数

资源限制   内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述   已知一个正整数N&#xff0c;问从1~N中任选出三个数&#xff0c;他们的最小公倍数最大可以为多少。 输入格式   输入一…

三维数学(一)

视频教程&#xff1a;https://www.bilibili.com/video/BV12s411g7gU?p155 向量 一个数字列表&#xff0c;表示各个维度上的有向位移&#xff1b;同时也是一个有大小有方向的物理量&#xff0c;大小及向量的模长&#xff0c;而方向即空间中向量的指向&#xff0c;可以表示物体…

TikTok Shop 越南站点收入已达Lazada 的 80%

让我们一起来看看今日都有哪些新鲜事吧&#xff01;01 TikTok Shop 越南站点收入已达Lazada 的 80% 据越南电商平台数据分析软件Metric.vn 统计&#xff0c;Shopee、Lazada、Tiki 和 Sendo 仍然主导着越南电子商务市场&#xff0c;1-11 月&#xff0c;共销售了 13 亿件产品。其…