前言

本人是个java开发,第一次接触devops系统的开发,对shell脚本并不是特别的熟悉,因此实现的方式可能比较愚蠢,大神勿喷,如果有更好的建议,欢迎留言。

需求

devops开发(二开),在pipeline执行过程中,拉取代码后进行sonar扫描。
要求sonar扫描后生成pdf文件后,上传至minio文件服务器并且提供下载功能。

分析与难点

  1. 在旧版本中,生成的sonarPDF文件直接储存在了跑在同一台主机的tomcat上,只需要在shell脚本中cp一下就ok了。但是, 新版本Jenkins与minio文件服务器不在同一台主机上。所以需要想办法把Jenkins主机上生成的pdf文件上传至minio。
  2. 每一个应用对应一个pipeline,每次执行当前应用的pipeline都会生成一个新的版本,每个版本都会生成一个sonarPDF文件。但是当前应用的pipeline和sonar中的项目是一一对应的关系,也就是说每次sonar扫描后都会覆盖jenkins上生成的pdf文件,所以需要每次生成后利用我们自定义的规则分别存储再minio服务器上。
  3. 如果我在devops开发系统服务器上写代码,读取jenkins服务器上某目录下的pdf文件为Inputstream,然后再调用minioSDK上传至minio。 就会变成 Jenkins -> devops -> minio,怎么感觉都觉得不合理。所以经过思考,决定再Jenkins服务器执行Pipeline时执行到sonar.sh脚本中的生成pdf文件成功后,在脚本中追加一段上传minio服务器的代码。
  4. 随之而来的问题。上传至minio服务器的脚本应该怎么写?翻遍文档资料,只发现了minio提供的SDK,并没有发现有shell上传的文档。
  5. 最终,经过仔细研究,发现minio的有一个data的目录,只要把文件放入到这个文件夹中,就会显示出Bucket和对应的文件。那么,如何利用shell脚本在Jinkens服务器远程动态生成目录?创建完目录后又如何把pdf传递至minio服务器?

minio官方文档:https://docs.min.io/cn

实现SSH无密码登录

  1. 使用ssh-keygen命令在本地机器上使用ssh-keygen产生公钥私钥对。
$ ssh-keygen
  1. 用ssh-copy-id将公钥复制到远程机器中
$  ssh-copy-id -i .ssh/id_rsa.pub  用户名字@192.168.x.xxx
  1. 登录到远程机器不用输入密码
$  ssh 用户名字@192.168.x.xxx

Last login: Sun Nov 16 17:22:33 2008 from 192.168.1.2

参考资料:https://blog.csdn.net/liu_qingbo/article/details/78383892

这样无需密码就可以登录到远程服务器了,在写shell脚本的时候可以少写几行代码。

安装Expect

yum  install expect

什么是expect?
在实际工作中,我们运行命令、脚本或程序时,这些命令、脚本或程序都需要从终端输入某些继续运行的指令,而这些输入都需要人为的手工进行。而利用expect,则可以根据程序的提示,模拟标准输入提供给程序,从而实现自动化交互执行。这就是expect!!!

参考:https://www.cnblogs.com/zhuyeshen/p/11731942.html

动态创建目录

创建一个脚本

$ vim create_dir.sh
#!/usr/bin/expect -f

set user [lindex $argv 0]
set url [lindex $argv 1]
set dir [lindex $argv 2]

spawn ssh ${user}@${url}
  expect "100%"
  send "mkdir -p /data/minio/data/${dir}/ \r"
  expect "eof"

其中变量user为目标主机的用户,url为IP,dir为要动态创建的目录。

发送文件至目标服务器

$ vim send.sh 
#!/bin/sh
user=$1
url=$2
dir=$3

echo "/app/cip-shell/create_dir.sh ${user} ${url} ${dir}"
expect /app/cip-shell/create_dir.sh ${user} ${url} ${dir}
echo "scp /app/sonarpdf/*.pdf ${user}@${url}:/data/minio/data/${dir}/sona.pdf"
scp /app/sonarpdf/*.pdf ${user}@${url}:/data/minio/data/${dir}/sona.pdf

因为我把两个脚本的内容写在一起时总是执行失败,因此我分成了两个脚本执行竟然成功了。

虽然功能成功实现了,但是我依然觉得哪里不对劲,如果大神有更好的建议,希望留言交流。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐