• DevOps(十四)怎么实现Gitlab更新后Jenkins自动发布


    目录

    1、在 Jenkins 中安装 GitLab 插件

    2、在 GitLab 中创建一个访问令牌(Access Token)

    3、在 Jenkins 中配置 GitLab 连接

    4、在 Jenkins 中创建一个新的任务(Job)

    5、在 GitLab 中配置 Webhook

    6、以下是一些补充说明和建议


    持续集成的一个特点就是开发可以随时提交,随时进行集成测试,当开发工程师将代码提交到GitLab 以后,jenkins怎么样自动触发进行编译和并将制品发布到测试环境呢?要实现在开发工程师将代码提交到 GitLab 后自动触发 Jenkins 进行编译和发布,可以按照以下步骤进行配置:

    1、在 Jenkins 中安装 GitLab 插件

    • 进入 Jenkins 管理页面,选择"管理插件"
    • 在可用插件列表中搜索"GitLab",勾选"GitLab Plugin"
    • 点击"直接安装"按钮,安装插件

    2、在 GitLab 中创建一个访问令牌(Access Token)

    • 进入 GitLab 的用户设置页面,选择"Access Tokens"
    • 填写令牌名称,并勾选相应的权限(如 api、read_repository 等)

    • 点击"Create personal access token"按钮,生成访问令牌

    • 复制生成的访问令牌,稍后将在 Jenkins 中使用

    3、在 Jenkins 中配置 GitLab 连接

    • 进入 Jenkins 管理页面,选择"系统配置"
    • 滚动到"GitLab"部分,点击"添加 GitLab 服务器"

    • 填写 GitLab 服务器的 URL(如 http://gitlab.povison-pro.com/,这里填你自己的GitLab服务器URL)
    • 在"Credentials"部分,选择"添加"并选择"GitLab API token"

    • 将之前复制的 GitLab 访问令牌粘贴到"API token"字段
    • 点击"Test Connection"按钮,验证连接是否成功
    • 保存 Jenkins 系统配置

    4、在 Jenkins 中创建一个新的任务(Job)

    • 点击 Jenkins 主页的"新建任务"
    • 输入任务名称,选择"构建一个自由风格的软件项目",点击"确定"
    • 在任务配置页面,选择"源码管理"选项卡
    • 选择"Git"作为源码管理工具
    • 在"Repository URL"字段中,填写 GitLab 仓库的 URL(如 git@gitlab.example.com:username/project.git)

    注意:红色箭头指示的这里替换你访问GitLab的仓库相关参数

    • 在"构建触发器"选项卡中,勾选"Build when a change is pushed to GitLab"

    • 在"高级"部分,可以配置触发条件,如指定分支、标签等,这些条件

    • 生成Secret token,先暂存一下,用于GitLab配置WebHook时填写。
    • 在"构建"选项卡中,添加构建步骤,如执行 shell 脚本、调用 Maven 等,根据项目需求进行配置,这里我们选择shell脚本,我们前面布署helloworld项目的 Jenkins Pipeline 代码转换为以下 Shell 脚本:
      1. #!/bin/bash
      2. # Stop Application
      3. serviceStatus=$(sudo supervisorctl status django 2>/dev/null | awk '{print $2}')
      4. if [ "$serviceStatus" == "RUNNING" ]; then
      5. sudo supervisorctl stop django
      6. else
      7. echo "Django process not running or does not exist."
      8. fi
      9. # Prepare Deployment
      10. sudo rm -rf /opt/HelloWorld/*
      11. sudo cp -R . /opt/HelloWorld
      12. # Configure Supervisor
      13. sudo cp /opt/HelloWorld/django.conf /etc/supervisor/conf.d/django.conf
      14. sudo supervisorctl reread
      15. sudo supervisorctl update
      16. # Restart Application
      17. sudo supervisorctl restart django

      这个 Shell 脚本的功能与 Jenkins Pipeline 代码相同,分为以下几个阶段:

      • Stop Application:

        • 使用 sudo supervisorctl status django 命令检查 Django 服务的状态。
        • 如果服务正在运行,使用 sudo supervisorctl stop django 命令停止服务。
        • 如果服务未运行或不存在,输出相应的信息。
      • Prepare Deployment:

        • 使用 sudo rm -rf /opt/HelloWorld/* 命令清理 /opt/HelloWorld 目录下的旧代码。
        • 使用 sudo cp -R . /opt/HelloWorld 命令将当前目录下的新代码复制到 /opt/HelloWorld 目录。
      • Configure Supervisor:

        • 使用 sudo cp /opt/HelloWorld/django.conf /etc/supervisor/conf.d/django.conf 命令将 django.conf 文件复制到 Supervisor 的配置目录。
        • 使用 sudo supervisorctl reread 命令让 Supervisor 重新读取配置文件。
        • 使用 sudo supervisorctl update 命令更新 Supervisor 的配置。
      • Restart Application:

        • 使用 sudo supervisorctl restart django 命令重启 Django 服务。
      • 脚本在 Django 项目的根目录下运行。
      • django.conf 文件已经准备好,并位于项目的根目录下。
      • 脚本运行时具有足够的权限执行 sudo 命令。
    • 保存任务配置

    5、在 GitLab 中配置 Webhook

    • 进入 GitLab 项目的设置页面,选择"Webhooks"
    • 在 URL 字段中,填写 Jenkins 的 Webhook URL,格式为 http:///project/,注意这个是在你在jenkins配置"Build when a change is pushed to GitLab"时生成的,没记住的,回去jenkins任务那里获取,还有一个Secret token参数也需要填写。

    • 在 Trigger 部分,勾选"Push events",表示在代码推送时触发 Webhook
    • 点击"Add webhook"按钮,添加 Webhook

    注意,在jenkins内网地址的时候,保存Webhook的时候会提示错误“Url is blocked: Requests to the local network are not allowed”。

    通常是由于 GitLab 服务器的安全设置限制了对本地网络的请求。

    GitLab 默认禁止向本地网络发送请求,以防止潜在的安全风险。如果你的 Jenkins 服务器和 GitLab 服务器在同一个本地网络中,就会触发这个安全限制。

    为了解决这个问题,你可以通过以下方式之一进行配置:

    在 GitLab 服务器上允许向本地网络发送请求:

    • 以管理员身份登录 GitLab。
    • 进入 Admin Area (管理区域)。
    • 在左侧菜单中,选择 "Settings" (设置)。
    • 在 "Network" (网络)部分,找到 "Outbound requests" (出站请求)。
    • 勾选 "Allow requests to the local network from hooks and services" (允许来自钩子和服务的本地网络请求)选项。
    • 保存设置。

    使用 Jenkins 服务器的外部可访问地址作为 Webhook URL:

    • 如果 Jenkins 服务器有一个外部可访问的域名或 IP 地址,可以使用该地址作为 Webhook URL。
    • 将 Jenkins 的 Webhook URL 修改为使用外部地址,例如 http://jenkins.example.com/project/my-project
    • 确保 GitLab 服务器能够通过该外部地址访问到 Jenkins 服务器。

    配置 GitLab 的白名单:

    • 在 GitLab 服务器上,找到 GitLab 的配置文件,通常位于 /etc/gitlab/gitlab.rb
    • 打开配置文件进行编辑。
    • 找到 gitlab_rails['webhook_local_net'] 配置项。
    • 将 Jenkins 服务器的 IP 地址或网络范围添加到该配置项中,例如:
      gitlab_rails['webhook_local_net'] = ['192.168.1.0/24', '10.0.0.0/8']
      
    • 保存配置文件。
    • 重新配置 GitLab:
      sudo gitlab-ctl reconfigure
      

    选择适合你的方式进行配置,然后重新尝试在 GitLab 中添加 Jenkins 的 Webhook URL。如果配置正确,应该就不会再出现 "Url is blocked" 的错误提示了。

    完成以上配置后,当开发人员将代码推送到 GitLab 仓库时,GitLab 会自动发送一个 Webhook 请求到 Jenkins。Jenkins 接收到请求后,会根据配置的触发条件判断是否需要执行构建任务。如果满足触发条件,Jenkins 将自动拉取最新的代码,并按照配置的构建步骤进行编译和发布。

    到这里我们就完成了整个流程。

    6、以下是一些补充说明和建议

    构建触发条件:

    • 在 Jenkins 任务的"构建触发器"部分,除了勾选"Build when a change is pushed to GitLab"外,还可以配置其他触发条件,如定时构建、手动触发等。
    • 在"高级"部分,可以根据项目需求设置更细粒度的触发条件,如指定分支、标签、目录路径等。

    构建步骤:

    • 在 Jenkins 任务的"构建"部分,根据项目的技术栈和构建需求,添加相应的构建步骤。常见的构建步骤包括:
      • 执行 shell 脚本:可以编写 shell 脚本来执行编译、测试、打包等操作。
      • 调用构建工具:如 Maven、Gradle 等,可以通过 Jenkins 的插件来调用这些构建工具。
      • 使用 Jenkins Pipeline:通过编写 Jenkinsfile,可以定义更复杂的构建流水线,包括多个阶段和步骤。

    发布和部署:

    • 在构建完成后,可以将构建产物发布到指定的位置,如部署服务器、应用容器等。
    • 可以使用 Jenkins 的插件或编写脚本来实现自动化部署,如 SSH 插件、Docker 插件等。

    通知和报告:

    • 在构建完成后,可以配置 Jenkins 发送通知,如邮件通知、即时通讯通知等,以便及时了解构建结果。
    • 可以生成构建报告,如测试报告、代码覆盖率报告等,并在 Jenkins 界面中展示,方便查看和分析。

    权限控制:

    • 根据团队成员的角色和权限,可以在 Jenkins 中配置不同的用户权限,如只读权限、构建权限、管理权限等。
    • 可以与 GitLab 的用户认证集成,实现单点登录和权限同步。

    扩展和优化:

    • 可以探索 Jenkins 的其他插件和功能,如 Pipeline as Code、多分支流水线、参数化构建等,以满足更复杂的持续集成和持续部署需求。
    • 对于大型项目,可以考虑使用 Jenkins 的分布式构建功能,将构建任务分发到多个节点上并行执行,提高构建效率。

    持续集成是一个持续优化和改进的过程,需要根据项目的实际情况不断调整和完善。通过自动化构建、测试和部署,可以提高开发效率,减少错误,并加快交付速度。

  • 相关阅读:
    Redis incr实现流水号自动增长
    JPA 查询的类型
    【OpenSSL】单向散列函数
    真空脱气机概述
    解决Windows RDP远程桌面连接同时多用户连接不互踢不干扰问题及rdp wrapper windows版本不受支持问题.
    [oeasy]python0011 - python虚拟机的本质_cpu架构_二进制字节码_汇编语言
    Docker运行nginx镜像及docker网络端口映射
    LLM 为什么需要 tokenizer?
    VSCODE 系列(二)常用插件
    【10】Docker私有仓库
  • 原文地址:https://blog.csdn.net/benshu_001/article/details/138191554