STF笔记

字数 2719阅读 1410

安装STF

  • 本地搭建能访问外网的ubuntu环境

    • 安装virturalbox
    • 创建ubuntu虚拟机,需要注意的是网络配置:
      • 只需要配置1个网卡
      • 网卡链接方式选择:网络地址转换NAT,否则grub-pc无法安装(这是引导程序)
      • 配置端口转发,否则宿主机无法访问ubuntu,主要是为了ssh服务访问方便,而且vbox控制台中文乱码
      • 端口转发配置如下:
        • 首先查看宿主机的vbox虚拟网卡IP:
          • ipconfig /all
        • 配置端口转发,如:
          • 主机IP 192.168.56.1 端口22
          • 子系统IP 10.0.2.15 端口22
  • 配置xxxxx的ubuntu镜像(安装rethinkdb需要依赖其他包,其他包的源在xxxxx的镜像源里有)

    • 先备份之前的镜像:
      • cp /etc/apt/sources.list sources.list.bak
    • 新建 vi sources.list
      • 把如下内容插入sources.list

      • deb http://mirrors.xxxxx.com.cn/ubuntu/ trusty-security main restricted universe multiverse
        deb http://mirrors.xxxxx.com.cn/ubuntu/ trusty-updates main restricted universe multiverse
        deb http://mirrors.xxxxx.com.cn/ubuntu/ trusty-proposed main restricted universe multiverse
        deb http://mirrors.xxxxx.com.cn/ubuntu/ trusty-backports main restricted universe multiverse
        deb-src http://mirrors.xxxxx.com.cn/ubuntu/ trusty main restricted universe multiverse
        deb-src http://mirrors.xxxxx.com.cn/ubuntu/ trusty-security main restricted universe multiverse
        deb-src http://mirrors.xxxxx.com.cn/ubuntu/ trusty-updates main restricted universe multiverse
        deb-src http://mirrors.xxxxx.com.cn/ubuntu/ trusty-proposed main restricted universe multiverse
        deb-src http://mirrors.xxxxx.com.cn/ubuntu/ trusty-backports main restricted universe multiverse 
        
  • 安装gcc

    • apt-get install build-essential
      
  • 安装nodejs

    • 官网下载: node-v6.11.2-linux-x64.tar.xz

    • 解压: tar -zxvf node-v6.11.2-linux-x64.tar.xz

    • 把解压的node文件夹移动到自定义存放位置,如:mv node-v6.11.2-linux-x64 /opt/

    • 把node命令映射到bin: ln -s /opt/node-v6.11.2-linux-x64/bin/node /user/local/bin/node

    • 把npm命令映射到bin: ln -s /opt/node-v6.11.2-linux-x64/bin/npm /user/local/bin/npm

    • 验证是否安装成功:

      • node -v

        v6.9.1

      • npm -v

        v2.15.1

    • 配置cnpm(并把npm源改为taobao源)

      • npm install -g cnpm --registry=https://registry.npm.taobao.org
        
  • 安装JDK(可选,不需要装)

    • 官网或者公司软件下载中心下载: jdk-7u71-linux-x64.gz

    • 解压: tar -zxvf jdk-7u71-linux-x64.gz

    • 把解压的JDK文件夹移动到自定义存放位置,如:mv jdk-7u71-linux-x64 /opt/

    • 设置环境变量:

      • vi /etc/profile

      • 在profile中添加如下内容:

        JAVA_HOME=/opt/jdk-7u71-linux-x64
        JRE_HOME=/opt/jdk-7u71-linux-x64/jre
        CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
        PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
        export JAVA_HOME JRE_HOME CLASS_PATH PATH

      • 使profile修改生效:

        source /etc/profile

      • 验证JDK有效性:

        java -version

  • 安装adb(依赖android的SDK)

    • apt-get install android-tools-adb
      
  • 安装rethinkdb

    • https://download.rethinkdb.com/apt/pubkey.gpg可能在虚拟机无法访问,用本地电脑先下载下来,然后传到ubuntu中,用apt-key add pubkey.gpg安装

    • source /etc/lsb-release && echo "deb http://download.rethinkdb.com/apt $DISTRIB_CODENAME main" | sudo tee /etc/apt/sources.list.d/rethinkdb.list
      wget -qO- https://download.rethinkdb.com/apt/pubkey.gpg | sudo apt-key add -
      sudo apt-get update
      sudo apt-get install rethinkdb
      
    • 编译源文件方式安装

      • 安装依赖
      sudo apt-get install build-essential protobuf-compiler python \
                     libprotobuf-dev libcurl4-openssl-dev \
                     libboost-all-dev libncurses5-dev \
                     libjemalloc-dev wget m4
      
      • 获取源文件
      wget https://download.rethinkdb.com/dist/rethinkdb-2.3.6.tgz
      tar xf rethinkdb-2.3.6.tgz
      
      • 安装
      cd rethinkdb-2.3.6
      ./configure --allow-fetch
      make
      sudo make install
      
      • 遇到的问题
        • protobuf要切回2.5.X或者2.6.0版本才能安装rethinkdb,否则3.3.0的不能安装rethinkdb.(通过apt命令可以直接安装2.5.X或者2.6版本,但是3.3.0得自己编译安装)

        • apt-get install libssl-dev需要安装,否则即使安装了openssl1.0.1t也会报crypto和ssl需要安装1.0.1t,libssl-dev看系统而定不需要一定是1.0.1t
          可以先用apt-get install libssl-dev安装源自带版本,然后再编译安装1.0.1t版本

        • openssl未安装

          ./config --prefix=/usr/local/openssl
          ./config -t
          make
          make install
          
          • 创建符号链接(这部可做可不做,看你的需求)
          #ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl 
          #ln -s /usr/local/openssl/include/openssl /usr/include/openssl
          
          • 刷新动态库配置
          #vim /etc/ld.so.conf 
          在文件末尾加入 
          include /usr/local/openssl/lib
          
          • 测试(如果你没有创建符号链接,下面的命令要带上具体的路径)
            openssl version -a
  • 安装graphicsmagick

    • apt-get install graphicsmagick
      
  • 安装libsodium(zeromq的依赖)---可选,在zeromq安装失败可根据错误选择性安装

  • 安装zeromq

    • echo "deb http://download.opensuse.org/repositories/network:/messaging:/zeromq:/release-stable/Debian_9.0/ ./" >> /etc/apt/sources.list
      wget https://download.opensuse.org/repositories/network:/messaging:/zeromq:/release-stable/Debian_9.0/Release.key -O- | sudo apt-key add
      apt-get install libzmq3-dev
      
    • https://download.opensuse.org/repositories/network:/messaging:/zeromq:/release-stable/Debian_9.0/Release.key可能在虚拟机无法访问,用本地电脑先下载下来,然后传到ubuntu中,用apt-key add Release.key安装

    • 离线安装方式
      STF只支持libzmq.so.3.1.0的动态库,该动态库是zeromq.4.0.3.tar.gz版本的库,因此一定要下该版本的库
      解压后

      ./configure
      make
      make install
      

      理论上应该直接生效了,通过stf doctor查看,但是貌似要安装如下的库才生效:

      apt-get intall libzmq-dev
      
  • 安装Protocol Buffers

    • 把protobuf-cpp-3.0.0-alpha-3.tar.gz包下载下来,然后按如下执行:

      ./configure --prefix=/usr/local/protobuf
      make
      sudo make install
      vi /etc/profile
      export PATH=$PATH:/usr/local/protobuf/bin/
      export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig/
      source /etc/profile
      
  • 安装yasm(for compiling embedded libjpeg-turbo)

    • apt-get install yasm
      
    • npm install --save jpeg-turbo
      
  • 安装pkg-config

    • apt-get install pkg-config
      
  • 安装bower

    • npm install bower -g
      
    • bower -version
      
  • 安装stf(失败的话多安装几次,网络问题)

    • cnpm install -g stf
      

    启动STF

  • 启动rethinkDB

    • rethinkdb (最简单的启动)
    • 指定端口和缓冲大小启动:rethinkdb --bind all --cache-size 8192 --http-port 8090
  • 启动stf

    • 指定ip和允许远程连接启动:stf local --public-ip 192.168.56.1 --allow-remote

    • 在虚拟机环境下,需要在虚拟机设置-> 网络->端口转发,映射虚拟机的IP和端口:

      比如: 虚拟机网卡是192.168.56.1,

      ​ 虚拟机连接方式:网络地址转换(NAT)

      ​ 虚拟机内部网络IP是10.0.2.15

      则:ssh服务需要进行端口映射

      ​ 10.0.2.15:22端口映射到192.168.56.1:22

      ​ stf的各种开放端口如果外部要访问都要进行映射

    • 需要注意的是stf每连接一台设备会创建一个7400~7700之间的端口作为websocket进行连接

    • 链接另一台adb服务的启动方式:

      • stf local --public-ip 192.168.56.1 --allow-remote --adb-host xx.xx.xx.xx --adb-port 5037
    • 只启动主服务,不启动节点服务:

      stf local --public-ip 10.66.80.158 --allow-remote --auth-type cas --user-service-url 10.1.25.94

    • 设备节点

      stf provider --name test --min-port 7400 --max-port 7700 --connect-sub tcp://127.0.0.1:7114 --connect-push tcp://127.0.0.1:7116 --group-timeout 20000 --public-ip 10.66.80.158 --storage-url http://localhost:7100/ --adb-host 10.66.80.231 --adb-port 5037 --vnc-initial-size 600x800 --allow-remote

  • 启动adb

    • adb start-server

    • 查看设备连接情况:

      • adb devices 或者lsusb
    • 手机必须开启开发者模式

    • 启动 adb server 并对外暴露 5037 端口(该方法试用于1.0.31版本)

      adb -a -P 5037 fork-server server

    • 介于1.0.31版本的adb经常容易断开设备,升级adb到1.0.39, 启动方法如下
      adb nodaemon server -a

    • 如果接入了手机,但是adb devices显示无设备,则是手机没有安装adb驱动

  • 注意事项

    • 如果stf是从github上下载的,则是一个干净的项目(没有安装依赖node_modules),需要进入到stf后执行npm install命令,自动安装需要的所有node_modules依赖包

    • gulp 命令是为二次开发编译stf用的,有如下2个命令:

      • gulp clean 清除build文件

      • gulp webpack:build 编译源文件

      • 需要安装gulp:

        • npm install gulp-cli -g
          npm install gulp -D
          
        • 确保stf目录下存在gulpfile.js和webpack.config.js文件

      • 离线安装gulp:
        把安装了的gulp从nodejs的lib/node_modules里直接拷贝到待部署的nodejs的lib/node_modules下,并且配置软连接即可
        需要拷贝gulp和gulp-cli 2个库
        ln -s /xxx/nodejs/lib/node_modules/gulp-cli/bin/gulp.js gulp.js

开发环境部署

  • 使用webpack进行前端打包(研究了一下,貌似只能对前端代码修改自动编译,后端代码必须重启服务才能生效)

    • STF默认有webpack.config.js文件,可以直接通过gulp命令进行构建
  • 使用webpack-dev-server进行前端开发模式(可以废弃,因为STF自带开发环境)

    1. 确保安装了webpack-dev-server, STF的package.json里已包含依赖关系,默认会安装,如果没有安装自己手动安装

      npm install --save-dev webpack-dev-server
      
    2. STF默认有gulpfile.js配置文件,修改此文件

      • 添加一行: var WebpackDevServer = require("webpack-dev-server")

      • 添加脚本命令:

        gulp.task("webpack-dev-server", function(callback) {
            // Start a webpack-dev-server
            var myConfig = Object.create(webpackConfig);
        
            new WebpackDevServer(webpack(myConfig), {
                // server and middleware options
            }).listen(8080, "localhost", function(err) {
                if(err) throw new gutil.PluginError("webpack-dev-server", err);
                // Server listening
                gutil.log("[webpack-dev-server]", "http://localhost:8080/webpack-dev-server/index.html");
                // keep the server alive or continue?
                // callback();
            });
        });
        
      • 启动webpack-dev-server

        gulp webpack-dev-server
        
  • STF自带前端开发模式

    • 删除res/build整个文件夹即可,这样启动的时候就是webpack的开发环境

CAS单点登录

  1. 安装CAS

    npm install cas-authentication
    
  2. 要使cas-authentication支持oa登录,需要修改cas的源码

    1. 打开cas-authentication下的index.js

      修改CASAuthentication.prototype._handleTicket方法:

      修改2个地方:

      1. strictSSL: false注释掉//strictSSL: false,
      2. pathname: this.cas_path + this._validateUri,改为pathname: this.cas_path + 'proxyValidate',
      CASAuthentication.prototype._handleTicket = function(req, res, next) {
      
          var requestOptions = {
              host: this.cas_host,
              port: this.cas_port,
              //strictSSL: false,
              rejectUnauthorized: false, 
              session_name: 'user', //必须设置,否则关闭浏览器的时候user无法置空,会出现user一直存在的问题
          };
      
          if (['1.0', '2.0', '3.0'].indexOf(this.cas_version) >= 0){
              requestOptions.method = 'GET';
              requestOptions.path = url.format({
                  pathname: this.cas_path + 'proxyValidate',//+ this._validateUri,
                  query: {
                      service: this.service_url + url.parse(req.url).pathname,
                      ticket: req.query.ticket
                  }
              });
          }
       ......
      
  3. 修改源码, 把_login函数中的renew: this.renew注释掉,否则在异步跨域访问的时候单点登录需要重新登录
    //renew:this.renew

  4. 建议把cas-authentication从node_modules中移动到项目中,因为修改了源码,如果node_modules更新了就没办法恢复了