分类 互联网编程 下的文章

AppVeyor作为一个CI/CD平台,提供自动的持续集成和持续部署的服务。

何谓持续集成呢,从我个人的角度理解,项目都是以源码的形式编写的。在交付用户使用的时候,显然通常需要编译为机器可直接运行的二进制文件。二进制文件的修改往往很困难,因而一般都会选择从修改后的源码重新编译一份。在产品的开发或者维护中,经常需要进行小修小补式的更改,来添加新功能或者修复bug。而每次重新编译这个过程繁琐而不可避免。CI做的就是这个事情,不但一键编译,连这个触发编译的操作都是自动探测完成的。比如说Github,CI可以做到提交一个commit就自动编译项目。

用别人的话总结说就是,CI可以完成项目中重复性的工作。

然后个人感觉,上手前主要需要了解两个东西:整个CI过程的分段定义,以及appveyor.yml的作用和用法。这个可以通过看官方文档完成。了解基本用途的耗时并不长。参见https://www.appveyor.com/docs

是的,铁头娃又来了

平台:CentOS 7.7

sudo yum groupinstall "Development Tools"

有的Gemfile会影响某些gem包的行为,比如在不同目录下执行同一命令,发现包版本不同。 随着gem的版本,会有固定的默认功能包(好像也叫gem?)版本,更改方法是改变gem版本。

装postgresql的时候要记得装postgresql-contrib,有用到的extension在这个包里提供。 gem和go有的时候记得换源,不然速度太慢。

  1. git要升级
  2. ruby要升级,而且最好是2.5.3,版本太高一堆警告
  3. postgresql > 9.4
mkdir -p /var/cache/swap
cd /var/cache/swap
dd if=/dev/zero of=myswap bs=1M count=2048
mkswap myswap
chmod 600 myswap
# 在/etc/fstab中添加一行:/var/cache/swap/myswap swap swap defaults 0 0

yum update -y
# 一键安装gcc等开发工具
yum groupinstall "Development Tools" -y

# nodejs 10源
curl -sL https://rpm.nodesource.com/setup_10.x | bash -
# yarn源
curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
yum install yarn node -y

# 更新ruby
wget https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.7.tar.gz
tar xzf ruby-2.5.7.tar.gz
cd ruby-2.5.7
./configure --enable-shared --prefix=/usr # 直接覆盖老版本
make -j2 && make install # 因为是2核vcpu

# 更新git
wget https://mirrors.kernel.org/pub/software/scm/git/git-2.21.1.tar.gz
tar xzf git-2.21.1.tar.gz
cd git-2.21.1
./configure --prefix=/usr # 直接覆盖老版本
make -j2 && make install

# 安装postgresql
# 可以到这里自定义rpm源:https://www.postgresql.org/download/linux/redhat/,也可以下载源码自行编译
yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm -y
yum install postgresql12 -y

如果postgresql没有正常工作,可能是没有自动初始化,参考这里:https://www.postgresql.org/docs/12/install-short.html

然后继续

# 创建gitlab用户
adduser git -d /home/git

# clone项目,选择自定义分支
su git
cd ~
git clone https://gitlab.com/gitlab-org/gitlab-foss.git gitlab
git checkout 11-11-stable-patch-2

# 接下来记得参考*对应分支*的安装文档进行操作
# 比如本分支:https://gitlab.com/gitlab-org/gitlab-foss/-/blob/11-11-stable-patch-2/doc/install/installation.md

certbot-auto这个东西真的有毒,搞个什么选项都要用户交互,搞得我以为自己每三个月要上一次服务器。。

一些可能会用到的选项:

在为域名申请证书的时候,先会要过一个challenge(认证),以证明该域名、该服务器都是归你所有。然后是三个方法(具体是啥给忘了),要手动选择进行验证。有个参数叫--preferred-challenges可以用于在命令行选择认证方法,不用交互,后面跟的参数值就是手动填写时括号里给的缩写。

续签的时候用的是另一个参数,叫做--authenticator,用于指定续签时的认证方式,同样是三选一,参数值也是在交互时给出了。

今天第一次用IDEA写跑Tomcat的Web项目。等了老半天项目都没部署上去,直接访问地址也是404,然后习惯性地点击终止服务器,打算重新启动一次。

然后遇到了这个问题:

Application Server was not connected before run configuration stop, reason:
Unable to ping server at localhost:1099

然后查看配置,发现这个1099指的是一个什么JMX端口,似乎是用来远程控制Tomcat用的。 然后网上试了好多办法都没用,甚至JB自家论坛的解决方案都是无效的。。

最后猜测可能是Tomcat自己本身完全就没有开启JMX功能(因为搜JMX好多都是教怎么启用的),然后倒腾了一下,发现照这个思路可以解决问题。

具体方法如下: Edit Configurations.. - Tomcat - <服务器名> - Startup/Connection,选择使用的配置方案(一般都是run吧),在Environment Variables中添加环境变量CATALINA_OPTS,值设置为

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false

之后再使用该配置文件启动服务器,问题解决。

  1. 实际上SpringBoot是可以结合JSP使用的,不过需要加上providedRumtime("org.apache.tomcat.embed:tomcat-embed-jasper")作为JSP解析器。然而使用了JSP特性页面可能会出现编译错误,这个时候SpringBoot显示出来的是404。
  2. Thymeleaf的直接取值表达式是[[${val}]]
  3. 验证登录的时候,最好使用@{/login}获取Spring Security的登录地址,不然登录似乎会失败。
  4. Thymeleaf需要从application.properties一类配置文件中读取数据的时候,传统方法是先使用@Value{key.name}注入到对应类型的变量中,然后再用MVC的ModeladdAttribute()方法设置后传给对应的模板。
  5. 退出登录也要POST方法。
  6. 登陆/退出(默认URLlogin/logout)成功后自动跳转的方法名分别为defaultSuccessUrllogoutSuccessUrl。其中defaultSuccessUrl有第二个选填参数表示是否永远跳转至该页面。
  7. 别想着明文密码存储了,Spring Security 5删除了PlaintextPasswordEncoder,现在基本上都是用BCrypt,到网上随便找一个BCrypt加密工具来生成测试账户的密码吧。(或者用AuthenticationManagerBuilder.withUser直接在代码里也行,这里可以用明文)
  8. 可以通过重写UserDetailsUserDetailsService来重定向登陆所用的用户信息类到自己想要的方式。比如写一个连接数据库的Entity,加上jdbcAuthentication()(说实话,这个真的有必要吗),就可以实现从数据库中获取登录信息。进行鉴权处理的是Authentication类,所需要的UserDetails信息是约定俗成usernamepassword两个属性,其中password是存在数据库中的、使用约定(可以设置)的加密方式加密后的串。(不记得从哪看来的了,说是spring的原则是约定高于配置) 参考:https://www.baeldung.com/spring-security-authentication-with-a-database 以及附带的github代码
  9. 如果在post表单里用了th:object的话,在对应的Controller方法中要用@ModelAttribute(modelName)获得。
  10. Kotlin的foreach用的是大括号,可以使用it获取当前次循环正使用的元素。
  11. 若是对RequestMapping方法中,有javax.validation验证限制的对象使用@Valid注解的话,可以按照预期检查出错误来,但是由于validation本身发生在进入方法体之前,方法本身并不会被执行。需要使用ExceptionHandler来捕获异常,若是对数据传输对象Data Transfer Object, DTO使用@Valid的话,会产生org.springframework.validation.BindException(噗,stackoverflow上有个老哥写成了java.net.BindException
  12. Kotlin会给方法自动生成getter和setter,但是仅仅是作用和Java中的一样,并不能通过getXXX()方法来访问属性= =
  13. Kotlin通过反射调用方法有点麻烦,可以绕道Java,通过::class.java.getMethod().invoke()实现等效的功能。
  14. Thymeleaf在使用@{}生成链接地址的时候,可以通过特殊的方式生成含变量的路径,格式形如@{/path/{key}(key=${val})}会生成/path/${val}形式的地址。
  15. URL作为变量要用@PathVariable而不是@PathParam。以及为了防止万一,最好传入封装类型而不是基本类型。
  16. 可以使用th:checked属性设置输入复选框的初值。