当前位置: 首页 > news >正文

jenkins安装部署实现自动化构建

jenkins安装部署实现自动化构建

    • 1. jenkins源码
    • 2. 安装(cenos7没jdk17需要装11)
    • 3. 生成密钥
    • 4. Linux快速安装nodejs-14
      • 4.1 npm源
    • 5. 安装sshpass
    • 6.安装rz sz
    • 7. 创建定时扫描gitlab打包部署
        • 7.1 创建自由式作业-》构建触发器-》轮询 SCM
        • 7.2 创建自由式作业-》构建触发器-》勾选Build when......
    • 例子1:web前端
    • 例子1:web后端
    • 8. 如何改jenkins的访问路径
    • 9. 全局管理
    • 10. 插件管理
    • 提示:gitlab webhook详细的参考这段吧,其实可以忽略,就是给你多个选择。
      • 全局插件配置
      • GitLab 到 Jenkins 身份验证
        • 身份验证安全性
        • 配置全局身份验证
        • 配置每个项目的身份验证
        • 禁用身份验证
      • Jenkins 到 GitLab 身份验证
    • 11. 管理用户可以加几个用户,给个权限

在这里插入图片描述

1. jenkins源码

https://github.com/jenkinsci/jenkins/releases/tag/jenkins-2.346

2. 安装(cenos7没jdk17需要装11)

https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos
检查版本 yum -y list java*
yum install fontconfig java-17-openjdk

3. 生成密钥

su -s /bin/bash jenkins
ssh-keygen -t rsa

粘贴公钥到gitlab

cat /var/lib/jenkins/.ssh/id_rsa.pub

​ jenkins的密码设置为无

可能需要在jenkins服务器执行下git clone xxx

可能出现: Too many open files

1、增大允许打开的文件数——命令方式
[root@bogon webServer]# ulimit -l
64
ulimit -n 2048
1
这样就可以把当前用户的最大允许打开文件数量设置为2048了,但这种设置方法在重启后会还原为默认值。
ulimit -n命令非root用户只能设置到4096。
想要设置到8192需要sudo权限或者root用户。

2、增大允许打开的文件数——修改系统配置文件
vim /etc/security/limits.conf  
#在最后加入  
* soft nofile 40960  
* hard nofile 40960  

4. Linux快速安装nodejs-14

这个给前端用的你不用就忽略

下载安装包

wget https://npm.taobao.org/mirrors/node/v14.17.5/node-v14.17.5-linux-x64.tar.xz

解压安装包

tar xf node-v14.17.5-linux-x64.tar.xz -C /usr/local/

添加软连接

ln -sfv /usr/local/node-v14.17.5-linux-x64 /usr/local/node

添加环境变量

echo 'export NODE_HOME=/usr/local/node
export PATH=$NODE_HOME/bin:$PATH' >>/etc/profile

加载环境变量

source /etc/profile

查看node版本

node -v
v14.17.5

看到如上效果则为nodejs安装成功。

4.1 npm源

如果有换源需要的情况,可执行一下命令进行更换npm淘宝源。

npm config set registry registry.npmmirror.com/

默认安装目录修改淘宝镜像配置

/var/lib/jenkins/.npmrc

registry=https://registry.npmmirror.com

问题一:如果Jenkins执行npm install 的时候卡死

解决方案:
需要切换jenkins用户执行
npm config set registry https://registry.npmmirror.com/

5. 安装sshpass

yum -y install sshpass

问题一:执行sshpass无返回解决,命令不生效

解决方案:
如果没连过那个机器需要用ssh连一次,不然sshpass执行是失效的,记得在jenkins用户上去连
su -s /bin/bash jenkins

6.安装rz sz

yum -y install lrzsz

7. 创建定时扫描gitlab打包部署

7.1 创建自由式作业-》构建触发器-》轮询 SCM
# 这个是设置每5分钟轮询一次,看看gitlab有没有新代码提交
H/5 * * * *
7.2 创建自由式作业-》构建触发器-》勾选Build when…
  • 这种用的是配置每个项目的身份验证

在这里插入图片描述

再点击Generate,生成Secret token(后续Gitlab的WebHooks会用),应用保存。

Gitlab配置WebHooks,*Secret 令牌为Jenkins生成的Secret token*,保存即可。在这里插入图片描述
在这里插入图片描述

7.1和7.2任选其一

这里我给2例子,一个是web前端的一个是web后端的

例子1:web前端

​ 讲下整体的步骤,首先是192.168.10.31已经安装了nginx等,且启动着,前端代码能正常通过nginx代理访问,前端的代码在/var/dba/web/html里边,我这个脚本的意思是打包好vue代码然后压缩,传到192.168.10.31的html目录解压。因为上边设置了5分钟扫描一次gitlab是否有新提交,这样就保证了5分钟后有提交代码自动会部署到这台机器,实现自动化部署、运行。

解释下为什么用SCM:为什么我不用gitlab的webhook呢,因为我们是多地协同开发,我的局域网能访问他们的他的局域网无法访问我的局域网,我的Jenkins部署在我的局域网,gitlab部署在他们的局域网。

  • 配置-》源码管理-》Provide Node & npm bin/ folder to PATH
    NodeJS Installation这里加上之前配置到全局的nodejs就行

  • Build Steps-》执行shell

#!/bin/bash
set +x

# 定义变量
LOCAL_FILE="web"                # 本地文件路径
REMOTE_HOST="192.168.10.31"            # 远端主机 IP
REMOTE_USER="root"                     # 远端主机用户名
REMOTE_PASSWORD="1"                    # 远端主机密码
REMOTE_DIR="/var/dba"    # 远端目录
REMOTE_COMMAND="cd /var/dba/ && unzip ${LOCAL_FILE}.zip" # 远端要执行的命令

npm install
rm -rf ${LOCAL_FILE} ${LOCAL_FILE}.zip
npm run build:prod

# 拷贝新的 html 文件
zip -r ${LOCAL_FILE}.zip web
echo "尝试清理远端目录:${REMOTE_DIR}/${LOCAL_FILE}"
# 使用 sshpass 删除远端目录中的所有文件
sshpass -p "${REMOTE_PASSWORD}" ssh "${REMOTE_USER}@${REMOTE_HOST}" "rm -rf ${REMOTE_DIR}/${LOCAL_FILE} ${REMOTE_DIR}/${LOCAL_FILE}.zip"

# 检查删除操作是否成功
if [ $? -eq 0 ]; then
    echo "远端目录 ${REMOTE_DIR}/${LOCAL_FILE} 中的文件已成功删除。"

    # 拷贝文件到远端机器
    sshpass -p "${REMOTE_PASSWORD}" scp "$LOCAL_FILE".zip "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/"

    # 检查 scp 命令是否成功
    if [ $? -eq 0 ]; then
        echo "文件已成功拷贝到远端机器的 ${REMOTE_DIR} 目录。"
                # 在远端机器上执行命令
        sshpass -p "${REMOTE_PASSWORD}" ssh "${REMOTE_USER}@${REMOTE_HOST}" "${REMOTE_COMMAND}"

        # 检查 ssh 命令是否成功
        if [ $? -eq 0 ]; then
            echo "远端命令已成功执行。"
        else
            echo "远端命令执行失败。"
            exit 1
        fi
    else
        echo "文件拷贝失败。"
        exit 1
    fi
else
    echo "远端目录清理失败。"
    exit 1
fi

例子1:web后端

​ 讲下整体的步骤,我的重启服务是systemctl restart webserverd,每次提交代码后5分钟扫描到了会在192.168.10.31的/var/dba/webserver/bin目录上传重启服务。因为上边设置了5分钟扫描一次gitlab是否有新提交,这样就保证了5分钟后有提交代码自动会部署到这台机器,实现自动化部署、运行。

  • 配置maven

    调用顶层 Maven 目标

    -DskipTests=true clean package
    
  • Build Steps-》执行shell

#!/bin/bash
set +x

# 定义变量
LOCAL_FILE="dba-webserver-3.0.3.5.jar"                # 本地文件路径
REMOTE_HOST="192.168.10.31"            # 远端主机 IP
REMOTE_USER="root"                     # 远端主机用户名
REMOTE_PASSWORD="1"                    # 远端主机密码
REMOTE_DIR="/var/dba/webserver/bin"    # 远端目录
REMOTE_COMMAND="systemctl restart webserverd" # 远端要执行的命令

# 删除本地文件(如果存在)
rm -rf "$LOCAL_FILE"

# 拷贝新的 JAR 文件
cp project/service/target/service-1.0-SNAPSHOT.jar "$LOCAL_FILE"

echo "尝试清理远端目录:${REMOTE_DIR}/${LOCAL_FILE}"
# 使用 sshpass 删除远端目录中的所有文件
sshpass -p "${REMOTE_PASSWORD}" ssh "${REMOTE_USER}@${REMOTE_HOST}" "rm -rf ${REMOTE_DIR}/${LOCAL_FILE}"

# 检查删除操作是否成功
if [ $? -eq 0 ]; then
    echo "远端目录 ${REMOTE_DIR} 中的文件已成功删除。"

    # 拷贝文件到远端机器
    sshpass -p "${REMOTE_PASSWORD}" scp "$LOCAL_FILE" "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/"

    # 检查 scp 命令是否成功
    if [ $? -eq 0 ]; then
        echo "文件已成功拷贝到远端机器的 ${REMOTE_DIR} 目录。"

        # 在远端机器上执行命令
        sshpass -p "${REMOTE_PASSWORD}" ssh "${REMOTE_USER}@${REMOTE_HOST}" "${REMOTE_COMMAND}"

        # 检查 ssh 命令是否成功
        if [ $? -eq 0 ]; then
            echo "远端命令已成功执行。"
        else
            echo "远端命令执行失败。"
            exit 1
        fi
    else
        echo "文件拷贝失败。"
        exit 1
    fi
else
    echo "远端目录清理失败。"
    exit 1
fi

8. 如何改jenkins的访问路径

系统管理->Jenkins Location->Jenkins URL->配置本地访问url

9. 全局管理

jdk maven node git这些你自己配置就好,安装好了配这里就全局使用了。

10. 插件管理

可以安装中文语言,gitlab(支持webhook的)极狐GitLab |Jenkins 插件

提示:gitlab webhook详细的参考这段吧,其实可以忽略,就是给你多个选择。

全局插件配置

GitLab 到 Jenkins 身份验证

该插件需要身份验证才能从 GitLab 连接到 Jenkins。这可以防止未经授权的人员触发作业。

身份验证安全性

APITOKEN 和其他 secret 不得通过不安全的连接发送。因此,所有连接都应该使用 HTTPS。

注意:证书是免费的,并且可以通过 LetsEncrypt 轻松管理。

配置全局身份验证
  1. 在 Jenkins 中创建一个至少具有 Job/Build 权限的用户
  2. 以该用户身份登录(即使您是 Jenkins 管理员用户,也必须这样做),然后单击页面右上角的用户名
  3. 单击“配置”,然后单击“添加新令牌”,并记下/复制用户 ID 和 API 令牌
  4. 在 GitLab 中,当您创建 webhook 以触发 Jenkins 作业时,请对 URL 使用以下格式,并且不要为 ‘Secret Token’ 输入任何内容:https://USERID:APITOKEN@JENKINS_URL/project/YOUR_JOB
  5. 添加 webhook 后,单击“Test”按钮,它应该会成功
配置每个项目的身份验证

如果要为每个 Jenkins 作业创建单独的身份验证凭证:

  1. 在 Jenkins 作业的配置中,在 GitLab 配置部分,单击“高级”
  2. 点击 ‘Secret Token’ 字段下的 ‘Generate’ 按钮
  3. 复制生成的令牌,并保存作业配置
  4. 在 GitLab 中,为您的项目创建一个 webhook,输入触发器 URL(例如 )并将令牌粘贴到 Secret Token 字段中https://JENKINS_URL/project/YOUR_JOB
  5. 添加 webhook 后,单击“Test”按钮,它应该会成功
禁用身份验证

如果要禁用此身份验证(不推荐):

  1. 在 Jenkins 中,转到管理 Jenkins -> 配置系统
  2. 向下滚动到标有 ‘GitLab’ 的部分
  3. 取消选中“为 ‘/project’ end-point 启用身份验证” - 您现在可以从 GitLab 触发 Jenkins 作业,而无需身份验证

Jenkins 到 GitLab 身份验证

请注意:此身份验证配置仅用于访问 GitLab API,以将构建状态发送到 GitLab。它用于克隆 git 存储库。克隆的凭证(通常是 SSH 凭证)应在 git 插件中单独配置。

此插件可以配置为向 GitLab 发送构建状态消息,这些消息显示在 GitLab 合并请求 UI 中。要启用此功能,请执行以下作:

  1. 在 GitLab 中创建新用户
  2. 向此用户授予您希望 Jenkins 将构建状态发送到的每个存储库的“维护者”权限
  3. 在 GitLab 中登录或“模拟”该用户,单击用户的图标/头像,然后选择 设置
  4. 点击 ‘Access Tokens’
  5. 创建一个名为 ‘jenkins’ 的令牌,范围为 ‘api’;expiration 是可选的
  6. 立即复制 Token,离开此页面后无法访问 Token
  7. 在 Jenkins 的 全局配置 页面的 GitLab 配置部分,提供 GitLab 主机 URL,例如https://your.gitlab.server
  8. 单击“添加”按钮添加凭证,选择“GitLab API 令牌”作为凭证类型,然后将您的 GitLab 用户的 API 密钥粘贴到“API 令牌”字段中
  9. 点击 ‘Test Connection’ 按钮;它应该会成功

11. 管理用户可以加几个用户,给个权限

相关文章:

  • 【软件工程】02_软件生命周期模型
  • nginx 简单实践:负载均衡【nginx 实践系列之四】
  • Java后端开发技术详解
  • fontTools工具的使用介绍
  • 浅分析 PE3R 感知高效的三维重建
  • LeetCode[242]有效的字母异位词
  • 【Linux】Windows 客户端访问 Linux 服务器
  • 解释什么是受控组件和非受控组件
  • VSTO(C#)Excel开发11:自定义任务窗格与多个工作簿
  • Chapter 4-15. Troubleshooting Congestion in Fibre Channel Fabrics
  • 游戏盾是什么?如何为在线游戏保驾护航?
  • 【Qt】QWidget属性2
  • FastAPI WebSocket 无法获取真实 IP 错误记录
  • Redis 跳表原理详解
  • CSV文件格式
  • 深度学习中的“刹车”:正则化如何防止模型“超速”
  • 用Promise实现ajax的自动重试
  • 【uniapp】记录tabBar不显示踩坑记录
  • 大数据学习(75)-大数据组件总结
  • S32K144外设实验(三):ADC单通道连续采样(中断)
  • 洗冤录|县令遇豪强:黄榦处理的一起地产纠纷案
  • 长江画派创始人之一、美术家鲁慕迅逝世,享年98岁
  • 全国人大常委会启动食品安全法执法检查
  • 江苏省人社厅党组书记、厅长王斌接受审查调查
  • Meta正为AI眼镜开发人脸识别功能
  • 商务部再回应中美经贸高层会谈