一般狀況下,因爲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