Docker搭建Jenkins 实现自动部署教程

概要

Jenkins 和 GitLab 是两个流行的工具,通常一起使用来实现持续集成和持续交付(CI/CD)。以下是如何在 Jenkins 中集成 GitLab 的基本步骤:

  1. 安装 Jenkins:
    首先,在服务器上安装 Jenkins。可以从 Jenkins 的官方网站(https://www.jenkins.io/download/)下载适用于您操作系统的安装包,并按照安装说明进行安装 或者 使用Docker容器。

  2. 安装 GitLab 插件:
    在 Jenkins 中安装 GitLab 插件,以便与 GitLab 服务器进行集成。您可以通过 Jenkins 管理面板的插件管理器来安装该插件。

  3. 配置 Jenkins 项目:
    在 Jenkins 中创建一个新的项目(或者使用现有的项目)。
    在项目配置中,选择 GitLab 作为版本控制工具,并提供 GitLab 仓库的 URL。
    配置 Jenkins 如何获取源代码,您可以选择通过 SSH 密钥或者 GitLab 的访问令牌进行认证。
    配置构建触发器,例如当 GitLab 上的特定分支有新的提交时触发构建。

  4. 配置构建步骤:
    在 Jenkins 项目中添加构建步骤,例如构建、测试、部署等。您可以使用 Jenkins 的插件来执行这些步骤,或者通过调用 shell 脚本来执行相关操作。

环境安装

linux上进行docker安装有两种方式:

  1. Docker自动化安装
  2. Docker手动安装

可以根据该文章的步骤进行安装:https://blog.csdn.net/weixin_44876263/article/details/136714078?spm=1001.2014.3001.5502

搭建Jenkins容器

  1. 拉取jenkins镜像
docker pull jenkins/jenkins:lts-alpine-jdk17
  1. 生成jenkins容器
#!/bin/bash

# 设置变量
PORT=8081
PROJECT_DIR="/opt/cx/docker/jenkins"

# 创建目录结构
mkdir -p "$PROJECT_DIR/jenkins_home"
mkdir -p "$PROJECT_DIR/logs"

# 运行 Jenkins 容器
docker run -d \
  --restart=always \
  --privileged=true \
  --name jenkins \
  -u root \
  -p "$PORT:8080" \
  -v "$PROJECT_DIR/jenkins_home:/var/jenkins_home" \
  -v "$PROJECT_DIR/logs:/var/log/jenkins" \
  -v "/var/run/docker.sock:/var/run/docker.sock" \
  -v "/etc/localtime:/etc/localtime" \
  jenkins/jenkins:lts-alpine-jdk17

注意:如果需要在jenkins的docker容器中去构建docker或者打包镜像的话需要进入容器内,安装docker命令行工具,Docker CLI 提供了丰富的命令和选项,可以用于构建、运行、管理和监视 Docker 容器。

  1. docker exec -it jenkins /bin/sh
  2. apk add docker-cli
  1. 通过shell脚本运行生成jenkisn容器
    在这里插入图片描述
  2. 登陆网址,测试jenkins是否运行成功
    在这里插入图片描述

配置Jenkins

  1. 首次登陆,根据密码提示地址,找到初始密码,修改jenkins密码并登陆进行设置
  2. 安装相应的插件

在这里插入图片描述

安装插件

  1. gitLab(代码管理)
    在这里插入图片描述

  2. pipeline(流水线)(jenkins推荐安装时自动安装)
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  3. SSH(远程登录连接)

在这里插入图片描述

  1. NodeJs(前端构建)

在这里插入图片描述

  1. Role(jenkins用户权限控制插件)
    在这里插入图片描述

  2. SonarQube(代码检测插件)
    在这里插入图片描述

  3. 记录job的历史更新记录插件(可找到历史命令脚本)
    在这里插入图片描述

在jenkins容器中安装JDK、Maven、Node等环境(位置docker jenkins_home中)

jdk:jenkins docker 一般会自带jdk版本(自带的最方便)

mavan:将maven的压缩包解压到相应位置

node

  1. 进入jenkins对应容器中docker exec -it [对应容器id] bash
  2. 安装nodejs , apk add --no-cache nodejs
  3. 再将需要的其他版本node的压缩包解压到相应位置 或者 可以在jenkins中选择自动安装node版本

注意: apk add --no-cache nodejs 这一步是必须的 否则构建前端可能会出现env: ‘node’: No such
file or directory的错误

在这里插入图片描述

配置JDK、Maven、Node环境

  1. 全局属性配置
    系统管理——>系统配置——>全局属性
    在这里插入图片描述

  2. gitLab配置
    在这里插入图片描述

  3. SSH配置

在jenkins_home中加入私钥文件(用于远程访问其他服务器等)

在这里插入图片描述
在这里插入图片描述

注意:首次访问远程服务器时,需要在jenkins的docker容器内 输入命令ssh xxx.xxx.xxx.xxx 访问其他服务器
授权成功后,jenkins才能无阻碍的访问其他服务器,否则jenkins执行脚本会访问失败
如果id_rsa 不行,那么就再加到 /root/.ssh/id_rsa 里面去
jenkins没足够权限访问 就 chmod 600 ~/.ssh/id_rsa
在这里插入图片描述

被访问的服务器需要填入公钥
在这里插入图片描述

注意:若jenkins是docker运行,若id_rsa文件(ssh私钥)不存在需要将id_rsa文件生成在容器内的jenkins_home目录下,才会生效

在这里插入图片描述

在SSH Server中加入需要远程连接的服务器,填写完成后,可以点击Test Configuration 查看是否成功

注意:远程连接的服务器需要在该服务器的/root/.ssh/authorized_keys文件中加入公钥
在这里插入图片描述

配置 全局工具配置

1. Maven 配置

在这里插入图片描述

2. JDK 安装

在这里插入图片描述

3. git安装

在这里插入图片描述

4. Maven安装

在这里插入图片描述

5. NodeJs安装

在这里插入图片描述

Jenkins自动部署pipeline脚本

前端

1. 编写脚本

pipeline {
    agent any
    
    environment {   
        // 定义远程服务器信息
        remoteServer = 'root@xxx.xxx.xxx.xxx'
        // 定义远程目标目录路径
        remoteDirectory = '/data/project'
        // 定义本地文件路径
        localFile = '/var/jenkins_home/workspace/xxxxxxx' //一般为该脚本的工作空间地址
    }
    
    stages {
        stage('拉取代码') {
            steps {
                // 使用Git插件拉取代码
                checkout([
                    $class: 'GitSCM',
                    branches: [[name: 'test']],
                    doGenerateSubmoduleConfigurations: false,
                    extensions: [],
                    userRemoteConfigs: [[
                        credentialsId: '8b6ff462-7abb-462a-a438-af1457d4509d', //流水线语法生成的git凭证
                        url: 'http://192.168.1.1/cd/xxxxx.git' //git/gitlab的项目地址
                    ]]
                ])
            }
        }
        
        stage('构建静态资源') {
            steps {
                // 在指定目录下进行构建
                dir('${localFile}/pc-eva-sys') { //docker中拉取的前端相关文件的路径
                    nodejs('node20') {
                        // 安装npm依赖
                        sh 'npm install'
                        // 运行构建命令
                        sh 'npm run build:dev'
                        // 压缩构建产物
                        sh 'tar -zcf ./dist/dist.tar.gz ./dist/*'
                    }
                }     
            }
        }
        
        stage('部署静态资源') {
            steps {
                script {
                    // 发送静态资源压缩包到远程服务器
                    sh "scp $localFile/pc-stu-eva-sys/dist/dist.tar.gz $remoteServer:$remoteDirectory/"
                    // 在远程服务器上解压缩静态资源
                    sh "ssh $remoteServer 'sudo tar -zxf $remoteDirectory/dist.tar.gz -C $remoteDirectory'"
                    // 删除远程服务器上的压缩包
                    sh "ssh $remoteServer 'rm -rf $remoteDirectory/dist.tar.gz'"
                }
            }
        }
        
        stage('清理工作区') {
            steps {
                script {
                    // 清理工作区
                    deleteDir()
                }
            }
        }
    }
}

2. 执行结果
在这里插入图片描述

后端

1. 设置构建参数
请添加图片描述
在这里插入图片描述

2. 编写脚本

pipeline {
    agent any
    
    environment {
        // 远程服务器上的目标目录路径
        remoteDirectory = '/data/xxx/deploy_jar'
        // 要发送到远程服务器的本地文件路径
        localFile = '/var/jenkins_home/workspace/xxxxxx/xxxxx-0.0.1-SNAPSHOT.jar'
        // 远程jar包地址
        remoteJarPath = "$remoteDirectory/xxxxx-0.0.1-SNAPSHOT.jar"
        // 指定的JDK工具
        jdkTool = 'jdk17'
        // 指定的Maven工具
        mavenTool = 'apache-maven-3.6.3'
    }
    
    
    stages {
        stage('拉取代码') {
            steps {
                checkout(
                    [$class: 'GitSCM',
                        branches: [[name: '${commit}']],
                        doGenerateSubmoduleConfigurations: false,
                        extensions: [],
                        // Git仓库的URL和凭证
                        userRemoteConfigs: [[credentialsId: 'xxxxxxxxxxxxxxxxxx', url: 'xxxxxxxxxxxxxxxxxxxxx']]]
                )
            }
        }
        
        stage('maven编译') {
            tools {
                // 使用指定的JDK和Maven工具
                jdk jdkTool
                maven mavenTool
            }
            steps {
               // 使用Maven编译项目
               sh "mvn -f stu-system/pom.xml clean -P product package"
            }
        }
        
        stage('发送jar包') {
            steps {
                script {
                    // 定义远程服务器地址
                    def remoteServer = "root@${ServerIp}"
                    // 使用SCP命令发送jar包到远程服务器
                    sh "scp $localFile $remoteServer:$remoteDirectory/"
                }
            }
        }
        
        stage('部署代码') {
            steps {
                script {
                    // 多个IP地址字符串
                    def serverIps = "${ServerIp}"
                    // 使用逗号分割IP地址列表
                    def ipList = serverIps.split(',')
                    
                    // 循环遍历IP地址列表
                    ipList.each { ip ->
                        // 构建远程服务器地址
                        def remoteServer = "root@${ip}"
                        // 使用SSH命令部署代码到远程服务器
                        sh "ssh $remoteServer '$remoteDirectory/deploy_jar.sh'"
                    }
                }
            }
        }
    //若需要sonarqube代码扫描可以用下面的脚本
    // stage('代码扫描') {
    //      tools {
    //             jdk "jdk17" // the name you have given the JDK installation using the JDK manager (Global Tool Configuration)
    //         }
        
    //     steps {
    //          dir(workspace) {
    //               script{
    //               // 引入SonarQubeScanner工具;sonar-scanner 与前面在Global Tool Configuration中配置的Name值一致
    //               scannerHome = tool 'sonarqube_scanner'   //sonarqube扫描器名
    //           }
    //              //引入SonarQube服务器环境;sonarqube 与前面在System Configuration 配置的Name值一致
    //             withSonarQubeEnv('sonarqube_severs') {    //sonarqube服务器名
    //               //windows环境使用 bat
    //                 sh"${scannerHome}/bin/sonar-scanner "+
    //                 "-Dsonar.host.url=${SONAR_HOST_URL} " +  //sonar服务地址
    //                 "-Dsonar.language=java " + 
    //                 "-Dsonar.projectKey=xxxxxxx " +  //项目ID
    //                 "-Dsonar.projectName=xxxxxxx " + //项目名称
    //                 "-Dsonar.projectVersion=0.0.1-SNAPSHOT " + 
    //                 "-Dsonar.login=admin " + //sonar登录账号 
    //                 "-Dsonar.password=xxxxxxx " +  //sonar登录密码
    //                 "-Dsonar.sourceEncoding=UTF-8 " + 
    //                 "-Dsonar.sources=. " + 
    //                 "-Dsonar.exclusions=**/test/**,**/target/**,**/resources/static/** " + 
    //                 "-Dsonar.java.binaries=. " //target 检测(maven编译后得到的文件)
    //             }
    //          }
    //     }
    // }
    stage('清理工作区') {
             steps {
                script {
                    // 删除工作区文件
                    deleteDir()
                }
            }
        }
    }
}

3. 执行结果
在这里插入图片描述

采用Jenkinsfile的方式构建pipeline脚本

在这里插入图片描述
选择 Pipeline script from SCM
在这里插入图片描述
按照该步骤填写,并将Jenkinsfile文件放在项目目录下
在这里插入图片描述
Jenkinsfile文件中的内容与2.编写脚本中的内容一致,只是调用方式改变。

执行结果:
在这里插入图片描述

Role-based Authorization Strategy插件配置用户权限

1.配置用户权限流程

在这里插入图片描述

2.设置Global roles 全局角色设置 和 Item roles 项目设置

在这里插入图片描述

3.配置角色权限范围

在这里插入图片描述

小结

可能遇见的问题:

1. 登陆初始密码后报错,该Jenkins实例似乎已离线。

在这里插入图片描述

解决方案:

原因一:升级站点的链接https://updates.jenkins.io/update-center.json默认是https

修改升级站点的链接

  1. 保留此离线页面,重新开启一个浏览器tab标签页
  2. 输入jenkins登陆网址http://localhost:8080/pluginManager/advanced (自己的登陆地址+路径/pluginManager/advanced )
  3. 进入该页面最底下,找到【Update Site】,把其中的链接改成http,http://updates.jenkins.io/update-center.json,点击Submit保存,Check now 能够检测当前URL是否能够更新站点;
  4. 提示jenkins,在重新启动jenkins,已经可以重新连网,下载插件
    在这里插入图片描述

重要:如果改完Http还是不行,请改成如下镜像
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
http://mirror.esuni.jp/jenkins/updates/update-center.json
http://mirror.xmission.com/jenkins/updates/update-center.json

原因二:Jenkins在下载插件之前会检查网络链接,会去读取配置文件的网址Jenkins_home/updates/default.json

修改default.json文件

  • 不管是用本地运行war包的方式启动的Jenkins,还是Docker运行的Jenkins,找到运行目录下(Docker就是挂载出来的目录)
  • 一个叫updates目录,修改里面的default.json文件,把第一个遇到的www.google.com,修改成www.baidu.com
  • 重启jenkins

注意:要先关闭jenkins后才能对该文件进行修改,否则修改保存无法生效
(docker 运行的jenkins 一定要挂载目录(如:Jenkins_home) 否则容器关闭后无法进入容器内修改default.json文件)

在这里插入图片描述

在这里插入图片描述

原因三:Jenkins访问连接被防火墙阻拦

关闭防火墙

  • 检查防火墙状态:systemctl status firewalld.service
  • 手动关闭防火墙:systemctl stop firewalld.service
  • 关闭防火墙开机自启:systemctl disable firewalld.service

原因四:Jenkins版本太老

  • 重新拉取其他版本的jenkins镜像,换一个可能就会成功,一般前面三个原因的不会出现,大概率的镜像版本引起的。
  • 例如:使用jenkins/jenkins:lts-alpine-jdk11 jenkins离线无法下载插件,换成jenkins/jenkins:lts-alpine-jdk17 就能正常运行

2. 前端npm构建找不到,env: ‘node’: No such file or directory

原因:出现问题是docker jenkins 里面没有自动安装node导致找不到这个Node命令
解决方案:手动安装nodejs

# 进入jenkins对应容器中
# docker exec -it [对应容器id] bash
 
# 安装nodejs
# apk add --no-cache nodejs
 
# 检查node
# node -v

3. pipeline执行过程中git参数的commit 版本选择出现 版本无法显示的问题

在这里插入图片描述

原因:原因未知

解决方案:
重新创建一个新的pipeline任务,可能解决该问题。
在这里插入图片描述

  • 12
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值