安装

拉取镜像:docker pull jenkinsci/blueocean:latest

创建主目录:mkdir -p /data/jenkins

运行容器:

1
2
3
4
5
6
7
docker run -d -u root \
-p 8080:8080 \
-p 50000:50000 \
-v /data/jenkins:/var/jenkins_home \
-v /etc/localtime:/etc/localtime \
-v /var/run/docker.sock:/var/run/docker.sock \
--name jenkins jenkinsci/blueocean:latest

访问页面

浏览器访问http://ip:8080进入Jenkins管理界面
初始密码查询:cat /data/jenkins/secrets/initialAdminPassword
默认账号名:admin

插件安装

如果在页面安装插件失败,也可进入jenkins容器内部用命令安装,比如安装git插件:

1
jenkins-plugin-cli --plugins git

修改插件镜像源

Jenkins在安装插件时,默认使用官方地址下载,有时可能速度太慢导致安装失败,可换成国内镜像地址:

vim /data/jenkins/hudson.model.UpdateCenter.xml

修改改成清华大学镜像地址:

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

部署mvn程序

安装插件Docker 和 Docker Pipeline

设置maven镜像仓库,创建一个文件/data/jenkins/settings.xml,里面指定镜像路径:

1
2
3
4
5
6
7
8
 <mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>

新建流水线项目,由于这是使用的maven是容器,把配置文件映射进去,表示从阿里云获取maven依赖,这样拉取依赖会快很多;mvn容器默认使用的jdk11,有时候为了使用低版本的java,还需要把java环境变量配置进去:

1
2
3
4
5
6
7
8
pipeline {
agent {
docker {
image 'maven:latest'
args '-v /root/.m2:/root/.m2 -v /data/jenkins/settings.xml:/usr/share/maven/conf/settings.xml -v /home/xtwh/jdk1.8.0_271:/usr/local/jdk1.8.0_271 -e JAVA_HOME=/usr/local/jdk1.8.0_271'
}
}
}

配置ssh拉取git代码

  1. 在Jenkins服务器上创建公私钥对ssh-keygen

  2. jenkins中添加私钥:Dashboard -> 凭据 -> 系统 -> 全局凭据,添加凭据SSH Username with private key得到唯一凭据id;

  3. 在git服务器中添加公钥;

  4. 在流水线项目中添加唯一凭据id:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    pipeline {
    agent any
    stages {
    stage('Git Clone') {
    steps {
    git credentialsId: 'xxx-xxx-xxx', url: 'ssh://git@xxx.xxx.xxx/gitlab-instance-xxx/xxx.git'
    }
    }
    // ...
    }
    }

报错一

You’re using ‘Known hosts file’ strategy to verify ssh host keys, but your known_hosts file does not exist, please go to ‘Manage Jenkins’ -> ‘Configure Global Security’ -> ‘Git Host Key Verification Configuration’ and configure host key verification.

方式一:

在容器中手动创建文件/root/.ssh/known_hosts

方式二:
修改配置系统管理 -> 全局安全配置

报错二

Couldn’t find any revision to build. Verify the repository and branch configuration for this job.

Jenkins调用git时用了默认的master分支,而gitlab这边使用的是main分支,指定分支名:

1
2
3
4
5
stage('Git Clone') {
steps {
git branch: 'main', credentialsId: 'xxx-xxx-xxx', url: 'ssh://git@xxx.xxx.xxx/gitlab-instance-xxx/xxx.git'
}
}

发布

需要安装Publish Over SSH插件

系统管理 -> 系统配置中找到Publish over SSH选项,添加服务器,主要配置如下:

  • SSH Server Name: ssh配置名称(自定义)记住这个名称,pipeline代码中要用到
  • Hostname: 主机IP
  • Username: ssh账户名
  • Password: ssh密码
  • Remote Directory: 远程路径,可以理解为ssh连接上后自动cd到目录

完整部署脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
def remoteId = 'xxx.xxx.xxx.xxx'  // 远程服务器配置名

pipeline {
agent {
docker {
image 'maven:latest'
args '-v /root/.m2:/root/.m2 -v /data/jenkins/settings.xml:/usr/share/maven/conf/settings.xml -v /home/xtwh/jdk1.8.0_271:/usr/local/jdk1.8.0_271 -e JAVA_HOME=/usr/local/jdk1.8.0_271'
}
}
stages {
stage('Checkout') {
steps {
git branch: 'main', credentialsId: 'xxx-xxx-xxx', url: 'ssh://git@xxx.xxx.xxx/gitlab-instance-xxx/xxx.git'
}
}
stage('Build') {
steps {
sh 'mvn -B -DskipTests clean package'
}
}
stage('Zip'){
steps{
// 将生成的Dockerfile,deploy.sh 和jar包整成压缩包发往远程服务器
sh """
cd ./your-soa-test/target
rm -rf target.tar.gz
tar -zcvf target.tar.gz lib/* resources/* your-soa-test-0.0.1-SNAPSHOT-boot.jar
"""
}
}
stage('Publish'){
steps {
// 必须装了Publish over SSH插件才能写这个
sshPublisher(publishers: [sshPublisherDesc(configName: """$remoteId""", transfers: [sshTransfer(cleanRemote: false, excludes: '',
execCommand: """
supervisorctl status > 1.txt // 这里的1.txt在/root目录,即默认工作目录~
""",
execTimeout: 120000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: '/test', // 这里是相对路径(相对于远程服务器的Remote Directory目录/usr/local/jars)
remoteDirectorySDF: false,
removePrefix: 'your-soa-test/target',
sourceFiles: 'your-soa-test/target/target.tar.gz')], // 这里是相对路径(相对于Jenkins的工作目录/var/jenkins_home/workspace/project_name)
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: true)])
echo "发布成功"
}
}
}
}

触发(基于推送gitlab)

Jenkins操作

安装插件gitlab

项目的构建触发器,勾选gitlab选项

设置Secret token,最后保存配置

Gitlab操作

项目 -> 设置 -> Webhooks,创建一个Webhook,主要配置如下3项

  • Jenkins触发url地址
  • token值
  • 触发条件:推送

报错

Urlis blocked: Requests to the local network are not allowed

在gitlab的admin -> Settings -> NetworkOutbound requests选项中,勾选Allow requests to the local network from webhooks and integrations