运行Docker镜像

# 版本Jenkins 2.435
docker run -d -u root --privileged -p 12500:8080 -v /usr/local/szh/jenkins:/var/jenkins_home --name jenkins jenkins/jenkins

打开Jenkins Web端

  • http://xxx:12500

Docker部署Jenkins+Pipeline_pipeline

查找密码

  • cat /var/jenkins_home/secrets/initialAdminPassword

初始安装插件

  • 选第二项,然后选择无,暂时不安装插件

Docker部署Jenkins+Pipeline_git_02

设置插件加速

  • 进入服务器,非Docker安装,进入/var/lib/jenkins目录,Docket安装进入映射目录
  • 替换updates目录下的default.json
sed -i 's/updates.jenkins.io\/download/mirrors.tuna.tsinghua.edu.cn\/jenkins/plugins/g' default.json
sed -i 's/www.google.com/www.baidu.com/g' default.json
  • 设置Manage Jenkins->Manage Jenkins->Advanced->Update Site->URL为:
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
  • 重启Jenkins
http://10.1.0.12:1250/restart

Docker部署Jenkins+Pipeline_pipeline_03

安装中文插件

  • 搜索Chinese并安装

Docker部署Jenkins+Pipeline_docker_04

权限配置

权限插件安装

Docker部署Jenkins+Pipeline_maven_05

权限配置

  • (添加角色)系统管理->Manage and Assign Roles->Manage Roles
  • 新建全局基本登录Normal角色,只给Read权限。

Docker部署Jenkins+Pipeline_docker_06

  • 新建项目相关权限,可以使用正则匹配,比如以下权限仅限于拥有kcc开头的项目权限。

Docker部署Jenkins+Pipeline_maven_07

新建用户

  • 系统管理->管理用户->创建用户

给用户指定角色

  • 系统管理->Manage and Assign Roles->Assign Roles

管理凭证

安装Credentials Binding

Docker部署Jenkins+Pipeline_docker_08

配置凭证

  • 系统管理 - > 凭据管理

Docker部署Jenkins+Pipeline_maven_09

  • 点击"全局"进行凭证添加。

Docker部署Jenkins+Pipeline_git_10

Docker部署Jenkins+Pipeline_docker_11

GitLab拉取代码

安装Git插件

Docker部署Jenkins+Pipeline_docker_12

  • 依赖Credentials Binding

创建用户密码凭证

Docker部署Jenkins+Pipeline_maven_13

Docker部署Jenkins+Pipeline_git_14

用户密码模式拉取源码

配置项目

  • 创建test-git的自由风格项目
  • 在“源码管理”中选择Git,并按下图配置
  • 配置完成点击“应用”,“保存”

Docker部署Jenkins+Pipeline_pipeline_15

构建项目

  • 点击项目“立即构建”

Docker部署Jenkins+Pipeline_git_16

  • 查看构建输出

Docker部署Jenkins+Pipeline_docker_17

Docker部署Jenkins+Pipeline_maven_18

查看拉取目录

  • 查看映射目录下的"workspace"

Docker部署Jenkins+Pipeline_docker_19

  • test-git为我们测试git的源码拉取目录,目录名为我们的Jenkins项目名。

Docker部署Jenkins+Pipeline_docker_20

SSH密钥模式

生成公私钥

  • 公私钥生成需在Jenkins服务器上操作
  • 私钥存放在Jenkins服务器
  • 公钥存放在应用服务器,如GitLab
ssh-keygen -t rsa

GitLab设置SSH密钥

  • 以管理员身份登录GitLab
  • 点击头像中“偏好设置”

Docker部署Jenkins+Pipeline_Jenkins_21

  • 点击SSH密钥

Docker部署Jenkins+Pipeline_Jenkins_22

  • cat /root/.ssh/id_rsa.pub
  • 复制公钥内容添加到Gitlab
  • 点击添加密钥

Docker部署Jenkins+Pipeline_docker_23

Jenkins添加SSH凭证

  • cat /root/.ssh/id_rsa
  • 将私钥内容填入Jenkins密钥系统

Docker部署Jenkins+Pipeline_docker_24

测试SSH模式拉取源码

  • 新建test-git02
  • 配置Git
  • 坑:如遇非默认SSH端口号的,需按以下方式解决

从GitLab上复制的SSH地址,如:git@git.cloud66.cn:gh-api/szh-cloud.git,需要改成:ssh://git@10.1.0.12:22022/gh-api/szh-cloud.git

Docker部署Jenkins+Pipeline_docker_25

配置全局工具

  • 点击系统管理 -> 全局工具配置

添加JDK

Docker部署Jenkins+Pipeline_docker_26

添加Maven

Docker部署Jenkins+Pipeline_maven_27

配置环境变量

进入docker配置环境变量,如果docker无法使用vim,需要先apt update,然后执行apt install vim安装vim /etc/profileexport MAVEN_HOME=/var/jenkins_home/tool/maven3.9

export PATH=Docker部署Jenkins+Pipeline_docker_28MAVEN_HOME/binsource /etc/profile

配置全局属性

  • 点击系统管理 -> 系统配置 -> 全局属性

Docker部署Jenkins+Pipeline_docker_29

修改Maven配置文件

<?xml version="1.0" encoding="UTF-8"?>

<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">

  <localRepository>/var/jenkins_home/tool/maven3.9/repository</localRepository>

  <servers />

  <mirrors>

    <mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>
    </mirror>
  </mirrors>

  <profiles>

  </profiles>

</settings>

Pipeline流水线

安装 Pipeline Stage View 插件

Docker部署Jenkins+Pipeline_git_30

安装Pipeline

Docker部署Jenkins+Pipeline_docker_31

编写Pipeline脚本

  • 可通过下面的流水线语法辅助编写
  • Jenkins管理脚本不利于版本控制,以及灾备,建议脚本和项目代码存放在一起
  • 注:tools中可以指定“全局工具配置”中配置的JDK,MAVEN等版本

Docker部署Jenkins+Pipeline_git_32

项目中存放Jenkins脚本

  • 在项目的doc目录下新建Jenkinsfile,将脚本内容添加进去
  • 提交Jenkinsfile到git中
  • 配置脚本从git中读取
  • 定义选择:Pipeline script from SCM

Docker部署Jenkins+Pipeline_git_33

Jenkinsfile

  • 声明式语法
pipeline {
    agent any

    tools{
        jdk 'jdk11'
    }

    stages {
        stage('拉取代码') {
            steps {
                checkout scmGit(branches: [[name: '*/hongyanhe']], extensions: [], userRemoteConfigs: [[credentialsId: 'cfef8f40-2d0e-4c06-b6c8-a76688b406b0', url: 'ssh://git@10.1.0.12:22022/gh-api/szh-flow.git']])
            }
        }
        stage('构建代码') {
            steps {
                sh 'mvn -DskipTests clean package docker:removeImage docker:build'
            }
        }
        stage('部署服务') {
                    steps {
                        script{
                            imageName='10.1.0.12:18090/szhflow'
                            tag='1.0-SNAPSHOT-dev'
                            sshPublisher(publishers: [sshPublisherDesc(configName: '10.1.0.12', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/usr/local/szh/jenkins/deploy.sh $imageName $tag", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                        }
                    }
                }
    }
}
  • 脚本式语法
node {
    // 指定JDK版本
    env.JAVA_HOME = tool name: 'jdk11'
    stage('拉取代码') {
        checkout scmGit(branches: [[name: '*/hongyanhe']], extensions: [], userRemoteConfigs: [[credentialsId: 'cfef8f40-2d0e-4c06-b6c8-a76688b406b0', url: 'ssh://git@10.1.0.12:22022/gh-api/szh-flow.git']])
    }
    stage('构建代码') {

        sh 'mvn -DskipTests clean package docker:removeImage docker:build'
    }
    stage('部署服务') {
        def imageName='10.1.0.12:18090/szhflow'
        def tag='1.0-SNAPSHOT-dev'
        sshPublisher(publishers: [sshPublisherDesc(configName: '10.1.0.12', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/usr/local/szh/jenkins/deploy.sh $imageName $tag", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
   }
}

Pipeline触发器

远程触发构建

  • 身份令牌代表访问密钥
  • 通过下面给出的Url访问example携带身份令牌进行远程构建
  • 例:http://10.1.0.12:12500/me/my-views/view/all/job/szh-flow/build?token=test

Docker部署Jenkins+Pipeline_Jenkins_34

其他工程构建后触发

  • 此触发器依赖其他工程构建后触发构建

GitLab Hook插件

安装 Generic Webhook Trigger 插件

Docker部署Jenkins+Pipeline_pipeline_35

配置 Generic Webhook Trigger 插件

  • 只需配置好Token,其他默认即可,Token一般为项目名

Docker部署Jenkins+Pipeline_pipeline_36

配置GitLab WebHook

  • 项目 -> 设置 -> Webhooks
  • 网址为 Generic Webhook Trigger 中提示的网址

Docker部署Jenkins+Pipeline_git_37

  • 指定推送事件的分支

Docker部署Jenkins+Pipeline_docker_38

  • 坑:保存之后会产生以下错误提示:

Docker部署Jenkins+Pipeline_Jenkins_39

  • 解决:管理员 -> 设置 -> 网络
  • 勾选:允许Webhook和服务对本地网络的请求

Docker部署Jenkins+Pipeline_pipeline_40

参数化构建

  • 项目配置 -> 参数化构建过程,如下所示:
  • 脚本中引用参数,可以使用类似EL表达式使用,例如:${branch}

Docker部署Jenkins+Pipeline_git_41

  • 菜单列表选择 Build with Parameters

Docker部署Jenkins+Pipeline_pipeline_42

安装 Publish Over SSH 插件

  1. 安装publish over ssh插件
  2. 将jenkins公钥发送给远程服务器,ssh-copy-id 10.1.0.12
  3. 系统配置中配置publish over ssh相关信息
  4. 编写脚本代码

安装publish over ssh插件

Docker部署Jenkins+Pipeline_git_43

配置插件信息:系统管理 -> 系统配置 -> publish over ssh

Docker部署Jenkins+Pipeline_maven_44

新增服务器

Docker部署Jenkins+Pipeline_git_45

编写Jenkins执行脚本

  • 通过流水线脚本示例代码生成
  • 将修改后的脚本加入Jenkinsfile

Docker部署Jenkins+Pipeline_pipeline_46

  • 设置好这两项后,直接可以点击生成流水线代码,主要修改 execCommand 的脚本内容
sshPublisher(publishers: [sshPublisherDesc(configName: '10.1.0.12', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '/usr/local/szh/jenkins/deploy.sh', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
mvn clean package -P dev docker:build –DpushImage

编写部署脚本deploy.sh

#!/bin/sh
imageName=$1

# 截取项目名
projectName=`echo ${imageName#*/}`
echo $projectName

version=$2
# 查找容器
containerId=`docker ps | grep -w $projectName | awk '{print $1}'`
# 如果容器存在则删除
if [ "$containerId" != "" ]; then
	docker rm -f $containerId
	echo 删除容器:$containerId
fi
imageId=`docker images | grep -w $imageName | awk '{print $3}'`
# 如果镜像存在则删除
if [ "$imageId" != "" ]; then
	docker rmi -f $imageId
	echo 删除镜像:$imageId
fi
# 开始拉取镜像
docker pull $imageName:$version
# 启动容器
if [ ! -d /usr/local/szh/$projectName ]; then
	 echo 创建映射目录:/usr/local/szh/$projectName
	 mkdir -p /usr/local/szh/$projectName
	 chmod -R 777 $_
fi
#docker run -d --net=host --restart=always --privileged=true -v $projectName:/app  --name $projectName $imageName:$version

部署前端代码

步骤:

  • Git拉取前端代码
  • 安装nodejs插件
  • 使用npm打包前端代码
  • 使用ssh远程发送到nginx目录

安装Nodejs插件

Docker部署Jenkins+Pipeline_git_47

配置Nodejs

  • 点击 系统管理 -> 全局工具配置 -> 新增Nodejs

Docker部署Jenkins+Pipeline_git_48

部署代码

Docker部署Jenkins+Pipeline_git_49

stage('打包,部署网站'){
  //使用nodejs的npm进行打包
  nodejs('nodejs20.6)
  sh '''
    npm install
    npm run build
  '''
}
# 远程部署采用的是目录拷贝的方式,不是脚本方式