SegmentFault w2ex最新的文章
2016-01-17T20:59:37+08:00
https://segmentfault.com/feeds/blogs
https://creativecommons.org/licenses/by-nc-nd/4.0/
通过sudo+脚本解决jenkins构建任务的文件、目录权限问题
https://segmentfault.com/a/1190000004322188
2016-01-17T20:59:37+08:00
2016-01-17T20:59:37+08:00
W2EX
https://segmentfault.com/u/w2ex
0
<p>通常情况下,由于jenkins和http服务分别以各自的用户运行,造成构建任务中部署代码的时候遭遇棘手的权限问题。比如说,如果我们使用nginx来提供http服务,nginx的运行用户(组)为nginx:nginx,那么在jenkins删除网站旧代码的时候是没有权限的——尤其是遇到那些由网站程序运行时生成的临时文件时。</p>
<p>对于这种情况,我们可以采用如下步骤解决:<br>一、新建一个网站发布脚本,这个脚本的目的就是把构建好的代码替换到网站目录,然后恢复新代码的权限;<br>二、在sudoer文件中为jenkins用户授予运行该脚本的权限。</p>
<p>经过上面两步之后,我们只需要在jenkins构建脚本中使用如<code>sudo /path/to/deployscript</code>的命令就可以了。</p>
<p>以下为发布脚本的示例,这个示例脚本支持三个参数:--source /path/to/src中/path/to/src应指向构建好的代码;--site site.com应指向服务器web目录中站点名称,--clear表明先清空网站目录。这里假设所有网站都放置于/data/www目录,并统一以域名(xxx.xxx.com)的格式来命名站点根目录。</p>
<pre><code>#! /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</code></pre>
<p>以下为sudoer文件中为jenkins用户授权的记录。请使用<code>sudo visudo</code>来编辑sudoer文件。这里假设发布脚本位于/opt/webmaster/sitedeploy.sh。</p>
<pre><code>jenkins ALL=NOPASSWD: /opt/webmaster/sitedeploy.sh
</code></pre>
<p>最后,jenkins构建project配置中的脚本示例:</p>
<pre><code>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
</code></pre>
<p>这里对<code>xxx.com</code>的代码进行了全量更新,并且在构建时生成了网站的运行环境配置文件。需要注意的事,这个示例中的构建服务和目标网站位于同一台主机上,这是一种不合理的架构,具有较大的安全隐患。</p>
微信公众平台JSSDK分享接口开发(PHP实现)
https://segmentfault.com/a/1190000004004709
2015-11-17T09:38:05+08:00
2015-11-17T09:38:05+08:00
W2EX
https://segmentfault.com/u/w2ex
1
<p>最近做个移动端的H5应用,要实现自定义微信分享功能,实现过程中遇到一些小小的坑,这里分享一下。</p>
<p>以前微信官方是没有正式支持微信分享的自定义接口(包括图片、标题、描述)的,然而有一些大神找到了WeixinJSBridge这个强大的“对象”,一个方法调用就轻而易举地实现了分享功能。</p>
<p>后来微信放出了JSSDK,开始对H5端提供丰富、强大的官方接口支持,WeixinJSBridge也逐渐淡出了开发者的视野。</p>
<p>然而这个JSSDK的调用方法,实现起来却并不是太容易。难点不在于技术上,而是业务流程上。虽然是一个前端的接口,但是为了安全性,微信要求开发者进行服务端的验证,而这个验证竟然还要分两步来进行……如此一来,对于仅仅是想要实现一个“分享到朋友圈”功能的人来说,真是有点叫人吐血。</p>
<p>事实上呢,这个后端的两步验证,对于熟悉微信开发流程的人来说,也是很合理的。因为第一步,获取“AccessToken”,是所有微信业务的起点;而第二步,获取JSApi的签名,才是使用JSSDK对应的需求。如果说项目上本来就针对微信进行了一些开发,这点需求应该是可以很快解决了。</p>
<p>好了,废话到此结束,下面说后端接口具体实现步骤。接口的实现是基于PHP语言的,PHP的语法简单明了,相信各位不熟悉这门语言的同学应该能够理解;代码已经托管在OSChina上开源共享,可以下载使用;链接见文章末尾。</p>
<p>第一步,<a href="https://link.segmentfault.com/?enc=hLgSQtxPEcLpH8Gpr0N7hA%3D%3D.ZEt0If66wWc6gQkI%2B48KNEujPOPWupVEWTu6aKJXcKPMXN%2BPyYQqJ%2FBTXm0l3av862bWQ%2BW4fhBMJu3UFgJzuZTTkcgMPaE3%2BHAjH7cBFAM%3D" rel="nofollow">官方文档</a>是一定要细读的。然后你的微信公众号已经通过认证,这点是不用提醒的吧?</p>
<p>第二步,绑定安全域名。公众号后台左菜单 -> 设置 -> 公众号设置 -> 功能设置 -> JS接口安全域名。注意这里填写顶级域名的话,对其所有子域名都是有效的。所以为了有效利用三个名额,最好直接填写顶级域名。</p>
<p>第三步,写代码了。这里虚拟了一个项目,包括前端和服务端的实现。</p>
<p>代码:<a href="https://link.segmentfault.com/?enc=Yp3tdjbco3dfR4QyXHea6w%3D%3D.uzpKaeYHqu1bUkpXYzywR%2B9Bnf96ExPR%2BHZ0td7%2FotaHTUwmK2xHBpaH9R%2F%2Bzq3Q3I%2FGBE%2FCuR7sp0%2FLLTAjZw%3D%3D" rel="nofollow">http://git.oschina.net/w2ex/snipets/tree/master/weixinapi</a><br>演示:<a href="https://link.segmentfault.com/?enc=b6i08%2FvGFfYYFUdBYvxMLA%3D%3D.4lMm5aSIqLs0p%2F3JlTrxQgZOq9DHSexm2rj6hSjIB6nltiMMpstnxgReyDW7CII%2B" rel="nofollow">http://snipets.willizm.cn/weixinapi/webapp/</a></p>
<p>项目目录结构:</p>
<pre><code>/
/data 数据目录,用来存放微信端获取到的AccessToken和Ticket数据
/lib
/lib/Weixin.class.php 微信接口类库
/webapp 前端示例
/webapp/index.html
/webapp/main.js
/api.php 服务端接口示例,这里演示了对jsonp的支持
/config.php 配置文件,包括appId、appSecret、数据目录,顺带支持SAE环境
/callback.php 微信回调接口,代码直接拷贝<a href="http://mp.weixin.qq.com/mpres/htmledition/res/wx_sample.20140819.zip" data-mce-href="http://mp.weixin.qq.com/mpres/htmledition/res/wx_sample.20140819.zip">微信文档中的Demo</a></code></pre>
<p>重点在于Weixin.class.php中三个方法的实现:getAccessToken、getTicket、createSignature。这三个方法各自有一些注意事项,前面两个都要求用户在服务端缓存微信接口返回的数据,因此在每次调用时都要检查一下是否已经过期;第三个方法则有两点容易犯低级错误:其一,前端传过来的url是不需要hash部分(就是#及其后面的一段)的,这个前端需要注意;其二,服务端签名算法中拼接字符串时nonceStr是全部小写的,应写成noncestr,再就是要注意拼接的顺序不能错。</p>
<p>前端部分,除了上面说的传递url时需要去掉hash外,还需注意,业务逻辑应尽可能wx.ready中调用,以避免网络延迟带来的问题。开发调试时记得开启调试选项,这样就可以根据弹出的错误码来对照<a href="https://link.segmentfault.com/?enc=GTpi1O8zI8b4X%2FLKXS2e5Q%3D%3D.pdYylRcdPcRSVZX0640i%2FzI6fA1qrF3j9P%2F2U%2BtB3UYt5MyiaXwcR8ezW32T7O0t7pk3XjEWW1ANaHEqB5lSNws7v4cXGLklThJtGThvClhBnFpq0%2FSQazD6yNk9dAmu0KnMabSS%2BIoBwUIp%2BI20A7aioToaOv3vYJMhQ7ULDM%2F4YDfioeGkZI3y4yPykaKa0En0Enik68YwYo8TGJ1vMHzfzpwfEzYdoHoyOjgiKoI%3D" rel="nofollow">文档</a>排查问题。</p>