集成Jenkins

为什么要用 CI

开始做后端以来,部署就成为了一件很麻烦的事情。我曾经用 Dropbox 直接同步 Mac 和服务器之间的代码,但每当到需要重启服务的时候,仍然免不了登录服务器输入命令。这样费时费力。后来了解到有 CI 这种东西,代码推送到 Gitlab 上之后,可以直接远程触发服务器的脚本,让它自动跑完流程。这里的流程可以根据自己的情况设定,包括自动更新代码,测试,还有邮件提醒等。 由于公司用的是私有仓库,于是就决定用 bitbucket + jenkins 的方案实现 CI。另外,Jenkins 的插件有很多,集成服务比较方便。

安装 Jenkins

加入源

wget -q -O - http://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
deb http://pkg.jenkins.io/debian-stable binary/

安装

sudo apt-get update
sudo apt-get install jenkins

启动

sudo service jenkins start

登录

http://xxx.xxx.xxx.xxx:8080

注册一个管理员帐号,这样就 OK 了

配置

安装插件

在使用 jenkins 前,需要添加一些插件。这些插件能够帮助你在配置 CI 的时候更方便。点【系统管理】-【管理插件】-【可选插件】,安装以下插件

  1. Bitbucket Plugin
  2. Email Extension Plugin
  3. GIT Server Plugin
  4. SSH Agent Plugin

另外,你也可以根据自己的需求安装别的插件。 这里还需要注意的是,有些插件可能会安装不成功。可以选择手动下载到本地,然后通过上传的方式给 Jenkins 安装。

新建 CI 配置

我这次配置的需求很简单。就是当 Bitbucket 收到一个 Push,然后它用 Webhook 通知 Jenkins。然后 Jenkins 在测试服务器上执行脚本,包括下载代码和重启后端服务。成功后,通过邮件通知开发者。所以,要先从Bitbutcket 开始配置 Webhook。

配置 Bitbucket

  • 在 Bitbucket 中进入你需要配置的 repository - 【设置】-【Webhooks】-【Add webhook】
  • 填入以下配置

Screen Shot 2016-07-18 at 上午10.49.25.png

  • 在我的流程中,有一部是服务器从 Bitbucket 上 git fetch --all代码,所以需要在服务器的 jenkins 用户下创建 keys。登录服务器后,建立/home/jenkins/文件夹,然后在其下面的.ssh文件夹中生成公钥和私钥

      ssh-keygen -t rsa
    
  • 将生成的公钥/home/jenkins/.ssh/id_rsa.pub添加到 bitbucket 中, 参考Use deployment keys,私钥暂时不动,下文中需要用到

配置邮件发送

  • 【系统管理】-【系统设置】中,找到邮件通知,点击『高级』出现更多选项。按以下参数配置,和普通的 SMTP 配置相似(注意这里发送的邮箱要与管理员邮箱一致,管理员邮箱在本页面的『Jenkins Location』中设置)

设置项目

  • 返回 jenkins(http://xxx.xxx.xxx.xxx:8080), 点击左上角『新建』
  • 输入『Item Name』
  • 点击『构建一个自由风格的软件项目』
  • 之后开始配置,在『源码管理』中选择『Git』。输入『Repository URL』和『Credentials』。注意,这里的 Credentials 就是选择上面生成的私钥。
  • 在『构建触发器』中勾选『Build when a change is pushed to BitBucket』
  • 在『构建』中添加2个『Execute shell』
  • 我在第一个 command 中执行自己写的脚, 如下:

这里的restart_platform.sh做了两件事,第一是终止之前的 platform 进程,第二是下载新的代码

#!/bin/bash
ps -ef | grep manage.py | grep -v grep | awk '{print $2}' | xargs kill -9
sleep 1
cd /var/www/platform/
git fetch bitbucket
git reset --hard bitbucket/master
sleep 1
  • 在第二个 command 中加入了启动 platform 的命令,不过这里要注意的是,jenkins 会自动把最后一条命令杀死。所以,要在最后一条命令前加入BUILD_ID, 以保证 Platform 进程一直运行(这里是个坑,卡了好久才发现)

      BUILD_ID=Do_not_fuck_it /usr/bin/nohup /home/kavi/.virtualenvs/helmsman/bin/python /var/www/platform/manage.py runserver > /home/kavi/platform.log 2>&1 &
    
  • 在『构建后操作』中加入『Editable Email Notification』, 在『Project Recipient List』中加入你要通知的邮箱即可。

  • 最后点击『保存』,完成配置。

结束语

配置过程中可能会出现很多问题,只能自己上 Google 上多找找。

参考

Jenkins Debian packages

Jul 21st, 2016

Comments