安装

安装GitLab

由于我这里的Gitlab环境是安装好的,以后有机会再补这个安装过程吧

安装jenkins

这里是jenkins官网https://pkg.jenkins.io 我是从这里下载的最新的LTS版本,现在是jenkins-2.89.4-1.1.noarch.rpm,后来我发现它的war包也是直接启动运行的,不用配置tomcat,所以,我们先试试这个版本的war包的版本吧。
  war包版本的文件名是固定的jenkins.war,执行如下命令启动:(自己装下jdk哈)

nohup java -jar  jenkins.war --httpPort=12000 &

我这里的服务器IP是172.16.2.236,我就直接写了,需要的换成自己的。
  接下来访问http://172.16.2.236:12000 ,然后会被要求输入管理原密码,这个文件它已经初始化好了,/root/.jenkins/secrets/initialAdminPassword 这个文件里可以看到,打开复制过来就可以了。下一步是选择安装插件,我选择的是安装自己选中的插件,进去后它默认选中了一些,然后就直接点安装,它会自己下载相关内容安装的。

设置和GitLab和jenkins

这次我们的目的是自动发布我们的服务,我们的服务是打包成可执行的war包的springboot项目。

环境设置

勾选Delete workspace before build starts,这样就会在每次执行任务的时候清空上次下载下来和执行过后的内容了。

拉取源码

manager jenkins->Configure System 找到GitLab的片段输入连接名称,gitlab的url,然后还要添加一个Credentials,注意,一定要添加GitLab API token。这个可以在gitlab的setting中找到,access token设置。处于安全考虑,这个token的权限我使用的是read only的。
  然后创建一个jenkins调度任务,选择自由风格的软件项目,然后配置Source Code Management,选择Git。Repository URL需要输入ssh协议的地址,就是git开头那个;Credentials需要新建一个SSH username with private key那个,私钥生成过程见附录设置git私钥。设置完地址后如果没有红色的报错,就说明对啦。

maven编译

jenkins中有maven的步骤,config中build节点添加Invoke top-level Maven targets设置你的mvn参数、pom文件路径和setting文件路径,这里可以参考env-vars.html,里面有jenkins中可用变量的列举

执行shell

在build中添加Execute Shell节点。里面可以直接填写需要执行的shell命令。

  • 首先清空目标目录
  • 复制对应的文件到目标目录
  • 结束原有进程
  • 启动新的进程
      对于后两步,我试了很久,存在这么几个问题:
  1. jenkins执行的shell会忽略最后的&符号,虽然我不知道规则是否如此。但我使用nohup配合后台进程的时候,一直不成功。这个问题在附录中给出的帖子中有答案,启动jenkins时,需要添加参数:-Dhudson.util.ProcessTree.disable=true
  2. 我使用kill -9 ps -ef |grep foundation-platform-172.16.2.236|grep -v grep|grep -v jenkins|cut -c 9-15 来杀死进程,但是,因为所有的shell都在jenkins中,所以,这里我们除了要排除grep还要排除jenkins进程foundation-platform-172.16.2.236是我添加的参数,专门为了定位进程用的
  3. 最后一个是我中途尝试发现的,虽然最后没有用。我们使用windows写shell脚本,编码是不对的,可以使用notepad++转化成UTF-8 无BOM 格式的才可以正常执行

发送邮件

附录

设置git私钥

  • 我的是windows操作系统,找个目录,执行ssh-keygen -t rsa -C “root@<gitlab服务器IP>” -b 4096 会得到两个文件~/.ssh/id_rsa(私钥文件) 和~/.ssh/id_rsa.pub(公钥文件)
  • 在gitlab中,admin area->deploy keys中添加公钥文件中的文本
  • SSH username with private key中添加私钥中的文本

参考

主要过程是参考这篇博客的

  • https://docs.gitlab.com/ee/integration/jenkins.html 因为我安装的GitLab和博客中的差别比较大,所以参考了这份官方文档
  • jenkins执行shell总是忽略&符号,导致nohup总是执行不成功,解决方案在这里 http://veryyoung.me/blog/2016/04/19/jenkins-backgroud-process.html