纠结于每次github提交代码后都要去vps中git pull一下,早就把持续集成提上了日程,无奈前端时间工作太忙,无暇顾及,简单折腾了一下没有成功,于是这个任务在我的任务列表了躺了好久。
最经工作不算忙,就抽了一上午弄了一下,总算成功,特此记录。也对网上各种不加验证的方案抄袭表示鄙视!!!
先说环境:Ubuntu(12.10) + Python + Django/web.py + nginx + uwsgi,工具用的Jenkins(1.538)。
实现到什么程度:代码提交到github后,vps端自动pull,并且重启uwsgi,reload nginx。其实说持续集成方案有点儿大了,实际我只用到了自动部署,其他的自动测试,集成sonar review等后续再加。
下面说步骤:
一、安装
wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
然后
sudo vim /etc/apt/sources.list
加入以下:
deb http://pkg.jenkins-ci.org/debian binary/
然后
sudo apt-get update
sudo apt-get install jenkins
安装成功后启动:
sudo service jenkins
在此我出了点问题,用该命令启动后提示:
Job filed to start
原因不详,但是用一下语句就能启动:
sudo /etc/init.d/jenkins start
启动后直接访问http://173.208.199.58:8080/(我的vps ip 是 173.208.199.58)
如果能正常显示,至此安装完成。
安装后workspace路径会建在:
/var/lib/jenkins/
log目录为:
/var/log/jenkins/
配置文件为:
/etc/default/jenkins
二、配置
装插件,由于代码托管在github,所有要装git plugin 和 github plugin
依次点击:Manage Jenkins–Manage Plugins–Available标签,查找上述两个插件安装。(如果该标签为空,则点击Advanced标签,然后右下角点击”Check now” 按钮,完成后就有了)
配置,插件安装完成后,依次进入:Manage Jenkins–Configure System,该处主要配置github插件。找到GitHub Web Hook,然后选择一个mode,我选的“ Manually manage hook URLs”,选好后点击行末的问号,说明中有一个url,我的是http://173.208.199.58:8080/github-webhook/,记下来,后边有用。别忘了Save按钮。
设置github,打开github中的项目,比如我的是https://github.com/tonghuashuai/OnlyRSSWeb,然后点击Settings–Service Hooks,然后点击右侧的WebHook URLs,在打开的文本框中填入刚才记下的地址,也就是:http://173.208.199.58:8080/github-webhook/,然后Update settings。
至此准备工作完成。
三、建Job
回到Jenkins,点击 New Job,然后填写 Job Name,下面选项根据个人情况选择,我选的第一个,OK按钮,进入设置界面。有几个地方需要设置
Advanced Project Options 下的 Advanced 按钮,如果想改变工作区可以选择 Use custom workspace,然后填写新工作群的路径。如:/home/ftp/OnlyRSSWeb
Source Code Management 下选择 Git,Repository URL 填写项目地址:https://github.com/tonghuashuai/OnlyRSSWeb.git,Repository browser 选择githubweb,url填入:https://github.com/tonghuashuai/OnlyRSSWeb/,注意没有.git.
Build Triggers 下选择 Build when a change is pushed to GitHub,也就是当有代码push到github上时触发build。
Build 下的 Execute shell 要执行的脚本。脚本执行的地方有几点需要单独说,所以放到后面。
至此,Save 后 Job建完。写别高兴,还没完。
四、用户
jenkins 安装完成后会建一个jenkins的用户,用户目录在:
/var/lib/jenkins
不属于任何用户组,我们将其可以加入root组:
gpasswd -a jenkins root
五、脚本问题
接下来就是启动脚本的问题了,由于代码更新后需要执行一些动作,比如:重启uwsgi、reload nginx或者清除pyc文件,那么就要把这些脚本放到第三步说的执行脚本中了。我的做法是把脚本写到一个文件中比如:start.sh中,然后在第三步的执行脚本中填入./start.sh。但是重启uwsgi,reload nginx需要root权限的,就目前的配置执行build会报 permission denied 错误,也就是 jenkins 启动用户的权限不够,方法就是我们一root用户启动jenkins,方法如下:
sudo vim /etc/default/jenkins
修改
JENKINS_USER=jenkins
为
JENKINS_USER=root
重启jenkins,全部完成。