ubuntu系统安装配置gitlab+Jenkins+发布持续集成持续部署保姆级教程。

1、服务器环境

名称                              系统                                   IP                              备注

gitlab               ubuntu20.04.2图形化          192.168.26.130        要求有6G的内存

Jenkins           Ubuntu20.04.2图形化          192.168.26.110        没有硬性要求   

测试服务器     Ubuntu20.04.2图形化          192.168.26.129        没有硬性要求

2、做时间同步(所有服务器都要执行)

timedatectl set-timezone "Asia/Shanghai"       #时区改为上海

ntpdate "ntp.aliyun.com"                                  #更正时间

出现下图错误 说明本机没有安装ntpdate 

解决办法

sudo apt install ntpdate

3、安装gitlab极狐

sudo apt-get update                          #更新系统的软件包列表和版本信息

sudo apt-get install -y curl openssh-server ca-certificates tzdata perl             #下载依赖

sudo systemctl status ssh                       #查看ssh是否在运行

sudo systemctl start ssh                          #启动ssh

curl -fsSL https://get.gitlab.cn | /bin/bash                #配置极狐gitlab软件源镜像

sudo EXTERNAL_URL="http://192.168.193.130" apt-get install gitlab-jh     #开始安装gitlab

注:URL后面的参数可以是本机的IP,也可以为域名,如果设置域名需要确保域名解析到本机的IP即可。

EXTERNAL_URL 中配置的地址来访问安装成功的极狐GitLab 实例。用户名默认为 root 。如果在安装过程中指定了初始密码,则用初始密码登录,如果未指定密码,则系统会随机生成一个密码并存储在 /etc/gitlab/initial_root_password 文件中, 查看随机密码并使用 root 用户名登录。

注意:出于安全原因,24 小时后,/etc/gitlab/initial_root_password 会被第一次 gitlab-ctl reconfigure 自动删除,因此若使用随机密码登录,建议安装成功初始登录成功之后,立即修改初始密码。

gitlab常用命令

gitlab-ctl start # 启动所有gitlab组件

gitlab-ctl stop # 停止所有gitlab组件

gitlab-ctl restart # 重启所有gitlab组件

gitlab-ctl status # 查看服务状态

gitlab-ctl reconfigure # 启动服务

vim /etc/gitlab/gitlab.rb # 修改默认的配置文件

gitlab-ctl tail # 查看日志

4、登陆web页面查看

输入本机IP进行登陆

注:如果出现502错误 可以等一会再刷新看看 

默认用户是root

密码我们可以在/etc/gitlab/initial_root_password文件中进行查看

我们登陆上后先改密码

修改完成后我们再次登陆

5、将gitlab页面设置为中文

登陆gitlab页面

跟着图上标的步骤来

把页面拉到下面找到 Localization  选项

选择中文简体

在页面的最下面选择保存更改

在回到主页就可以看到已设置为中文

6、新建项目

新建项目

选择创建空白项目

7、使用命令行的方式向gitlab推送代码

 git branch -a                      #查看分支的命令

git status                           #查看当前工作目录的状态

找一个文件上传到你目录下 我的是在/root 目录下

  1. #设置用户名、邮箱为gitlab上设置的邮箱

  2. git config --global user.name "yuansui@2527.com"

  3. git config --global user.email "yuansui@2527.com"

  4. git config --global --list           #查看邮箱

#然后输入上面保存的地址

git clone http://192.168.193.130/root/java-project.git

git add .                    #把目录下的所有文件上传到git

git commit -m "你的描述"                #提交信息格式

git commit -m "测试"

git push <链接(orgin是别名)> <本地仓库>:<远程分支>

git push origin master

然后我们在浏览器可以看到下面的消息

我们上面操作推送代码的时候选择的的maser分支所以这里选择maser分支查看

下图可以看出我们推送的文件


1、Jenkins服务器安装部署

1、安装jdk17

sudo apt update                                            #更新软件包

sudo apt install openjdk-17-jdk                       # 下载jdk17

java -version                                                 #查看安装的 Java 版本信息

2、在Jenkins服务器安装git

sudo apt-get install git

echo $PATH                       #检查 PATH 变量

vim .bashrc      或者是 vim .bash_profile         #打开文件配置变量

export PATH=/usr/bin/git:$PATH                      #在文件尾部添加此变量

注意 文件路径 通常是 /usr/bin/git 或 /usr/local/bin/git

source ~/.bashrc         或者是 source ~/.bash_profile               #使命令生效

2、在Jenkins官网进行下载

Jenkins

下载Jenkins的war包到本地

将我们下载的war包传输到服务器内

启动我们的war包

java -jar jenkins.war                             #启动war包

Jenkins默认的端口是8080如果你需要指定端口的话可以使用--httpPort=选项 

java -jar jenkins.war --httpPort=8888      #启动war包并指定端口

如果启动时出现下面这种错误

解决办法

将jdk1.8升级到jdk11 错误显示最少需要jdk11

sudo apt install openjdk-11-jdk

将下图初始码复制下来

然后在网页访问本机的IP+8080端口 将上图保存的初始码粘贴到下图

创建你的管理员用户密码

3、在Jenkins服务器安装maven

sudo apt install maven                     

配置环境变量

vim .bashrc  (或 ~/.bash_profile~/.profile,取决于你使用的是哪个shell)

在文件尾部添加下行内容

export PATH=$PATH:/usr/local/maven/bin

source ~/.bashrc                       #使修改生效

mvn -v                                       #查看版本信息


2、测试服务器安装

apt install openjdk-8-jdk                   #安装java环境jdk1.8

sudo systemctl status ssh                       #查看ssh是否启动

sudo apt install -y openssh-server           #如果没安装用此命令安装

查看本机IP


3、使用Jenkins

进入Jenkins页面我们先去安装插件

安装maven

安装publish


4、Jenkins新建item

构建maven项目

源码管理设置

在gitlab上查看地址

将上图获得的地址填写在下图 

Branches to bulid 配置 根据项目分支情况进行填写

Build 配置

跳转到页面找到最下面的新建maven

maven按照配置

登陆我们gitlab的页面查看项目中我们pom.xml文件的路径

Build 配置

我们再次打开一个新的Jenkins页面

找到 Publish over SSH 选项 添加后端发布服务器信息

填写信息然后选择高级继续填写信息

然后返回我们的配置 添加后端服务器

注:如果上图的路径不知道可以按照下图查看

构建一下看是否能成功


如果你的出现下图报错

解决办法

sudo apt install -y default-jdk


在测试服查看是否有文件

我们构建的时候看输出的内容

解决办法

再次进行编译查看  通过下图我们可以看到我们的文件已经传输完成

我们在测试服务器进行查看

因为我的虚拟机是图形化的所以文件路径和你们的应该有所不同

你们的话可以直接在家目录下有root目录

如果你感觉路径太长 可以按照下图进行更改

然后我们将服务器的文件删除

再次跑一下任务

然后再次进入测试服务器进行查看 通过下图我们可以看出更简单了

接下来我们让它传输完成后自动将jar包启动起来

再次跑一下服务然后在服务器查看


5、Jenkins配置脚本

我们上面的配置可以实现文件传输后在后端服务器自动启动jar包(服务),但是有一个问题就是我们如果已经启动运行这一个jar包(一个服务),当我们在Jenkins跑服务的时候就无法启动新的jar包,端口会冲突,所以为了更加方便我们工作,我们可以写一个脚本来实现将老的jar包(服务)删除或者移动到指定文件夹,将老的服务停止,来释放端口,从而让我们新的jar包(服务)启动。

按照下图进行配置  为文件传输前的操作

这里我们先写好脚本的路径以及名字 下面我们在服务器创建脚本文件写脚本

注:脚本的服务器是我们发布服务器的路径,脚本也是在发布服务器上的

6、登陆到测试服务器写脚本

注:脚本的路径和上面我们写的路径必须要一样

vim /root/sy.sh

这是一个简单的shell脚本有需求可自己按照需求自己写

#!/bin/bash

# 删除历史数据
rm -rf /home/sy/data/my.*.jar

appname=$1

# 获取正在运行的jar包pid
pid=$(ps -ef | grep 'my' | grep 'java -jar' | awk '{print$2}')

# 如果pid为空,提示一下,否则,执行kill命令
if [ -z "$pid" ]
then
        echo "$appname 未启动"
else
        kill -9 $pid
        echo "$appname 正在停止...."
fi

# 等待一段时间,确保进程已经停止
sleep 5

# 再次检查进程是否已经停止
if ps -p $pid > /dev/null
then
        echo "$appname 停止失败"
else
        echo "$appname 已成功停止"
fi
 

7、回到Jenkins继续配置

保存后我们的配置也就完成了。

注:上面的配置可以提交代码后我们进行合并,就会自动部署更新代码也就是我们的jar包

就是说我们将新的代码提交到代码仓库,然后选择合并,在跑一下代码就可以自动将代码达成jar包自动传输到我们的服务器,脚本会自动将我们旧的jar包停止,将新的jar包启动。

但是需要我们手动的去合并和跑一下服务:下图就是跑服务  这是大多数公司常用的配置。




4、拓展(不建议配置使用)

如果你想提交代码后不用再手动去合并和跑服务可以继续按下面的操作进行配置

2、安装插件

3、打开插件的网址查看说明

Build Authorization Token Root | Jenkins pluginicon-default.png?t=N7T8https://plugins.jenkins.io/build-token-root/

4、打开gitlab进行配置

选择我们的项目

注意这一步路径别写错了

http://192.168.26.110:8080/buildByToken/build?job=first&token=112233

说明:

http://192.168.26.110:8080/                 #是你Jenkins的访问路径

buildByToken/build?job=first                #是你Jenkins上的Item项目名称

&token=112233                                    #是你项目设置的身份令牌

触发事件按你们自己需求来

5、报错解决办法

按照第5步操作完成后然后再按照第4步重新添加一下webhooks就可以了


以上配置完成了,但是不建议使用第四步扩展,这样会消耗更多的资源,而且每次提交代码都要构建一次服务 并不合理,同样也是需要手动合并才行。

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

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

相关文章

.NET/C#汇总 —— 数据库概念知识

1 为什么要⼀定要设置主键? 其实这个不是⼀定的,有些场景下,⼩系统或者没什么⽤的表,不设置主键也没关系,mysql最好是⽤ ⾃增主键,主要是以下两个原因:如果定义了主键,那么InnoDB会选择主键作为聚集索引、如果没有显 式定义主键,则innodb 会选择第⼀个不包含有NULL值…

Pytorch下张量的形状操作(详细)

目录 一、基本操作函数 二、分类&#xff1a;维度改变&#xff0c;张量变形&#xff0c;维度重排 2.1维度改变 2.2张量变形 2.3维度重排 三、实例 一、基本操作函数 在PyTorch中&#xff0c;对张量的形状进行操作是常见的需求&#xff0c;因为它允许我们重新组织、选择和…

大模型训练及推理【硬件选型指南】及 GPU 通识

我们在做大模型应用部署时&#xff08;如训练、微调、RAG&#xff09;&#xff0c;往往需要在前期就分析好硬件选型指标&#xff0c;或者我们给客户报方案之前&#xff0c;可能你已经有了一个方案&#xff0c;但是由于实践经验缺乏&#xff0c;不知道在硬件上该如何评估并上报。…

CTF练习-BUUCTF(1~25)

文章目录 Crypto题目1 一眼就解密题目解题思路flag 题目2 md5题目解题思路flag 题目3 Url编码题目解题思路flag 题目4 看我回旋踢题目解题思路1解题思路2flag 题目5 摩丝题目解题思路flag 题目6 passwd题目解题思路flag 题目7 变异凯撒题目解题思路flag 题目8 Quoted-printable…

AJAX——封装_简易axios

1.简易axios_获取身份列表 需求&#xff1a;基于Promise XHR 封装 myAxios函数&#xff0c;获取省份列表展示 步骤&#xff1a; 1.定义 myAxios函数&#xff0c;接收配置对象&#xff0c;返回Promise对象 2.发起XHR请求&#xff0c;默认请求方法为GET 3.调用成功/失败的处…

大模型日报2024-04-22

大模型日报 2024-04-22 大模型资讯 Mistral与Mixtral大型语言模型对比&#xff1a;7B、8x7B及8x22B 摘要: 最近&#xff0c;IT新闻频道广泛报道了新公开的Mixtral 8x22B模型&#xff0c;该模型在多项基准测试中超越了ChatGPT 3.5版本&#xff0c;尤其在MMLU等测试中表现突出。本…

Rust语言之简单涉猎

官方文档 简介 Rust 是一种静态类型语言。静态类型语言是指在编译时对变量和表达式进行类型检查&#xff0c;以确保类型的正确性。在 Rust 中&#xff0c;每个变量都需要在声明时指定其类型(也支持隐式声明&#xff0c;根据值判断)&#xff0c;并且在编译时会进行类型检查&am…

更全面的Embedding介绍

"Embedding"这个词在不同的上下文中有多种含义&#xff0c;以下是一些常见的解释&#xff1a; 计算机科学和人工智能&#xff1a;在机器学习和自然语言处理中&#xff0c;embedding是一种将词汇或短语映射到向量空间的技术。这些向量可以捕捉到词汇的语义含义&#x…

java中spring底层核心原理解析(2)

相关系列 java中spring底层核心原理解析&#xff08;1&#xff09;-CSDN博客 推断构造方法 spring在基于某个类生成bean的过程中&#xff0c;需要利用该学业有成的构造方法来实例化得到一个对象&#xff0c;但是如果一个类存在多个构造方法&#xff0c;spring会使用哪个呢? …

Python与数据库连接

新建表boss create table 创建表 Code import pymysqlcon pymysql.connect(hostlocalhost,\userroot,\password,\port3306,\dbbusiness) cursorcon.cursor() cursor.execute(create table if not exists boss(id int auto_increment primary key,name varchar(20)not null…

设计模式|代理模式(Proxy Pattern)

文章目录 什么是代理模式举例结构优缺点优点缺点代码示例与代理模式相近的设计模式什么是代理模式 代理模式(Proxy Pattern)是一种结构型设计模式,它允许你提供一个间接访问对象的方式,以控制对对象的访问。这种模式通常在不改变原始类代码的情况下,添加一些额外的逻辑或…

WPF2 样式布局

样式布局 WPF中的各类控件元素, 都可以自由的设置其样式。 诸如: 字体(FontFamily) 字体大小(FontSize) 背景颜色(Background) 字体颜色(Foreground) 边距(Margin) 水平位置(HorizontalAlignment) 垂直位置(VerticalAlignment) 等等。 而样式则是组织和重用以上的重要工具。…

Docker基础+虚拟化概念

目录 一、虚拟化简介 1、虚拟化概述 2、cpu的时间分片&#xff08;cpu虚拟化&#xff09; 3、cpu虚拟化性性能瓶颈 4、虚拟化工作 4.1虚拟机工作原理 4.2两大核心组件:QEMU、KVM 4.2.1QEMU&#xff1a; 4.2.2KVM&#xff1a; 5、虚拟化类型 ①全虚拟化&#xff1a; …

MySQL-数据目录

一、MySQL的主要目录结构&#xff08;MySQL 8&#xff09; [rootlocalhost ~]# find / -name mysql find: ‘/proc/30845’: 没有那个文件或目录 find: ‘/proc/30855’: 没有那个文件或目录 /etc/logrotate.d/mysql /etc/selinux/targeted/active/modules/100/mysql /etc/sel…

国内开通chatgpt plus会员方法

ChatGPT镜像 今天在知乎看到一个问题&#xff1a;“平民不参与内测的话没有账号还有机会使用ChatGPT吗&#xff1f;” 从去年GPT大火到现在&#xff0c;关于GPT的消息铺天盖地&#xff0c;真要有心想要去用&#xff0c;途径很多&#xff0c;别的不说&#xff0c;国内GPT的镜像…

微软如何打造数字零售力航母系列科普02 --- 微软低代码应用平台加速企业创新 - 解放企业数字零售力

微软低代码应用平台推动企业创新- 解放企业数字零售力 微软在2023年GARTNER发布的魔力象限图中处于头部领先&#xff08;leader&#xff09;地位。 其LCAP产品是Microsoft Power Apps&#xff0c;扩展了AI Builder、Dataverse、Power Automate和Power Pages&#xff0c;这些都包…

【26考研】考研备考计划4.22开始

A海海: 408:重中之重&#xff0c;和数学同等地位&#xff01;越早开始越好&#xff01;前期直接跟着王道视频课学习&#xff0c;教材直接用王道四本书&#xff0c;顺序结构的话按照数据结构-计算机组成原理-操作系统-计算机网络的顺序来学习。刚开始学会感觉很吃力很难&#xf…

AutoCodeRover: Autonomous Program Improvement

AutoCodeRover&#xff1a;自主程序改进 Abstract 过去几十年来&#xff0c;研究人员在软件开发过程自动化方面取得了重大进展。大型语言模型 (LLM) 的最新进展对开发过程产生了重大影响&#xff0c;开发人员可以使用基于 LLM 的编程助手来实现自动化编码。然而&#xff0c;软…

【Ne4j图数据库入门笔记2】数据导入详解

2.1 导入 CSV 文件 Cypher中 LOAD CSV 的命令允许我们指定文件路径、标头与否、不同的值分隔符以及 Cypher 语句&#xff0c;用于我们如何在图形中对表格数据进行建模。 CSV 是逗号分隔值的文件&#xff0c;通常在 Excel 或其他电子表格工具中查看。可以有其他类型的值作为分…

spring.factories中配置ApplicationContextInitializer实现类却不起作用

自定义了一个ApplicationContextInitializer的实现类如下 public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {Overridepublic void initialize(ConfigurableApplicationContext applicationCon…