运行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
查找密码
- cat /var/jenkins_home/secrets/initialAdminPassword
初始安装插件
- 选第二项,然后选择无,暂时不安装插件
设置插件加速
- 进入服务器,非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
安装中文插件
- 搜索Chinese并安装
权限配置
权限插件安装
权限配置
- (添加角色)系统管理->Manage and Assign Roles->Manage Roles
- 新建全局基本登录Normal角色,只给Read权限。
- 新建项目相关权限,可以使用正则匹配,比如以下权限仅限于拥有kcc开头的项目权限。
新建用户
- 系统管理->管理用户->创建用户
给用户指定角色
- 系统管理->Manage and Assign Roles->Assign Roles
管理凭证
安装Credentials Binding
配置凭证
- 系统管理 - > 凭据管理
- 点击"全局"进行凭证添加。
GitLab拉取代码
安装Git插件
- 依赖Credentials Binding
创建用户密码凭证
用户密码模式拉取源码
配置项目
- 创建test-git的自由风格项目
- 在“源码管理”中选择Git,并按下图配置
- 配置完成点击“应用”,“保存”
构建项目
- 点击项目“立即构建”
- 查看构建输出
查看拉取目录
- 查看映射目录下的"workspace"
- test-git为我们测试git的源码拉取目录,目录名为我们的Jenkins项目名。
SSH密钥模式
生成公私钥
- 公私钥生成需在Jenkins服务器上操作
- 私钥存放在Jenkins服务器
- 公钥存放在应用服务器,如GitLab
ssh-keygen -t rsa
GitLab设置SSH密钥
- 以管理员身份登录GitLab
- 点击头像中“偏好设置”
- 点击SSH密钥
- cat /root/.ssh/id_rsa.pub
- 复制公钥内容添加到Gitlab
- 点击添加密钥
Jenkins添加SSH凭证
- cat /root/.ssh/id_rsa
- 将私钥内容填入Jenkins密钥系统
测试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
配置全局工具
- 点击系统管理 -> 全局工具配置
添加JDK
添加Maven
配置环境变量
进入docker配置环境变量,如果docker无法使用vim,需要先apt update,然后执行apt install vim安装vim /etc/profileexport MAVEN_HOME=/var/jenkins_home/tool/maven3.9
export PATH=MAVEN_HOME/binsource /etc/profile
配置全局属性
- 点击系统管理 -> 系统配置 -> 全局属性
修改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 插件
安装Pipeline
编写Pipeline脚本
- 可通过下面的流水线语法辅助编写
- Jenkins管理脚本不利于版本控制,以及灾备,建议脚本和项目代码存放在一起
- 注:tools中可以指定“全局工具配置”中配置的JDK,MAVEN等版本
项目中存放Jenkins脚本
- 在项目的doc目录下新建Jenkinsfile,将脚本内容添加进去
- 提交Jenkinsfile到git中
- 配置脚本从git中读取
- 定义选择:Pipeline script from SCM
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
其他工程构建后触发
- 此触发器依赖其他工程构建后触发构建
GitLab Hook插件
安装 Generic Webhook Trigger 插件
配置 Generic Webhook Trigger 插件
- 只需配置好Token,其他默认即可,Token一般为项目名
配置GitLab WebHook
- 项目 -> 设置 -> Webhooks
- 网址为 Generic Webhook Trigger 中提示的网址
- 指定推送事件的分支
- 坑:保存之后会产生以下错误提示:
- 解决:管理员 -> 设置 -> 网络
- 勾选:允许Webhook和服务对本地网络的请求
参数化构建
- 项目配置 -> 参数化构建过程,如下所示:
- 脚本中引用参数,可以使用类似EL表达式使用,例如:${branch}
- 菜单列表选择 Build with Parameters
安装 Publish Over SSH 插件
- 安装publish over ssh插件
- 将jenkins公钥发送给远程服务器,ssh-copy-id 10.1.0.12
- 系统配置中配置publish over ssh相关信息
- 编写脚本代码
安装publish over ssh插件
配置插件信息:系统管理 -> 系统配置 -> publish over ssh
新增服务器
编写Jenkins执行脚本
- 通过流水线脚本示例代码生成
- 将修改后的脚本加入Jenkinsfile
- 设置好这两项后,直接可以点击生成流水线代码,主要修改 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插件
配置Nodejs
- 点击 系统管理 -> 全局工具配置 -> 新增Nodejs
部署代码
stage('打包,部署网站'){
//使用nodejs的npm进行打包
nodejs('nodejs20.6)
sh '''
npm install
npm run build
'''
}
# 远程部署采用的是目录拷贝的方式,不是脚本方式