- 项目摘要:
本文基于文档https://blog.csdn.net/qq_25337221/article/details/106160024和
https://blog.csdn.net/qq_25337221/article/details/106185232编写。
主要是将一个war包项目发布到目标服务器,并远程执行Tomcat。本实例使用之所以未使用springboot,主要是增强一些难度系数,进一步加强jenkins的学习。后续将进一步优化与改进。本实例仍然是入门项目。
这里一共分三步:
- 将jenkins服务器的公钥配置到目标服务器,使其可以免密传输。
- 在jenkins安装SSH Pipeline Steps插件。
- 编写pipline和shell。
- 项目具体实施:
- 将jenkins服务器的公钥配置到目标服务器
- 在A服务器中生成秘钥对
#ssh-keygen -t rsa -P ""
# scp /root/.ssh/id_rsa.pub root@target ip:/root
- 登录B服务器,将刚才拷贝的公钥文件内容写入到B服务器的.ssh目录下的authorized_keys文件中。
# cat /root/id_rsa.pub >> .ssh/authorized_keys
- 此时,A登录B或者A向B发送文件将不需要密码。
- 在jenkins安装SSH Pipeline Steps插件。
- 新建一个简单Gradle构建的Servlet项目,并在目标服务器安装jdk,gradle,tomcat。并配置好相关环境变量。
- 在目标服务器创建/root/demo目录,并在里面新建start.sh脚本用于部署项目与启动Tomcat,并赋予chmod a+x start.sh 可执行权限。脚本内容如下:
#!/bin/bash
pid=$(ps -ef | grep 8080 | grep -v grep | awk '{print $2}')
if [ -n "$pid" ]; then
echo $pid
/usr/local/apache-tomcat/bin/shutdown.sh
fi
rm -rf /usr/local/apache-tomcat/demo*
cp -rf /root/demo/demo.war /usr/local/apache-tomcat/webapps
/usr/local/apache-tomcat/bin/startup.sh
- 在jenkins新建一个pipline任务,名称为remote-demo-pipline。在jenkins服务器安装gradle,并且在jenkins配置gradle。
在流水线编写如下脚本:
def getHost(){
def remote = [:]
remote.name = 'targetServer'
remote.host = 'targetIPAddress'
remote.user = 'root'
remote.port = 22
remote.password = 'targetPassword'
remote.allowAnyHosts = true
return remote
}
pipeline{
agent any
tools {
gradle 'gradle6.0.1'
jdk 'jdk1.8'
}
environment{
TASK_NAME="remote-demo-pipline"
PROJECT="demo.war"
PROJECT_NAME="demo"
}
options{
buildDiscarder(logRotator(numToKeepStr: '10'))
timestamps()
}
triggers{
pollSCM('H/1 * * * *')
}
stages{
stage('init-server'){
steps {
script {
server = getHost()
}
}
}
stage('Preparation'){
steps{
echo 'pulling code'
/*git code*/
}
}
stage('Build'){
steps{
script{
echo 'Stopping Application'
echo 'starting build'
sh './gradlew clean build -x test'
}
}
}
stage('Deploy'){
steps{
script{
echo 'copy new project'
sh 'scp /var/lib/jenkins/workspace/$TASK_NAME/build/libs/$PROJECT root@targetIP:/root/demo'
echo "starting project"
sshCommand remote: server, command: "/root/demo/start.sh"
echo "startup success!"
}
}
}
}
post {
success {
emailext (
subject: "SUCCESSFUL: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'",
body: """<p>SUCCESSFUL: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]':</p>
<p>Check console output at "<a href="${env.BUILD_URL}">${env.JOB_NAME} [${env.BUILD_NUMBER}]</a>"</p>""",
to: "your@qq.com,your@qq.com",
from: "your@qq.com"
)
slackSend channel: "#success-demo", message: "Content Build and Validate Succeded for ${env.CONTENT_GIT_REPO} for Repository ${env.CONTENT_GIT_URL} by ${env.JOB_NAME} (<${env.BUILD_URL}|Open>)", color: 'success', tokenCredentialId: 'slack-token'
}
failure {
emailext (
subject: "FAILED: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'",
body: """<p>FAILED: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]':</p>
<p>Check console output at "<a href="${env.BUILD_URL}">${env.JOB_NAME} [${env.BUILD_NUMBER}]</a>"</p>""",
to: "your@qq.com,your@qq.com",
from: "your@qq.com"
)
slackSend channel: "# failure-jenkins", message: "Content Build and Validate FAILED for ${env.CONTENT_GIT_REPO} for Repository ${env.CONTENT_GIT_URL} by ${env.JOB_NAME} (<${env.BUILD_URL}|Open>)", color: 'warning', tokenCredentialId: 'slack-token'
}
}
}
- 此时基本搭建完成。这里很明显有一处是有问题的,就是需要远程明文密码,后面将对以上内容进一步改进。但是有可能是基于springboot、springcloud项目。
- 参考链接:
- 将jenkins服务器的公钥配置到目标服务器: https://www.cnblogs.com/youcong/p/10809056.html
2. jenkins 部署项目到远程服务器: https://blog.csdn.net/catoop/article/details/100511027
本内容由安康学院“雨季”原创。