Jenkins的安装和搭建自动化部署平台

Jenkins的安装和搭建自动化部署平台

环境

操作系统:Ubuntu 18.04.6 LTS

内核版本:5.4.0-149-generic

Docker版本:24.0.2

Docker Compose 版本:v2.18.0

Jenkins 版本:2.393-alpine

JDK 版本:java 11.0.19 2023-04-18 LTS

Git 版本:2.28.0

Maven 版本:3.6.3

Node JS 版本:16.16.0

Jenkins主节点:192.168.6.92

Jenkins agent节点:192.168.6.91

一、Jenkins官网

二、Jenkins概述

持续集成(CI)是一种开发实践,其中开发人员经常(最好每天几次)将代码集成到共享存储库中。然后可以通过自动构建和自动测试来验证每个集成。尽管自动化测试不是严格意义上的CI的一部分,但通常隐含了它。

定期集成的主要好处之一是,您可以快速检测到错误并更轻松地定位它们。由于引入的每个更改通常很小,因此可以快速查明引入缺陷的特定更改。

近年来,CI已成为软件开发的最佳实践,并遵循一系列关键原则。其中包括版本控制,构建自动化和自动化测试。

此外,持续部署和持续交付已成为最佳实践,可让您随时随地部署应用程序,甚至在每次引入新更改时甚至将主代码库自动推入生产环境。这使您的团队可以快速行动,同时保持可以自动检查的高质量标准。

image-20240105155737704

CI/CD应用场景:

  • 开发人员将本地代码上传gitlab版本服务器
  • jenkins通过webhook插件自动到gitlab服务器拉取最新代码
  • 通过docker-maven-plugin插件自动编译代码
  • 将自定义镜像上传docker私服仓库
  • k8s集群自动拉取最新版本镜像
  • 自动化部署整个项目
  • 用户通过nginx负载均衡访问整个项目

image-20240105155826829

三、Jenkins的部署

使用Docker部署Jenkins

# 拉取镜像
docker pull jenkins/jenkins:2.393-alpine

# 创建映射目录,并给目录授权
mkdir -p /data/jenkins && chown -R 1000:1000 /data/jenkins


# 运行容器
docker run -itd \
    --name jenkins \
	-p 8080:8080 \
	-p 50000:50000 \
	-u root \
	-e JAVA_OPTS=-Duser.timezone=Asia/Shanghai \
	--restart always \
	-v /data/jenkins/:/var/jenkins_home/ \
    jenkins/jenkins:2.393-alpine
    
# 查看容器启动日志并找到jenkins初始化密码
docker logs -f jenkins

image-20240104104421050

浏览器访问Jenkins

image-20240104104612435

安装Jenkins插件

image-20240104104736736

image-20240104104807803

插件安装完成

image-20240104105108610

创建管理员账户

image-20240104105159836

配置实例

image-20240104105231800

安装完成

image-20240104105247735

四、Jenkins设置中文支持

1. 点击 Manage Jenkins

image-20240104110443683

2. 点击Manage Plugins

image-20240104110458889

3. 搜索并安装 locale 插件

image-20240104110602657

4. 安装完成后重启 Jenkins

image-20240104110719409

# 重启Jenkins
docker restart jenkins

5. 验证

此时再次重新登录Jenkins,发现已变成中文了,这是由于Locale插件自动根据浏览器语言设置,切换对应的语言支持。

image-20240104111022563

五、Jenkins初体验

1. 自由风格项目

  1. 点击 新建任务

image-20240104135230836

  1. 填写 任务名称
  2. 选择 构建一个自由风格的软件项目
  3. 点击 确定

image-20240104135329889

  • 添加构建步骤,选择 执行shell
  • 填写shell命令
  • 点击 保存

image-20240104152627088

  • 点击 立即构建 ,查看执行结果

image-20240104143756241

image-20240104152823887

  • 查看控制台输出

image-20240104152841553

这里需要了解一点:

之所以可以执行 java --version git --version 指令,是因为Jenkins容器内部已安装了该工具,没有安装了工具,执行就会报错,比如:mvn --version, Jenkins容器内部默认是没有安装Maven的。

2. 流水线项目

2.1 安装插件

流水线任务需要**Pipeline插件**的支持,在创建流水线任务之前,先确保Jenkins已安装 Pipeline插件

具体在:Dashboard –> 系统管理 –> 插件管理 中安装

image-20240104154145155

2.2 配置流水线任务

  1. 填写 任务名称
  2. 选择 构建一个Pipeline项目
  3. 点击 确定

image-20240104154700551

  • 编辑脚本,点击 保存

image-20240104154518639

  • 运行任务,查看运行结果

image-20240104154548082

六、Jenkins部署运维后端代码

操作步骤

  • 指定部署节点
    • 部署节点为Jenkins服务所在节点的从节点,也叫:代理节点
    • 主节点与代理节点之间通过SSH方式连接
  • 代理节点拉取代码
    • 代理节点需要安装Git
  • 代理节点将打包打成jar包
    • 代理节点需要安装Maven、JDK
  • 代理节点将Jar包制作成Docker镜像
    • 代理节点需要安装Docker
  • 代理节点运行docker镜像
    • 通过shell命令行

1. 代理节点配置软连接

master节点ssh连接agent节点时需要/usr/bin/有java命令。配置java的软连接、同理配置maven、git的软连接。如果软件是yum安装的,则需要检查/usr/bin中是否有相关命令。如果没有,也需要做软连接。

ln -s /opt/module/jdk-11.0.19/bin/java /usr/bin/
ln -s /opt/module/apache-maven-3.6.3/bin/mvn /usr/bin/
ln -s /opt/module/git/bin/git /usr/bin/

2. 添加代理节点

2.1 进入节点列表页面

  • 点击 系统管理
  • 点击 节点列表

image-20240104160920865

2.2 添加节点

  • 点击 新建节点

20240104-161007

2.3 编辑节点名称和属性

  • 填写 节点名称
  • 选择 固定节点
  • 点击 创建

image-20240104161046707

2.4 配置节点

  • 名称:填写节点名称,用于展示

  • 描述:填写节点描述,可不填

  • 执行器数量:最小是1,建议跟服务器内核数一致。

  • 远程工作目录:Jenkins运行的目录,提前在代理服务器上创建好

    # 在代理节点上创建工作目录
    mkdir -p /data/workspaces
  • 标签:代理节点的标签,也是代理节点的唯一标识

  • 用法:选择 仅在此节点上运行

  • 启动方式:选择 Launch agents via SSH

    • 主机:代理节点IP
    • 凭据:选择给代理节点配置的凭据,没有则点击下方的 添加 按钮创建凭据
    • 主机验证方式:选择 Non verifying Verification Strategy
  • 可用性:选择 尽可能在此节点上运行

  • 点击 保存

image-20240105094022222

image-20240105094040027

2.5 添加凭据

  1. 在节点配置页面点击 添加 按钮

    image-20240105095650742

  2. 点击 Jenkins 进入凭据配置页面

    1. 作用域:选择 全局凭据

    2. 类型:选择 SSH Username with private key

    3. 范围:全局

    4. ID:不用填,配置完成保存后会自动生成

    5. 描述:凭据的描述,可不填

    6. Username:代理节点的root用户密码

    7. Private Key:对应的就是Jenkins主节点生成的私钥信息

      1. 勾选 Enter directly

      2. 输入Jenkins主节点完整的私钥信息

      3. 这里首先要配置主节点与代理节点的免密登录,具体方式如下:

        # 在master节点生成密钥
        ssh-keygen -t rsa
        
        # 复制公钥到agent节点
        ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.6.91
        
        # 免密登录测试
        ssh 192.168.6.91
        
        # 查看私钥信息(主节点执行)
        cat /root/.ssh/id_rsa
    8. 密码:填写代理服务器root用户登录密码

    image-20240105100852505

    image-20240105100909305

  3. 点击 添加,保存凭据

    此时在 代理节点配置页面,就可以勾选刚才配置的凭据信息了

    image-20240105101017536

3. 配置Gitlab凭据

Jenkins工作台 –> 系统管理 –> credentials –> 在Stores scoped to Jenkins下的’全局’ –> 添加凭据

  • 类型:Username with password
  • 范围:全局
  • 用户名:登录Gitlab的用户名
  • 密码:登录Gitlab的密码
  • ID:不用填,自动生成
  • 描述:可不填

image-20240105104814964

image-20240105104853462

image-20240105105424488

4. 配置Pipeline流水线任务

4.1 新建任务

image-20240105110052243

4.2 配置任务

  • 定义:选择 Pipeline script from SCM

    • SCM: 选择 Git
    • Repository URL:填写项目Git地址
    • 凭据:选择gitlab登录凭据,没有则添加
    • 构建分支:默认Master分支
    • 源码库浏览器:自动
  • 脚本路径:Jenkinsfile (名称不要改,使用默认的)

    image-20240105135231905

    image-20240105135246088

  • 添加Gitlab凭据

    • 任务配置页面,凭据 下点击 添加

    • 凭据页面配置如下:

      • Domain:全局
      • 类型:Username with password
      • 范围:全局
      • 用户名:root
      • 密码:root用户密码
      • ID:不用填,会自动生成
      • 描述:可不填

      image-20240105135133467

      image-20240105135149397

5. 编辑 Jenkinsfile 文件

  • 该文件名称必须为 Jenkinsfile ,大小写要完全一致
  • 该文件要在项目的根路径下
  • 文件内容使用按照流水线格式,采用Groovy语法编写,可使用 流水线语法 生成器生成片段

5.1 流水线语法生成器

在流水线任务配置页面,下拉到页面最下方,点击 流水线语法 ,打开流水线语法生成页面。

image-20240105135903283

image-20240105135918483

5.1.1 实例:生成git 拉取代码指令

image-20240105140207616

image-20240105140253107

5.2 Jenkinsfile 内容如下

pipeline {
    agent {
        label 'agent-6-91'
    }

    stages {
        stage('检测环境') {
            steps {
                echo '开始检测环境'
                sh '''java -version
                mvn -v
                docker -v
                git version'''
            }
        }
        stage('拉取代码') {
            steps {
                echo '开始拉取代码'
                checkout scmGit(branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: '5c2185ef-6204-4c3b-b6dc-92b0ea5e55a1', url: 'http://192.168.6.211:3060/GeorgeChan/ioms-test.git']])
            }
        }
        stage('编译构建') {
            steps {
                echo '开始执行代码编译'
				sh 'mvn clean package -pl ioms-eureka -am -Dmaven.test.skip=true -Ddockerfile.skip=true'
            }
        }
		stage('登录Harbor') {
            steps {
                echo '开始执行登录Harbor'
                sh 'docker login -u admin -p Harbor12345 192.168.6.201:5000'
            }
        }
        stage('运行ioms-eureka') {
            steps {
                echo '开始执行ioms-eureka模块的镜像构建、容器运行'

                script {
                    // 定义当前工作空间变量
                    def currentWorkspace = env.WORKSPACE
                    echo "当前工作空间:${currentWorkspace}"

                    def currentModule = "ioms-eureka"

                    // 删除容器
                    sh """
                        echo "检查容器 ${currentModule} 是否存在"
                        containerid=\$(docker ps -a | grep -w ${currentModule} | awk '{print \$1}')
                        if [ "\$containerid" != "" ]; then
                            echo '容器存在,停止容器'
                            docker stop \$containerid
                            echo '删除容器'
                            docker rm \$containerid
                        fi
                    """

                    // 删除镜像
                    sh """
                        echo "检查镜像 ${currentModule} 是否存在"
                        imageid=\$(docker images | grep ${currentModule} | awk '{print \$3}')
                        if [ "\$imageid" != "" ]; then
                             echo '删除镜像'
                             docker rmi -f \$imageid
                        fi
                    """

                    // 执行 mvn dockerfile:build 命令
                    // 构建镜像,并获取日志输出
                    def buildOutput = sh(returnStdout: true, script: "mvn dockerfile:build -pl ioms-eureka -DdockerfileDirectory=${currentWorkspace}/${currentModule}")

                    def imageName = ""
                    def tag = ""

                    // 将日志用换行符切分
                    def lines = buildOutput.split('\n')

                    // 遍历日志,获取构建的镜像的名称
                    lines.each { line ->
                        def lineStr = line.toString()  // 将列表元素转换为字符串
//                        echo lineStr
                        if (lineStr.startsWith("[INFO] Successfully tagged")) {
                            imageName = lineStr.substring(lineStr.indexOf("[INFO] Successfully tagged") + "[INFO] Successfully tagged".length()).trim()
                            // 192.168.6.201:5000/ioms-hf/ioms-eureka:1.0-SNAPSHOT
                            tag = imageName.split(":")[2];
                        }
                    }

                    echo "生成的镜像名称:${imageName}"
                    echo "生成的镜像Tag:${tag}"

                    echo "开始执行运行${currentModule}容器"
                    sh "docker-compose up -d ${currentModule}"
                }
            }
        }
        stage('构建结束') {
            steps {
                echo '已成功构建所有模块'
            }
        }
    }
}

6. 运行Pipeline任务

6.1 立即构建

image-20240105143445338

6.2 查看构建过程

image-20240105143512649

image-20240105143526531

6.3 验证结果

浏览器打开eureka访问页面

http://192.168.6.91:8761/

image-20240105143708987

7. 其它

  • 上述所有操作的前提是,要在代理节点安装JDK、Git、Maven,并正确配置环境变量。这些都比较基础,自行补充,这里不再重复。
  • Jenkins的中文支持,有时候重启会失效,这个不影响操作。

七、Jenkins部署运维系统前端代码

1. 安装插件

Jenkins要部署前端代码,需要安装两个必要的插件

  • Publish Over SSH 用于登录远程服务器,和向远程服务器发送文件
  • NodeJs 用于代码的打包

image-20240105145119424

image-20240105145255475

2. 配置远程服务器的连接

1、打开“系统管理”–“系统设置” 找到 “Publish over SSH” 项 , 配置SSH Server

  • Name:给要配置的服务器起个名字
  • Hostname:服务器IP
  • Username:登录用户名
  • Remote Directory:登陆成功后默认进入的目录
  • Password:登录用户密码

image-20240105145821255

2、点击 Test Configuration 按钮测试连接是否成功

image-20240105150135367

3. 配置NodeJS

打开“系统管理” –> “全局工具配置”, 找到NodeJS, 新增NodeJS

  • 别名:NodeJS名称
  • 版本:选择适用的NodeJS版本

image-20240105150651858

4. 新建流水线任务

3.1 新建一个自由风格项目

image-20240105153627066

3.2 配置任务

  • 限制项目的运行节点:选择要部署的服务器

  • 源码管理:选择Git

    • Repository URL:前端代码Git地址
    • Credentials:Gitlab登录凭证
    • Branches to build:Git拉取的代码分支,默认Master
  • 构建环境

    • Provide Node & npm bin/ folder to PATH:选择适配的NodeJS版本
  • Build Steps

    • 选择 执行Shell

    • 内容如下:

      # 进入Jenkins工作空间下hxkj项目目录
      cd /data/workspaces/workspace/ioms-html
      
      ###
      # npm切换为淘宝源
      npm config set registry http://registry.npm.taobao.org/
      
      # 删除已有的构建包
      rm -rf ./dist/
      rm -rf dist.tar.gz
      
      # 安装依赖,跳过安全审计
      npm --no-audit i --force
      
      # 构建项目
      npm run test
      
      # 压缩方便移动到项目部署目录
      tar -zcvf dist.tar.gz dist
  • 构建后操作

    • 配置SSH Server

      • Name:选择部署的服务器

      • Transfer Set Source files:前端打包后的文件名

      • Remove prefix:要去除的文件前缀

      • Remote directory:要进入的远程服务器的文件夹路径

      • Exec command:进入文件夹后,执行的shell命令

        cd /usr/local/docker/data/nginx/html/dist-white/
        echo "工作路径:" $(pwd)
        mv ./dist ./dist$(date +'%Y%m%d%H%M')
        tar -zxvf dist.tar.gz -C ./
        docker restart ioms-nginx
        rm -rf dist.tar.gz

5. 执行构建任务

5.1 立即构建

image-20240105154821435

5.2 查看构建过程

image-20240105154935476

image-20240105154945457

5.3 验证结果

image-20240105155022077


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 george_95@126.com