无字

时光易老

等我再过些年

我也许会写这世上的风花雪月,我也许会写这人间的世态炎凉。

我也许会写山盟海誓,我也许会写生死无常。

我也许会想写尽我们每个人的一生。

如果写不下, 我也许只想静静睡眠,在一座无字的碑旁。

再次迁移Gitlab服务器

团队一直在用基于docker的gitlab。去年迁移过一次服务器,参见这篇文章

今年因为某个原因再次迁移。但按照之前的办法,却一直不成功,服务起不起来,报错信息既有跟文件权限有关的,也有跟SSL证书有关的。最后没时间折腾,就换了种方式,使用备份gitlab数据,再进行恢复的方式解决。

在确保新、旧服务器上 Gitlab 版本一致的情况下,先在旧服务器上备份数据:

sudo docker exec -it gitlab /bin/bash进入旧服务器 gitlab容器的命令行,执行如下备份命令

gitlab-rake gitlab:backup:create RAILS_ENV=production

此操作备份所有gitlab数据,在 backups文件夹下生成了1523788820_2018_04_15_10.6.3_gitlab_backup.tar文件。

然后使用SFTP或SCP,将备份数据拷贝到新服务器上同名文件夹下,然后进入 gitlab 容器的命令行执行恢复命令:

gitlab-rake gitlab:backup:restore RAILS_ENV=production BACKUP=1523788820_2018_04_15_10.6.3

此过程中,有几个要点要注意:

1,注意新旧gitlab版本要一致,对于使用docker技术来说,可以通过指定版本号来确保;

2,注意文件路径要正确;

3,注意备份文件复制到新服务器后,可能存在权限问题。因为 gitlab默认使用git用户来对文件进行读写,可以使用 sudo chown git:git 1523788820_2018_04_15_10.6.3_gitlab_backup 命令来修改文件owner

换用腾讯云的免费SSL

之前曾用过沃通的免费SSL,结果几个月前备谷歌宣布不再信任该机构。也曾用过starSSL,似乎也有相似问题。

后来曾用Let’s Encrypt,挺好用,但有两个缺点:

1,证书有效期太短,才半年,感觉眼睛一眨就得要去renew了;

2,在复杂配置的centos上面自动化很麻烦,我们站点设置了80端口自动转https,但certbot(Let’s Encrypt客户端)要工作必须先要能访问验证域名,需要放置验证文件能在80端口下访问。这也意味着每次我们renew证书还需要修改站点配置。自动化Renew反正是没用上。

近期正好看到腾讯有免费ssl,就去申请了一下。很方便,验证方式也比较容易。有效期一年,比Let’s Encrypt长。既然自动化不了,暂时就用他家的方案了。

使用JPA的级联更新问题

假设A对象与B对象是一对多的关系,B的集合作为A的属性children而存在。

class A{
……
@OneToMany(mappedBy=”parent”, cascade={CascadeType.ALL})
private Set<B> children;
……
}

使用CascadeType.ALL能够实现级联保存、级联删除。但是级联更新的时候遇到如下问题:

A.children.remove(child1);
A.children.add(child2);

这时候child2确实被添加到数据库了,但child1却并没有被删除。

其实只要加上orphanRemoval=true 就可以了

class A{
……
@OneToMany(mappedBy=”parent”, cascade={CascadeType.ALL},orphanRemoval=true)
private Set<B> children;
……
}

Angularjs项目中文件上传

项目后端为Java,基于Spring Boot框架,前端为AngularJS。

前端有两个主要的组件可以用,一个是ng-file-upload,一个是angular-file-upload。

尝试使用ng-file-upload,却不能成功。主要是因为前端使用了Pace,有一些不兼容问题。报错如下:
Failed to execute ‘setRequestHeader’ on ‘XMLHttpRequest’
具体可以参见:https://github.com/danialfarid/ng-file-upload/issues/98

网上有人尝试解决这个问题,但在我的案例里面不适用,也没花时间多研究解决。

使用angular-file-upload则非常顺利,事实上从文档和示例来说,感觉angular-file-upload更加友好易用一些。

 

新服务器的Apache Rewrite问题

新装了一台服务器(CentOS 7.3, Apache 2.4.6, PHP 7.1.6),迁移网站应用到上面,网站文件都放在 /var/www/目录下。访问时候发现如下问题:

采用ThinkPHP开发的A应用,可以通过 http://www.a.com/index.php/Home/Abc/def 来访问

但不能通过 http://www.a.com/Home/Abc/def 来访问

也就是访问地址中没法省略掉index.php。一开始把PathInfo 和Rewrite搞混淆了,以为是前者的问题。

后来发现其实这明显是 Rewrite的问题,因为虽然ThinkPHP代码根目录下面默认有.htaccess文件,但服务器的配置有可能禁止站点自行配置。从以上症状来看正是Rewrite规则根本没起作用。

最后找到开关其实在这里:

找到apache配置文件:/etc/httpd/conf/httpd.conf

找到 对应目录的配置处,修改 AllowOverride All:

<Directory “/var/www”>
AllowOverride All
</Directory>

JHipster项目集成Gitlab CI自动测试遇到的错误

JH项目用 gitlab CI 做自动测试、发布。根据jhipster官方文档进行了操作,在项目根目录下生成了.gitlab-ci.yml文件,同时根据 Gitlab 文档,在一台 Windows Server 2008 环境下安装了Runner。安装过程中配置了私有Gitlab地址,runner的token,也配置了Executor为shell。
安装好Runner后发现runner已经能够自动去运行了,不过gitlab中看到build遇到了个错误,maven build 报错,具体为执行.gitlab-ci.yml中这一句:
export MAVEN_USER_HOME=`pwd`/.maven
的时候,报错,输出信息是乱码,状态码是9009。
研究后解决了,发现官方文档少了个提示,runner如果跑在windows 平台,且executor选 shell 的话,应在gitlab-runner根目录下的config.toml 中设置 shell=’powershell’,不然会报错。
应该是 export MAVEN_USER_HOME=`pwd`/.maven 的时候,取不到 `pwd` 的值的问题。
可以参考有人遇到过类似问题:http://www.cnblogs.com/xishuai/p/gitlab-ci.html

解决Gulp构建的AngularJS项目中的footable依赖不能自动注入的问题

项目是基于Angular 1.5,构建工具为Gulp。项目文件结构来源于某前端模板的种子项目,与多数AngularJS 的Gulp版本的种子项目大同小异。Gulp的inject任务中已经有了将项目所依赖包的js、css文件自动添加到index.html中的脚本。

现在某页面需要用到footable,于是添加footable依赖:
bower install –save footable

安装后检查,看起来插件已经存在于项目的bower_components目录下了,并且项目的bower.json文件中,也已经自动添加了对footable的依赖,当前版本是3.1.4。

但是运行gulp serve 或者gulp build,均未能在index.html中看到footable的踪影。

小小了解了一下才知道原因:gulp的依赖注入,是调用了wiredep(项目地址:https://github.com/taptapship/wiredep)
而wiredep的工作原理,是根据项目的bower.json文件中所列的依赖,一一处理这些依赖项,处理的时候,会分析该依赖包本身的bower.json文件,根据该文件中的”main”的值来决定要将哪个文件添加到index.html中去。而footable的bower.json文件中,缺失了这一项。

根据wiredep的官方文档,只要在自己项目的bower.json文件中override就可以了。代码如下:

"overrides": {
  "footable": {
    "main": [
      "compiled/footable.js",
      "compiled/footable.bootstrap.css"
    ]
  }
}