通过sudo+脚本解决jenkins构建任务的文件、目录权限问题

通常情况下,由于jenkins和http服务分别以各自的用户运行,造成构建任务中部署代码的时候遭遇棘手的权限问题。比如说,如果我们使用nginx来提供http服务,nginx的运行用户(组)为nginx:nginx,那么在jenkins删除网站旧代码的时候是没有权限的——尤其是遇到那些由网站程序运行时生成的临时文件时。

对于这种情况,我们可以采用如下步骤解决:
一、新建一个网站发布脚本,这个脚本的目的就是把构建好的代码替换到网站目录,然后恢复新代码的权限;
二、在sudoer文件中为jenkins用户授予运行该脚本的权限。

经过上面两步之后,我们只需要在jenkins构建脚本中使用如sudo /path/to/deployscript的命令就可以了。

以下为发布脚本的示例,这个示例脚本支持三个参数:--source /path/to/src中/path/to/src应指向构建好的代码;--site site.com应指向服务器web目录中站点名称,--clear表明先清空网站目录。这里假设所有网站都放置于/data/www目录,并统一以域名(xxx.xxx.com)的格式来命名站点根目录。

#! /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的代码进行了全量更新,并且在构建时生成了网站的运行环境配置文件。需要注意的事,这个示例中的构建服务和目标网站位于同一台主机上,这是一种不合理的架构,具有较大的安全隐患。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值