准备插件,安装好以下插件
- SSH Pipeline Steps 在SSH Over Publisher 插件不能用的情况下安装,可以在远程服务器上运行命令与操作文件详细说明
https://github.com/jenkinsci/ssh-steps-plugin#pipeline-steps
- Generic Webhook Trigger Plugin 用于设置钩子,在git push 时自动触发构建,详细说明
https://github.com/jenkinsci/generic-webhook-trigger-plugin
Jenkinsfile
文件在项目中添加 Jenkinsfile文件,并且提交。Jenkins将根据该文件内容进行构建。
先按照插件Docker
。
在Jenkinsfile文件中添加内容如下,保证Jenkins能完成基本的包下载与打包功能。详细如下:
node {
checkout scm
docker.image('maven:3.6.1-jdk-13').inside('-v /root/.m2:/root/.m2') //映射文件无需每次下载包jar
{
stage('Build'){
sh 'pwd'
sh 'java -version'
sh 'mvn clean package -Dmaven.test.skip=true'
sh '''
cd /root/.m2
ls -l
'''
}
}
}
先安装插件 Docker
。
在Jenkins中使用服务器运行build,前提开启服务器Docker的远程服务,可参考开启Docker远程服务,在Jenkinsfile中添加代码如下:
docker.withServer('tcp://192.168.30.248:2375'){
def cusImage=docker.build("${env.JOB_NAME}:latest",'./hitgen-appcenter-api')
}
先安装插件 Generic Web Hook
在Jenkins中添加触发器,用于出发Jenkins自动构建,其代码如下:
checkout scm
echo "${env.JOB_NAME}"
properties([
pipelineTriggers([
[$class: 'GenericTrigger',
genericVariables: [
[key: 'ref', value: '$.resource.refUpdates[0].name'],
//[key: 'ref', value: '$.ref'],
// [
// key: 'before',
// value: '$.before',
// expressionType: 'JSONPath', //Optional, defaults to JSONPath
// regexpFilter: '', //Optional, defaults to empty string
// defaultValue: '' //Optional, defaults to empty string
// ]
],
// genericRequestVariables: [
// [key: 'requestWithNumber', regexpFilter: '[^0-9]', defaultValue:'requestWithNumber_test'],
// [key: 'requestWithString', regexpFilter: '']
// ],
// genericHeaderVariables: [
// [key: 'headerWithNumber', regexpFilter: '[^0-9]', defaultValue:'headerWithNumber_test'],
// [key: 'headerWithString', regexpFilter: '']
// ],
causeString: 'Triggered on $ref',
token: abc, //该值可根据实际进行修改
tokenCredentialId: '',
printContributedVariables: true,
printPostContent: true,
silentResponse: false,
regexpFilterText: '$ref',
regexpFilterExpression: 'refs/heads/' + BRANCH_NAME
]
])
])
在gitlab 选择push事件,添加 http://JENKINS_URL/generic-webhook-trigger/invoke?token=abc通知。可参考 https://docs.gitlab.com/ee/user/project/integrations/webhooks.html
在开发机器上push代码到git服务器时,将会发送通知请求到Jenkins服务器,Jenkins服务器将自动构建。
Jenkinsfile文件中添加如下代码,用于远程启动容器,如下:
stage('Startup'){
def remote = [:]
remote.name = 'Java-Server'
remote.host = 'xxx.xxx.xxx.xxx'
remote.user = 'root'
remote.password = 'yor password'
remote.allowAnyHosts = true
sshScript remote: remote, script: 'hitgen-appcenter-api/run.sh' //执行服务器命令
}
完整代码:
node {
properties([
pipelineTriggers([
[$class: 'GenericTrigger',
genericVariables: [
[key: 'ref', value: '$.resource.refUpdates[0].name'], //定义变量
//[key: 'ref', value: '$.ref'],
// [
// key: 'before',
// value: '$.before',
// expressionType: 'JSONPath', //Optional, defaults to JSONPath
// regexpFilter: '', //Optional, defaults to empty string
// defaultValue: '' //Optional, defaults to empty string
// ]
],
// genericRequestVariables: [
// [key: 'requestWithNumber', regexpFilter: '[^0-9]', defaultValue:'requestWithNumber_test'],
// [key: 'requestWithString', regexpFilter: '']
// ],
// genericHeaderVariables: [
// [key: 'headerWithNumber', regexpFilter: '[^0-9]', defaultValue:'headerWithNumber_test'],
// [key: 'headerWithString', regexpFilter: '']
// ],
causeString: 'Triggered on $ref',
token: 'abc', //请求的token
tokenCredentialId: '',
printContributedVariables: true,
printPostContent: true,
silentResponse: false,
regexpFilterText: '$ref',
regexpFilterExpression: 'refs/heads/' + BRANCH_NAME
]
])
])
checkout scm
docker.image('maven:3.6.1-jdk-13').inside('-v /root/.m2:/root/.m2') //映射文件无需每次下载包jar
{
stage('Package'){
sh 'pwd'
sh 'java -version'
sh 'mvn clean package -Dmaven.test.skip=true'
sh '''
cd /root/.m2
ls -l
'''
}
}
def remote = [:]
remote.name = 'java-Server'
remote.host = 'xxx.xxx.xxx.xxx'
remote.user = 'root'
remote.password = 'yor password'
remote.allowAnyHosts = true
stage('Build'){
sshScript remote: remote, script: 'hitgen-appcenter-api/clean.sh' //在服务上执行clean.sh,其作用为 清理关联的容器
docker.withServer('tcp://192.168.30.248:2375'){
def cusImage=docker.build("${env.JOB_NAME}:latest",'./test') //使用.test/Dockfile编译
}
}
stage('Startup'){
sshScript remote: remote, script: 'hitgen-appcenter-api/run.sh' //在服务上执行clean.sh,其作用为启动容器
}
}
完成以上步骤将可自动部署,完成容器在服务器上启动。