經過sudo+腳本解決jenkins構建任務的文件、目錄權限問題

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

相關文章
相關標籤/搜索