为之前有一个项目计划中使用Jenkins,但是后面因为某些原因直接使用coding上的基于Kubernetes的持续部署,直至今天才想起来去了解一下Jenkins。
首先认识一下什么是Jenkins。
可以参考中文官网:https://www.jenkins.io/zh/,说简单些Jenkins提供一个平台,通过十分强大丰富的一个个插件实现持续集成的软件平台。
Jenkins的作用
● 持续、自动的构建/测试软件项目
● 监控一些定时执行的任务
首先思考一下部署的本质?
前端:可以访问到index.html网页;
后端:执行jar/war包。
关于docker和Jenkins的部署参考下面文章:
1、docker 构建git+maven+jdk8的centos7环境,实现轻量级的springboot项目的自动化部署 :https://blog.csdn.net/qq_42937522/article/details/107755941
2、部署SpringBoot的jar包项目让人头疼,不如使用jenkins+docker自动化部署jar包项目:
https://blog.csdn.net/qq_42937522/article/details/106325306
3、Docker部署SpringMVC+Jsp项目:https://blog.csdn.net/zhang19903848257/article/details/121287999
coding平台介绍
官网地址:https://coding.net/
它类似于github、gitee同样提供了代码托管,以及项目协同、测试管理、制品库、持续集成、持续部署等一系列的工具。我们可以看一下官网提供的类比与GitHub、GitLab、Jenkins、Jira的功能优缺点。
作为工具的使用者,就不做过多的随意评论了。非要找几点Coding的缺点的话,
1、GitHub、Gitee仍然是国内外最大的代码托管平台,提供了许多优质的开源项目。
2、虽然一再承诺安全性并且也提供私有部署的入口(需要填写问卷就没有继续往下操作),但是哪有自己搭建一个自己的gitLab香。
自动化实现
这里我们基于上面博客一搭建起docker的项目环境。
而我们需要做的是coding合并代码后自动或者手动连接远程服务器,执行项目中的脚本文件smpe-admin.sh pull
。
首先在coding项目中创建构建计划,选择发起SSH连接
自定义该计划的流程配置
Jenkinsfile和sh脚本编写不太熟悉,一定存在更加精简优雅的写法有待完善,V1版如下,思路是
- 创建一个sh脚本,然后脚本中命令首先赋予权限,然后执行服务器端的mysh.sh脚本
- 把test.sh脚本发送到远程服务器执行,然后删除
def remoteConfig = [:]
remoteConfig.name = "my-remote-server"
remoteConfig.host = "${REMOTE_HOST}"
remoteConfig.allowAnyHosts = true
node {
// 使用当前项目下的凭据管理中的 用户名 + 密码 凭据
withCredentials([usernamePassword(
credentialsId: "${REMOTE_CRED}",
passwordVariable: 'password',
usernameVariable: 'userName'
)]) {
// SSH 登陆用户名
remoteConfig.user = userName
// SSH 登陆密码
remoteConfig.password = password
stage("通过 SSH 执行命令") {
// 本地创建一个 test.sh 脚本,用来发送到远端执行
writeFile(file: 'test.sh', text: 'ls; chmod +x mysh.sh; ./mysh.sh')
sshCommand(remote: remoteConfig, command: 'for i in {1..5}; do echo -n \"Loop \$i \"; date ; sleep 1; done')
sshScript(remote: remoteConfig, script: 'test.sh')
sshPut(remote: remoteConfig, from: 'test.sh', into: '.')
sshGet(remote: remoteConfig, from: 'test.sh', into: 'test_new.sh', override: true)
// sshRemove(remote: remoteConfig, path: 'test.sh')
}
stage("测试命令") {
echo '测试成功'
}
}
}
我们 也可以配置相关的触发规则
远程服务端定义mysh.sh
脚本
#/bin/bash
echo "开始执行"
docker exec tiku_api_test bash -c 'cd /project/group_test/tiku-api/ && sh smpe-admin.sh pull master'
echo "执行完成"
注意这儿的命令使用的docker exec 容器名称 -c '脚本命令'
,去掉了-it
,因为-it
会建立一个伪终端,docker容器中的输出语句在宿主机上接收。
之后进入到容器内部,查看smpe-admin.sh pull
由于我用的https方式,git在拉取远程仓库代码时需要填写用户名和密码(SSH不存在此问题)。这儿我同样调用脚本去自动输入账号和密码。
这儿采用expect方式实现脚本密码交互,yum install expect
touch gitpull.exp
# 内容如下usr/bin/expect声明不要忘记
#!/usr/bin/expect
set timeout 10
spawn git pull origin develop
expect "Username*"
用户名和密码可以使用coding上环境变量传递过来,也可以直接写死
send "$username\n"
expect "Password*"
send "$password\n"
expect eof
修改smpe-admin.sh文件中的pull命令调用gitpull.exp脚本expect gitpull.exp
测试:
构建成功