斯巴达克斯 发布的文章

使用Jenkins发布腾讯云项目

最近研究使用jenkins来发布项目,使用publish-over-ssh插件,把打包好的zip或者war包上传到远程服务器上,并执行一些命令,本来也没什么问题,但是公司主要业务在腾讯云上,但是腾讯云的服务器并没有外网地址,SSH连接到服务器只能通过腾讯云HTTP代理服务器,并且需要token+服务器的密码,才能连接到服务器。

问题来了 publish-over-ssh插件 并没有设置访问时ssh时通过HTTP代理服务器,如何解决才好?

到jenkins服务器上该插件的lib目录下看看该插件的构成,该插件依赖于jsch-0.1.45.jar这个jar包,刚好对jsch比较熟悉,于是找到publish-over-ssh的源码下载下来,找到ssh连接的代码,加上http代理的代码,加的代码如下:

src\main\java\jenkins\plugins\publish_over_ssh\BapSshHostConfiguration.java

public BapSshClient createClient(final BPBuildInfo buildInfo, final boolean connectSftp) {
        final JSch ssh = createJSch();
        final Session session = createSession(buildInfo, ssh);
        final BapSshClient bapClient = new BapSshClient(buildInfo, session, isEffectiveDisableExec());
        try {
            final BapSshKeyInfo keyInfo = getEffectiveKeyInfo(buildInfo);
            final Properties sessionProperties = getSessionProperties();
            Properties properties = new Properties();

            // 得到jar包所在的路径
            String jarPath = BapSshHostConfiguration.class.getProtectionDomain().getCodeSource().getLocation().getPath();
            String sep = File.separator;
            int lastIndex = jarPath.lastIndexOf(File.separator);

            // 读取配置文件
            FileInputStream fileInputStream = new FileInputStream(jarPath.substring(0,lastIndex)+ sep +"configure.properties");
            properties.load(fileInputStream);
            String enableHttpProxy = properties.getProperty("enable_http_proxy");
            String proxyServer = properties.getProperty("http_proxy_server");
            String proxyPort = properties.getProperty("http_proxy_port");
            if (keyInfo.useKey()) {
                setKey(buildInfo, ssh, keyInfo);
                sessionProperties.put(CONFIG_KEY_PREFERRED_AUTHENTICATIONS, "publickey");
            } else {
                session.setPassword(Util.fixNull(keyInfo.getPassphrase()));
                sessionProperties.put(CONFIG_KEY_PREFERRED_AUTHENTICATIONS, "keyboard-interactive,password");
            }
            session.setConfig(sessionProperties);
            if ("1".equals(enableHttpProxy)){
                session.setProxy(new ProxyHTTP(proxyServer,Integer.parseInt(proxyPort)));
            }
            connect(buildInfo, session);
            if (connectSftp) setupSftp(buildInfo, bapClient);
            return bapClient;
        } catch (IOException ioe) {
            bapClient.disconnectQuietly();
            throw new BapPublisherException(Messages.exception_failedToCreateClient(ioe.getLocalizedMessage()), ioe);
        } catch (RuntimeException re) {
            bapClient.disconnectQuietly();
            throw re;
        }
 }

这个方法其中以下是添加的

Properties properties = new Properties();

// 得到jar包所在的路径
String jarPath = BapSshHostConfiguration.class.getProtectionDomain().getCodeSource().getLocation().getPath();
String sep = File.separator;
int lastIndex = jarPath.lastIndexOf(File.separator);

// 读取配置文件
FileInputStream fileInputStream = new FileInputStream(jarPath.substring(0,lastIndex)+ sep +"configure.properties");
properties.load(fileInputStream);
String enableHttpProxy = properties.getProperty("enable_http_proxy");
String proxyServer = properties.getProperty("http_proxy_server");
String proxyPort = properties.getProperty("http_proxy_port");


if ("1".equals(enableHttpProxy)){
        session.setProxy(new ProxyHTTP(proxyServer,Integer.parseInt(proxyPort)));
}

通过maven重新打包成publish-over-0.18.jar,然后重命名为classes.jar,到插件的lib备份原有的classes.jar之后删除,上传新生成的classes.jar到lib目录,下载该文件

classess.zip

然后新建configure.properties文件,里面写上配置,如下:

#### Enable HTTP Proxy 0:disable 1:enable####
enable_http_proxy=1
http_proxy_server=cvm-proxy.opencloud.qq.com
http_proxy_port=80

classes.jar和configure.properties上传之后,位于如下位置,注意自己的jenkins安装位置

QQ截图20150522224500.png

然后重启一下jenkins服务器,在添加主机的IP时候,就填上腾讯云服务器的内网地址和端口,用户名是你的appid,密码是服务器的密码,只不过等发布的时候可以临时把token关闭一下,这样就行了。

只不过这里还有点小问题,这里要是jenkins服务器不只给腾讯云服务器发布项目呢,连接其他的服务器时,不需要通过HTTP代理,这时候 看配置文件里面的

enable_http_proxy=1

这一项如果是1,就启用http代理,0 就禁用http代理,所以在使用在把部署文件传到服务器之前把该值修改一下(通过shell命令),就OK了。

至此就大功告成。

使用Ant 和 Maven打包发布命令行程序

用Java写了一个命令行的小程序,使用的Intellij IDE是IDEA13原来一直使用Ant来打包编译,为了学习一下maven打包,特此从Ant打包转转换为Maven打包发布

源码的目录结构如下:

Image.png

conf 目录是 程序的配置文件所在的目录
lib  程序的依赖库文件
scripts 启动程序的叫,start.bat 是在window上启动的脚本,start.sh是在Linux启动的脚本
src 是源代码目录
build.xml 是Ant打包的脚本

- 阅读剩余部分 -

shell脚本中的 test 和 [ ] 测试命令

在编写shell脚本中,经常会做一些测试,比如: 文件是否存在、2个整数或字符串是否相等,这时候就会使用test命令或者是[ ],test命令是可以被[]替代,总结一下其用法:

在使用[ ]语法时,注意以下:

在[ ]中 最好以空格分割
在[ ]中 最好以双引号括起来、
在[ ]中 最好都以单或双引号括起来

文件判断相关

关于某个文件名的“文件类型”判断,如test -e filename 表示存在否

-e该文件名是否存在(常用)
-f该文件名存在且为文件(file)
-d该文件名存在且为一个目录
-b该文件名存在且为一个block device设备
-c该文件名且为一个character device设备
-S该文件名存在且为一个socket文件
-p该文件名存在且为一个FIFO(pipe)文件
-L该文件名存在且为一个链接文件
-e该文件名是否存在(常用)

- 阅读剩余部分 -