一般状况下,因为jenkins和http服务分别以各自的用户运行,形成构建任务中部署代码的时候遭遇棘手的权限问题。好比说,若是咱们使用nginx来提供http服务,nginx的运行用户(组)为nginx:nginx,那么在jenkins删除网站旧代码的时候是没有权限的——尤为是遇到那些由网站程序运行时生成的临时文件时。nginx
对于这种状况,咱们能够采用以下步骤解决:
1、新建一个网站发布脚本,这个脚本的目的就是把构建好的代码替换到网站目录,而后恢复新代码的权限;
2、在sudoer文件中为jenkins用户授予运行该脚本的权限。web
通过上面两步以后,咱们只须要在jenkins构建脚本中使用如sudo /path/to/deployscript
的命令就能够了。安全
如下为发布脚本的示例,这个示例脚本支持三个参数:--source /path/to/src中/path/to/src应指向构建好的代码;--site site.com应指向服务器web目录中站点名称,--clear代表先清空网站目录。这里假设全部网站都放置于/data/www目录,并统一以域名(xxx.xxx.com)的格式来命名站点根目录。bash
#! /bin/bash declare WEB_ROOT=/data/www if [[ $1 == "--source" ]] && [[ $3 == "--site" ]] && [[ $4 =~ [[:alpha:]]+ ]]; then declare SITE_ROOT=$WEB_ROOT/$4 declare SOURCE_CODE=$2 if [[ $# == 5 ]] && [[ $5 == "--clear" ]]; then rm -rf $SITE_ROOT/* fi cp -R $SOURCE_CODE/* $SITE_ROOT/ chown -R nginx:nginx $SITE_ROOT else echo -e "Wrong Arguments.\ne.g.\n--source /path/to/src --site site.com [--clear]"; fi
如下为sudoer文件中为jenkins用户受权的记录。请使用sudo visudo
来编辑sudoer文件。这里假设发布脚本位于/opt/webmaster/sitedeploy.sh。服务器
jenkins ALL=NOPASSWD: /opt/webmaster/sitedeploy.sh
最后,jenkins构建project配置中的脚本示例:架构
declare WEB_ENV=prod declare BUILD_DIR=/tmp/jenkins_building/$JOB_NAME declare ENV_CONFIG_FILE=$BUILD_DIR/protected/Config/env.cfg rm -rf $BUILD_DIR mkdir -p $BUILD_DIR svn export --force $WORKSPACE $BUILD_DIR echo -e "[globals]\nsysConfig[env]=$WEB_ENV" > $ENV_CONFIG_FILE sudo /opt/webmaster/sitedeploy.sh --source $BUILD_DIR --site xxx.com --clear
这里对xxx.com
的代码进行了全量更新,而且在构建时生成了网站的运行环境配置文件。须要注意的事,这个示例中的构建服务和目标网站位于同一台主机上,这是一种不合理的架构,具备较大的安全隐患。svn