Jenkins持续集成

持续集成 / Jenkins简介

开源持续集成(Continuous Integration)工具,具有自动化构建、测试、部署等功能。

Jenkins的特征

  • 开源的 Java 语言开发持续集成工具,支持持续集成、持续部署。
  • 易于安装部署配置:

    • 可通过 yum (apt) 安装,或下载 war包 、通过 docker容器 等方式实现快速安装部署
    • 可方便 web界面 配置管理
  • 消息通知及测试报告:

    • 集成 RSS/E-mail 通过RSS发布构建结果或当构建完成时通过e-mail通知
    • 生成 JUnit/TestNG 测试报告
  • 分布式构建: 支持Jenkins能够让多台计算机一起构建/测试
  • 文件识别:Jenkins能够 跟踪 哪次构建生成哪些jar,哪次构建使用哪个版本的jar等。
  • 丰富的插件支持:支持扩展插件,如:

    • git
    • svn
    • maven
    • docker
    • 等等

Jenkins 安装和持续集成环境配置

持续集成流程说明

continuous-integration.png

1) 开发人员进行代码提交,将代码上传到Git仓库
2) Jenkins作为持续集成工具,使用Git工具到Git仓库拉取代码到集成服务器,配合JDK、Maven等软件完成代码编译
进行代码测试与审查、测试、打包等工作
过程中的任一流程出错,都将重新执行一次整个流程
3) Jenkins将生成的jar包或war包分发到测试服务器或者生产服务器
测试人员或用户此时可以访问应用

服务器列表

名称IP地址安装的软件
代码托管服务器192.168.88.131GitLab
持续集成服务器192.168.88.132Jenkins , JDK 1.8, Maven , Git , SonarQube
应用测试服务器 JDK 1.8, Tomcat

环境一:代码托管服务器

192.168.88.131

GitLab代码托管服务器安装

GitLab简介

官网 https://about.gitlab.com

GitLab是一个用于仓库管理系统的开源项目(基于 MIT 协议),使用Git作为代码管理工具,并在此基础上搭建起来的web服务。

GitLab安装 (CentOS)

  1. 安装相关依赖

    yum install policycoreutils openssh-server openssh-clients postfix
    yum install policycoreutils-python
  2. 启动ssh服务 & 设置为开机启动

    systemctl enable sshd && systemctl start sshd
  3. 设置postfix开机自启并启动(postfix支持gitlab发信功能)

    systemctl enable postfix && systemctl start postfix
  4. 开放ssh以及http服务,然后重新加载防火墙列表

    firewall-cmd --add-service=ssh --permanent

    firewall-cmd --add-service=http --permanent

    firewall-cmd --reload

  5. 下载gitlab包并安装

    在线下载安装包:

    wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-15.4.6-ce.0.el7.x86_64.rpm

    安装:

    rpm -i gitlab-ce-15.4.6-ce.0.el7.x86_64.rpm
    rpm -i gitlab-ce-15.4.6-ce.0.el7.x86_64.rpm --nodeps --force

    [root@localhost ~]# rpm -i gitlab-ce-15.4.6-ce.0.el7.x86_64.rpm --nodeps --force
    警告:gitlab-ce-15.4.6-ce.0.el7.x86_64.rpm: 头V4 RSA/SHA1 Signature, 密钥 ID f27eab47: NOKEY
    JSON file with existing configuration not found inside /opt/gitlab/embedded/nodes.
    Skipping config check.
    gitlab preinstall: 
    gitlab preinstall: This node does not appear to be running a database
    gitlab preinstall: Skipping version check, if you think this is an error exit now
    gitlab preinstall: 
    gitlab preinstall: 
    gitlab preinstall: This node does not appear to be running puma and/or sidekiq services
    gitlab preinstall: Skipping unmigrated data check, if you think this is an error exit now
    gitlab preinstall: 
    It looks like GitLab has not been configured yet; skipping the upgrade script.
    
           *.                  *.
          ***                 ***
         *****               *****
        .******             *******
        ********            ********
       ,,,,,,,,,***********,,,,,,,,,
      ,,,,,,,,,,,*********,,,,,,,,,,,
      .,,,,,,,,,,,*******,,,,,,,,,,,,
          ,,,,,,,,,*****,,,,,,,,,.
             ,,,,,,,****,,,,,,
                .,,,***,,,,
                    ,*,.
      
    
    
         _______ __  __          __
        / ____(_) /_/ /   ____ _/ /_
       / / __/ / __/ /   / __ `/ __ \
      / /_/ / / /_/ /___/ /_/ / /_/ /
      \____/_/\__/_____/\__,_/_.___/
      
    
    Thank you for installing GitLab!
    GitLab was unable to detect a valid hostname for your instance.
    Please configure a URL for your GitLab instance by setting `external_url`
    configuration in /etc/gitlab/gitlab.rb file.
    Then, you can start your GitLab instance by running the following command:
      sudo gitlab-ctl reconfigure
    
    For a comprehensive list of configuration options please see the Omnibus GitLab readme
    https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md
    
    Help us improve the installation experience, let us know how we did with a 1 minute survey:
    https://gitlab.fra1.qualtrics.com/jfe/form/SV_6kVqZANThUQ1bZb?installation=omnibus&release=15-4
  6. 修改gitlab配置

    vim /etc/gitlab/gitlab.rb

    修改gitlab访问地址和端口,默认为80,在此修改为82

    external_url 'http://192.168.88.131:82'

    nginx['listen_port'] = 82

    vim 搜索

    /nginx['listen_port'

  7. 重载配置及启动gitlab

    gitlab-ctl reconfigure

    gitlab-ctl restart

  8. 将端口添加到防火墙

    firewall-cmd --zone=public --add-port=82/tcp --permanent

    firewall-cmd --reload

  9. 首次登陆并修改密码

    首次登录时,使用root用户

    初始密码存放在 /etc/gitlab/initial_root_password

    gitlab_login_first.png

GitLab添加组、创建用户、创建项目

  • 创建组

    使用管理员root创建组

    一个组里面可以有多个项目分支,可以将开发添加进组进行权限配置

    不同的组就是团队不同的开发项目或者

    不同的组添加不同的开发即可实现对开发设置的管理

    gitlab_new_group.png

    • Visibility level

    gitlab_visibility_level.png

  • 创建项目

    gitlab_new_project.png

  • 创建新用户

    gitlab_new_user.png

    • 创建用户时,可以选择Regular或Admin类型

      gitlab_user_access_level.png

    • 用户创建完成后可以进入Edit界面设置密码

      gitlab_edit_user_password.png

  • 将用户添加到组中

    • 选择某个用户组,进行Members管理组成员

      gitlab_user_role.png

    • GitLab用户在组中有5种不同权限:

      • Guest:可以创建issue、发表评论,不能读写版本库
      • Reporter:可以克隆代码,不能提交,QA、PM可以赋予这个权限
      • Developer:可以克隆、开发、提交代码,普通开发可以赋予这个权限
      • Maintainer:可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,核心开发可以赋予这个权限
      • Owner:可以设置访问权限、删除项目、迁移项目、管理组成员,开发组组长可以赋予这个权限
  • 在用户组中创建项目

    gitlab_group_project.png

将源码上传到GitLab仓库

  • 使用IDEA上传现有项目

    • 克隆仓库地址

      gitlab_project_clone.png

    • 为项目启用版本控制,添加Git仓库

      gitlab_project_add_vcs.png

    • 管理远程仓库地址,添加GitLab地址链接

      1. 管理Git远程

        gitlab_project_manage_origin.png

      2. 添加远程Git仓库地址链接,输入复制的GitLab仓库克隆地址

        gitlab_project_add_origin.png

      3. 推送(push)到GitLab远程仓库

环境二:持续集成服务器

192.168.88.132

持续集成环境(1)-Jenkins安装

安装Jenkins

  • 🔺推荐按照 官方步骤 进行安装,略去步骤1~3

    wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
    rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
    yum upgrade
    # Add required dependencies for the jenkins package
    
    sudo yum install java-11-openjdk
    sudo yum install jenkins
    
    sudo systemctl daemon-reload
    [root@localhost ~]# jenkins --version
    2.387.1
  1. 安装JDK

    Jenkins需要JDK依赖,此处安装JDK1.8
    yum install java-1.8.0-openjdk* -y

    安装目录为 /usr/lib/jvm

    Jenkins(LTS)版本支持JDK列表:

    jenkins_lts_jdk.png

  2. 获取Jenkins安装包

    下载页面:https://jenkins.io/zh/download/

    此处按照 官方步骤 进行

    wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
    rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key

    如果进行完以上两步直接进行 yum upgrade 操作则不会以下错误

    踩坑,报错如下:

     已加载插件:fastestmirror, product-id, search-disabled-repos, subscription-manager
    
     This system is not registered with an entitlement server. You can use subscription-manager to register.
    
     Loading mirror speeds from cached hostfile
     Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock error was
     14: curl#7 - "Failed to connect to 2a05:d012:8b5:6503:9efb:5cad:348f:e826: 网络不可达"
    
    
      One of the configured repositories failed (未知),
      and yum doesn't have enough cached data to continue. At this point the only
      safe thing yum can do is fail. There are a few ways to work "fix" this:
    
     1. Contact the upstream for the repository and get them to fix the problem.
    
     2. Reconfigure the baseurl/etc. for the repository, to point to a working
        upstream. This is most often useful if you are using a newer
        distribution release than is supported by the repository (and the
        packages for the previous distribution release still work).
    
     3. Run the command with the repository temporarily disabled
            yum --disablerepo=<repoid> ...
    
     4. Disable the repository permanently, so yum won't use it by default. Yum
        will then just ignore the repository until you permanently enable it
        again or use --enablerepo for temporary usage:
    
            yum-config-manager --disable <repoid>
        or
            subscription-manager repos --disable=<repoid>
    
     5. Configure the failing repository to be skipped, if it is unavailable.
        Note that yum will try to contact the repo. when it runs most commands,
        so will have to try and fail each time (and thus. yum will be be much
        slower). If it is a very temporary problem though, this is often a nice
        compromise:
    
            yum-config-manager --save --setopt=<repoid>.skip_if_unavailable=true
    
    Cannot find a valid baseurl for repo: base/7/x86_64

    此时yum无法使用,修复方法:

    1. 进入 /etc/yum.repos.d
    2. jenkins.repo 改掉,此处改为 jenkins.repo.backup
  3. 安装文件

    rpm -ivh jenkins-[version].noarch.rpm

    此处按照 官方步骤 进行

    新的版本需要JDK11

    yum upgrade
    # Add required dependencies for the jenkins package
    yum install java-11-openjdk
    yum install jenkins

    上文解决yum无法使用问题后,直接安装Jenkins是无法找到软件包的

    yum_no_jenkins.png

    将文件名改回,再次进行 yum upgrade

    yum_upgrade.png

    再次运行 yum install jenkins 即可成功安装

    (说实话有点懵逼,怎么就修好了?)

修改配置文件

  1. 修改Jenkins配置

    vim /etc/sysconfig/jenkins

    修改内容如下:

    JENKINS_USER="root"

    JENKINS_PORT="8888"

  2. 启动Jenkins

    systemctl start jenkins

    🔺注意:如果安装了多个版本的JDK,如果版本不支持会造成服务启动失败,可以通过 update-alternatives --config java 调整默认Java版本

  3. 修改Jenkins服务端口

    解决问题:无论怎么修改配置文件,Jenkins依然使用默认的8080端口

    修改 /usr/lib/systemd/system/jenkins.service

    vim /usr/lib/systemd/system/jenkins.service
    • 搜索 JENKINS_PORT 参数

      /JENKINS_PORT

      jenkins_config_port_search.png

      找到参数:

      jenkins_config_port.png

    • 修改参数

      修改服务端口为8088并保存

      jenkins_config_port_change.png

    • 重启Jenkins服务

      systemctl restart jenkins

访问并初始化

  1. 访问测试

    http://192.168.88.132:8088

    • 如果开启了防火墙,需要开放Jenkins服务端口

      参考 官方步骤 ,使用 firewall-cmd 将Jenkins添加为例外
      YOURPORT=8088
      PERM="--permanent"
      SERV="$PERM --service=jenkins"
      
      firewall-cmd $PERM --new-service=jenkins
      firewall-cmd $SERV --set-short="Jenkins ports"
      firewall-cmd $SERV --set-description="Jenkins port exceptions"
      firewall-cmd $SERV --add-port=$YOURPORT/tcp
      firewall-cmd $PERM --add-service=jenkins
      firewall-cmd --zone=public --add-service=http --permanent
      firewall-cmd --reload
    • 使用 firewall-cmd开放端口

      # 添加开放端口
      firewall-cmd --zone=public --add-port=8088/tcp --permanent  
      # 重启防火墙
      service firewalld restart
      • 批量开放 [start_port][stop_port] 的端口

        firewall-cmd --zone=public --add-port=[start_port]-[stop_port]/tcp --permanent
      • 查看已开放的端口

        firewall-cmd --list-ports

      关闭防火墙

      systemctl stop firewalld.service
    • 使用 iptables 也可以开放端口(Debian)

      # 添加开放端口
      iptables -A INPUT -p tcp --dport 8088 -j ACCEPT
      # 将配置保存
      iptables-save > /etc/iptables.up.rules
      # 重启ssh服务
      # /etc/init.d/ssh restart
      使用 iptables -A INPUT -p tcp --dport [start_port]:[stop_port] -j ACCEPT 可以批量开放 [start_port][stop_port] 的端口
  2. 获取admin账号密码,解锁Jenkins

    • 在初始页获取密码存放路径

    jenkins_admin_password_path.png

    • 在服务器后台获取密码

    jenkins_get_admin_password.png

  3. 跳过插件安装

    因为Jenkins插件需要连接默认官网进行下载,速度慢,失败概率大,所以暂时跳过
    • 选择插件安装并选择"无"

    jenkins_plugin_skip.png

    jenkins_plugin_none.png

  4. 添加一个管理员账户,并进入Jenkins后台

    jenkins_account_add_admin.png

    保存并完成

    jenkins_server_url.png

持续集成环境(2)-Jenkins插件管理

Jenkins本身不提供很多功能,通过插件可以实现例如:

从GitLab上拉取代码、使用Maven进行构建项目等功能。

修改Jenkins插件下载源

  • 将官方插件列表下载到本地

    进入 Manage Jenkins → Manage Plugins → Available plugins

    等待插件加载完成

    /var/lib/jenkins/updates/default.json

  • 修改文件,将下载源替换为国内地址

    先备份

    cp /var/lib/jenkins/updates/default.json /var/lib/jenkins/updates/default.json.back

    进入配置存放目录

    cd /var/lib/jenkins/updates/

    sed -i 's/http://updates.jenkins-ci.org/download/https://mirrors.tuna.tsinghua.edu.cn/jenkins/g' default.json && sed -i 's/http://www.google.com/https://www.baidu.com/g' default.json

  • 替换 Advanced setting 中的 Update Site

    https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

    jenkins_plugin_update_site.png

  • 重启Jenkins

    在浏览器地址栏端口号之后输入 /restart 进行重启

    jenkins_restart.png

下载中文汉化插件

进入 Manage Jenkins → Manage Plugins → Available plugins ,搜索 "Chinese"

jenkins_plugin_chinese.png

下载完成之后进行重启(刷新)

jenkins_plugin_download_success.png

持续集成环境(3)-Jenkins用户权限管理

利用 Role-based Authorization Strategy 插件进行Jenkins用户权限管理

安装 Role-based Authorization Strategy 插件

jenkins_plugin_role.png

开启全局安全权限配置

  • 管理授权策略

    Manage Jenkins → Configure Global Security → 授权策略

    选择 Role-Based Strategy

    jenkins_configure_security.png

  • 管理角色(用户组)

    Manage Jenkins → Manage and Assign Roles → Manage Roles
    • 在 Global roles 添加 baseRole 角色,开启 Overall 中的 Read 权限,使该角色可以登录

      jenkins_role_global_read.png

    • 在 Item roles 添加角色,定义其可访问项目的规则

      jenkins_role_item.png

  • 管理用户

    Manage Jenkins → Manage Users
    • 添加用户

      Create User

      jenkins_user_add.png

  • 分配角色

    Manage Jenkins → Manage and Assign Roles → Assign Roles
    • 在 Global roles 管理加入已经创建的用户,并为用户分配已添加登录权限的 baseRole 角色

      jenkins_user_role_global.png

    • 在 Item roles 管理加入已创建的用户,并为用户分配已添加项目访问权限的角色

      jenkins_user_role_item.png

  • 新建项目

    • 创建项目

      新建一个 Freestyle project

      jenkins_project_add.png

    • 分别创建 test1001 和 test2001

      jenkins_project_list_admin.png

    • 使用 user01 查看项目

      只能查看 test1.* 匹配的 test1001,无法查看 test2001

      jenkins_project_list_user01.png

持续集成环境(4)-Jenkins凭证管理

最后修改:2023 年 04 月 02 日
如果觉得我的文章对你有用,请随意赞赏