一半君的总结纸

听话只听一半君

如何把travis ci的build结果保存到github pages / tomato适用的shadowsocks libev 自动build

只显示passing failed 似乎没什么用,lz之前用crosstool-ng 生成的toolchain编译 tomato 路由器可用的shadowsocks本机操作比较麻烦,下面试一下把这个步骤放到travis ci上完成

操作步骤

  1. 新建github pages
  2. 得OAuth Token
    运行

    $ curl -X POST -u <your_github_username> -H "Content-Type: application/json" -d "{\"scopes\":[\"public_repo\"],\"note\":\"token for pushing from travis\"}" https://api.github.com/authorizations
    

    json返回结果是

    {
      "id": 1234567,
      "url": "https://api.github.com/authorizations/1234567",
      "app": {
        "name": "token for pushing from travis",
        "url": "https://developer.github.com/v3/oauth_authorizations/",
        "client_id": "00000000000000000000"
      },
      "token": "abcdef1234567890abcdef1234567890abcdef1234567",
      "hashed_token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "token_last_eight": "xxxxxxx",
      "note": "token for pushing from travis",
      "note_url": null,
      "created_at": "2016-03-15T06:34:57Z",
      "updated_at": "2016-03-15T06:34:57Z",
      "scopes": [
        "public_repo"
      ],
      "fingerprint": null
    }
    

    我们需要的是 “token”,自己存好不要给别人知道了

  3. 设置travis
    yum install ruby-devel ruby
    gem install travis
    
    # 看看有什么版本
    gem list multi_json --remote --all
    
    # 降级到1.7.8
    gem uninstall multi_json -v '>1.7.8' --force
    gem install multi_json -v 1.7.8
    
    # 下面的<token>是上一步得到的
    # --add env.global的意思是自动帮你加到.travis.yml里,不自动加自己手加1也行
    # -r <user>/<repository>的话,如果你已经在repo目录里了,不加也行
    travis encrypt -r <user>/<repository> GH_TOKEN=<token> --add env.global
    

    然后把下面这行放在.travis.yml里

    after_success: ./update-gh-pages.sh
    

    下面是这个自动上传的script

    if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then
      echo -e "Starting to update gh-pages\n"
    
      #copy data we're interested in to other place
      cp -R coverage $HOME/coverage
    
      #go to home and setup git
      cd $HOME
      git config --global user.email "travis@travis-ci.org"
      git config --global user.name "Travis"
    
      #using token clone gh-pages branch
      git clone --quiet --branch=gh-pages https://${GH_TOKEN}@github.com/<user>/<repo>.git  gh-pages > /dev/null
    
      #go into diractory and copy data we're interested in to that directory
      cd gh-pages
      cp -Rf $HOME/coverage/* .
    
      #add, commit and push files
      git add -f .
      git commit -m "Travis build $TRAVIS_BUILD_NUMBER pushed to gh-pages"
      git push -fq origin gh-pages > /dev/null
    
      echo -e "Done magic with coverage\n"
    fi
    

上面的第一步启用github pages,github推荐的有两种选择,可以使用普通版,也可以使用jekyll(可以用markdown格式来发帖,其实一般都用这个来做blog),github免费用户只能有一个 .github.io,但是.github.io/repo/的地址可以有多个

lz这里使用了b格较高的jekyll

yum install ruby ruby-devel rubygems nodejs libyaml

gem install jekyll bundler

# 如果运气好,这样就有了, 默认在localhost:4000
bundle exec jekyll serve --watch

你可以在本地调试好,然后在再传到github,lz用了大神mademistakes的模板

要点:

  • lz使用了beta版的travis ci的trusty build,不知为何默认的会失败,不过由此造成cache功能无效似乎,toolchain本身就需要近40分钟才编译完成,很有可能超过免费版的时间限制50m,从而build失败
    # .travis.yml里
    
    sudo: required
    dist: trusty
    
  • matrix下的内容表示sub job,lz这里只有一个SS_VER env var,所以不会排列组合出几十个sub job,但有个问题是,lz在build完成后,把产出的shadowsocks可执行文件push到了jekyll的repo里,如果这几个并行的job同时运作的话,可能会造成race condition,只有一个sub job能push进去,而一个sub job就已经50m了,lz又不能在travis ci的设置里选择每次只运行一个job,那直接就超了,所以lz在最后一个执行的script update-gh-pages.sh里加了个sleep随机一段时间的命令,希望减小碰到一起的几率,当然最好还是cache功能能有效,那只要把$HOME/x-tools加到cache目录里就好,就不要build他了,当然lz已经加了,但由于上面提到的原因,似乎暂时不能cache(不知何解)
    env:
        matrix:
            - SS_VER=v2.4.5
            - SS_VER=v2.4.1
            - SS_VER=v2.3.1
    
  • lz用这条命令来随机sleep 10-190s ?
    sleep $[ ( $RANDOM % 180 ) + 10 ]s
    
  • lz用这段来更新 jekyll里的datafiles,位于_data/ss.yml
    DATETIME=$(date '+%d/%m/%Y %H:%M:%S %Z');
    
    if grep -qe "build: $TRAVIS_BUILD_NUMBER$" ss.yml
    then
        # update files
        if grep -qe "  - $SS_VER$" ss.yml
        then
            echo files already inside skip
        else
            cat >> ss.yml <<EOL
      - $SS_VER
    EOL
        fi
      # update DATETIME
      sed -ie 's@^date:\s.*@date: '"$DATETIME"'@g' ss.yml
    
    else
        # code if not found
        echo create new ss.yml
    
        cat > ss.yml <<EOL
    build: $TRAVIS_BUILD_NUMBER
    date: $DATETIME
    files:
      - $SS_VER
    EOL
    
    fi
    

    大意就是,如果ss.yml已经有了,但是ss的版本号还没有,我就把当前build的ss的版本号加到list里,如果ss的版本号有了,就跳过;如果ss.yml还不存在,我就创建个新的

    上面的奥义点在于sed那行命令,-i表示replace in place(原地满血替换),-e表示要使用regex,为什么要使用@当分隔符是因为lz的$DATETIME的格式是 20/03/2016 01:05:56 UTC 里面已经有了个/,不换别的分隔符的话就乱套了,所以最后效果是把date:后面跟着的部分换成$DATETIME里的内容

    sed -ie 's@^date:\s.*@date: '"$DATETIME"'@g' ss.yml
    
    # 其实原本应该这样
    sed -ie 's/^date:\s.*/date: $DATETIME/g' ss.yml
    
    build: 21
    date: 20/03/2016 01:05:56 UTC
    files:
      - v2.4.1
      - v2.4.5
      - v2.3.1
    
  • 而在index.html中,lz用如下的代码来自动生成shadowsocks的下载链接
    build #{{ site.data.ss.build }} --- {{ site.data.ss.date }} <a href="https://travis-ci.org/oglopss/tomato-shadowsocks"><img src="https://travis-ci.org/oglopss/tomato-shadowsocks.svg" /></a>
    <ul>
    {% for f in site.data.ss.files %}
    <li>
        <a href="{{ site.url }}/download/shadowsocks-libev-{{ f }}.tar.gz"> shadowsocks-libev-v{{ f }}.tar.gz</a>
    </li>
    {% endfor %}
    </ul>
    

    其中,shadowsocks-libev-vxxxx.tar.gz是在build完成之后被push到jekyll的download目录下的

适用的路由器:(其实大概所有的能跑K26RT-N的tomato路由器大概都可以把,因为系统一样的话必然能跑是不)

lz只有以下这几种路由器(目前在身边的是rt-n16,用于翻回国内看b站)
asus rt-n16
asus rt-n66
netcore q3 (磊科Q3)

链接:

最终成果github pages 以及 shadowsocks 下载: http://oglopss.github.io/ctng-ss-jekyll/
crosstool-ng+shadowsocks合体repo: https://github.com/oglopss/tomato-shadowsocks
jekyll github pages repo: https://github.com/oglopss/ctng-ss-jekyll

参考:
Sharing Travis-CI generated files
“Did not recognize your adapter specification” turbolinks-related error in Rails 4
How can I run a specific command for each find result?

How to add Google Analytics Tracking ID to GitHub Pages
Google Analytics for Jekyll

Advertisements

5 responses to “如何把travis ci的build结果保存到github pages / tomato适用的shadowsocks libev 自动build

  1. Jeff Lin 九月 24, 2016 @ 8:18 下午

    netcore q3抓目前http://oglopss.github.io/ctng-ss-jekyll/內的壓縮檔回來執行,
    會出現問題 ss-server: can’t load library ‘libpcre.so.1’
    回頭用你之前放dropbox上的舊版是正常的。

    • 一半君 九月 25, 2016 @ 1:53 下午

      这可能是因为你的tomato版本过低,ss从2.5.1开始新增了对libpcre的依赖,,在我的Q3 tomato shibby v130上也缺少此文件(不在身边无法测试升级),但是在v138 AIO版本(我的路由器是asus rt-n66u)上是有的,不知道是何时加入tomato的,似乎是在2014/05/15加入的

      changelog可知,只要是v119之后(24-05-2014)的AIO版本都应该有,但是悲剧的是屌丝路由器q3的flash太小(8Mb),我记得我是刷的比较大的能放进去的,似乎是v121 MAX版(6.2Mb左右),当时还蛮小,最新的v138 MAX版已经7.1Mb了orz, 有可能是这个版本恰好没带那个库,如果非要足够小又要能有pcre支持,可以看看makefile然后自己编译tomato,只开启自己需要的模块(假设你试过了官网所有<8Mb的固件都恰好没有pcre的话),我看了下makefile,似乎是有NGINX=y就会有pcre,但不幸的是只有AIO版本带,你只能自行编译下tomato了

      如果你没法升级tomato,可以使用ss 2.5.0或者以下版本
      我的路由器上

      我更新日志写在这里了

  2. Jeff Lin 九月 26, 2016 @ 4:35 上午

    刚试着把从138 aio提取文件,用TomatoEdit放进138 max中,改权限和新建连接,重刷后已正常能用2.5.3了。

  3. zhu jun 十月 9, 2016 @ 11:46 上午

    我也用着tomato的路由,一直用ss libev这几天突发奇想用ssr libev,但现在tomato人气越来越低,网上找不到现成的,只能自己编译,就找到了你的文章,学习了很多,但自己编译总是失败,能不能麻烦你有时间帮忙编译一份呢?https://github.com/breakwa11/shadowsocks-libev.git 我自己折腾几天了也没弄好

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: