离线安装Rainbond平台;源码构建static项目及python项目的一些问题及解决方案

离线安装Rainbond平台源码构建static项目及python项目的一些问题及解决方案

在离线安装好rainbond平台之后,需要进行static和python项目的源码构建,在这中间因为内外网隔离等原因出现了一些问题,通过借鉴Rainbond官方文档中对于Java项目离线源码构建的文档,解决了出现的一些问题,特将离线源码构建的过程及问题进行记录并给出自己的解决方案,以供大家参考

离线源码构建的提前准备

离线源码构建需要提供私服仓库,这里使用Rainbond平台提供的方式构建私服

  1. 编程配置文件,启动服务
    vim /opt/rainbond/conf/base.yaml
    
    #将下列内容添加到最后,其中goodrain.me/buildpack:all-master可以从获取
    - name: rbd-all-buildpack
      endpoints:
      - name: BUILDPACK_ENDPOINTS
        protocol:
        port: 2017
      health:
        name: rbd-all-buildpack
        model: http
        address: 127.0.0.1:2017/lang/
        max_errors_num: 3
        time_interval: 30
      after:
        - docker
      type: simple
      pre_start: docker rm rbd-all-buildpack
      start: >-
        docker run --name rbd-all-buildpack
        --network host
        -i goodrain.me/buildpack:all-master
      stop: docker stop rbd-all-buildpack
      restart_policy: always
      
    #修改完成后启动服务
    node service update
    
  2. 修改rbd-repo对应远程仓库地址

Static项目离线源码构建问题处理过程

  1. 问题触发动作

    1. 在 gitlab 上创建仓库

    仓库地址:https://gitlab.xxxx.com.cn/wilson/hello_word.git,位于公司内网的 gitlab 代码仓库

    这里我使用的是 rainbond 官方的 static 示例 demo,下载后放到公司的 gitlab 仓库中

    1. 在 rainbond 中添加组件

    进入 rainbond 的应用管理栏,通过添加组件按钮进入【组件添加】页面

    我采用的是从 gitlab 上拉取源码的方式构建应用

    选择新建组件开始构建2048项目

  2. 错误描述及问题定位

    1. 完成以上步骤,在构建过程中,却出现新的错误

    1. 查看日志,应该是在构建过程中 nginx 没有安装,导致应用运行失败

    1. 在 goodrain 的 builer 项目的 buildpacks/goodrain-buildpack-static/lib/web.sh 文件中可以查到有关 nginx 抓取的代码
        local NGINX_VERSION="1.14.2"
        local NGINX_URL="http://lang.goodrain.me/static/r6d/nginx/nginx-${NGINX_VERSION}.tar.gz"
        local NGINX_PATH="nginx"
        # install nginx if needed
        if [ ! -d "$NGINX_PATH" ]; then
            [ -z "$DEBUG_INFO" ] && echo "-----> Installed Nginx ${NGINX_VERSION}" || echo "-----> Installed Nginx ${NGINX_VERSION} from $NGINX_URL."
            mkdir -p $NGINX_PATH/conf.d
            curl --silent --max-time 60 --location $NGINX_URL | tar xz --strip-components 2 -C $NGINX_PATH
        fi
    

    看来 builder 会去上面的地址抓取它需要的 nginx 版本,而且抓取的相对路径是 static/r6d/nginx/。那么我们只要手动下载对应版本的 nginx包,在放到 rbd-all-buildpack 对应的目录去就好了。

  3. 解决方法

    通过上述对问题的排查,我们可以得出只需将nginx包放到rbd-all-buildpack镜像的对应目录即可,操作步骤如下

    1. 用 Dockerfile 构建一个新镜像,Dockerfile 如下

      # 前面的 docker-public.xxxx.com.cn 是公司的制品库
      # 表明让 docker 去公司制品库上抓取
      FROM docker-public.xxxx.com.cn/rainbond/buildpack:all-master
      
      # 把当前目录中的 nginx 放到镜像的对应目录下
      COPY nginx-1.14.2.tar.gz /pkg/lang/static/r6d/nginx/nginx-1.14.2.tar.gz
      
    2. 通过 Dockerfile 构建

      # 注意最后的 ".", 表示当前文件夹的 dockerfile
      sudo docker build -t goodrain.me/buildpack:all-master .
      
      Sending build context to Docker daemon  4.031GB
      Step 1/2 : FROM docker-public.xxxx.com.cn/rainbond/buildpack:all-master
       ---> cefa00019a2e
      Step 2/2 : COPY nginx-1.14.2.tar.gz /pkg/lang/static/r6d/nginx/nginx-1.14.2.tar.gz
       ---> 3c80ad85fef4
      Successfully built 3c80ad85fef4
      Successfully tagged goodrain.me/buildpack:all-master
      
    3. 加载新镜像

      在服务器端加载新的 buildpack 镜像,要遵循一下步骤:

      1. 关闭正在运行的 rbd-all-buildpack 节点服务

        要通过 systemctl 关闭,而不是 docker stop,用后者由于service文件策略的原因,会重新生成一个容器

        systemctl stop rbd-all-buildpack
        
      2. 删除容器

        docker rm <rbd-all-build 的容器-id>
        
      3. 删除镜像

        docker rmi goodrain.me/buildpack:all-master
        
      4. 加载新镜像

        docker load < buildpack.tar 
        e93af51b6155: Loading layer [==================================================>]  69.92MB/69.92MB
        c6dd240a7dd5: Loading layer [==================================================>]  13.57MB/13.57MB
        fd35c88bf9b5: Loading layer [==================================================>]  111.6MB/111.6MB
        6949d7bffa7f: Loading layer [==================================================>]  51.44MB/51.44MB
        a1d2f1dcefd5: Loading layer [==================================================>]  24.06kB/24.06kB
        b829d25d8534: Loading layer [==================================================>]   2.56kB/2.56kB
        6e8285ad3279: Loading layer [==================================================>]  2.048kB/2.048kB
        4d1a3e37c48a: Loading layer [==================================================>]   5.12kB/5.12kB
        0abcb19fd8a9: Loading layer [==================================================>]  3.707GB/3.707GB
        d0760e9e2f8f: Loading layer [==================================================>]   2.56kB/2.56kB
        Loaded image: goodrain.me/buildpack:all-master
        
      5. 更新 rainbond 服务

        node service update
        
  4. 验证构建好的 2048 应用

    访问应用对外开放端口,就可以打开应用了

    Python项目离线源码构建问题处理过程

    1. 错误描述

      在离线环境下进行python源码编译时,在这一过程中会使用到互联网资源,但是离线环境下无法连接外网,导致源码构建失败

      1. 在进行python源码构建时,会使用apt-get来下载资源,包括sqlite3等,但是因为无法访问会导致安装失败
      2. 在进行python源码构建时,pip安装源指定向了外网源,同样因为无法访问会导致安装失败
    2. 解决方法

      在源码构建过程中,实际上时使用rainbond/builder镜像启动容器完成的构建过程,所以要解决上述问题,就需要重新构建builder镜像,将其中涉及到外网的资源都改为从内网来获取

      1. 修改镜像的软件源

        1. 确定镜像的操作系统

          # 进入 builer 容器
          $ docker run -it --rm goodrain.me/builder debug
          # 在 builer 容器中查看系统版本
          $ cat /etc/issue
          Debian GNU/Linux buster/sid \n \l
          
        2. 获取到镜像操作系统后,将软件源修改为对应的内网源

          cat /etc/apt/sources.list
          
          #/etc/apt/sources.list
          deb http://mirrors.xxxx.com.cn/debian buster main non-free contrib
          deb http://mirrors.xxxx.com.cn/debian buster-proposed-updates main contrib non-free
          deb http://mirrors.xxxx.com.cn/debian-security buster/updates main contrib non-free
          
          deb-src http://mirrors.xxxx.com.cn/debian buster main non-free contrib
          deb-src http://mirrors.xxxx.com.cn/debian buster-proposed-updates main contrib non-free
          deb-src http://mirrors.xxxx.com.cn/debian-security buster/updates main contrib non-free
          
        3. 将修改后的文件保存,在后续构建镜像时会添加到新的builder镜像内

      2. 获取builder项目源码,修改其中涉及到外网的部分

        1. 获取builder项目源码并进入

          git clone https://github.com/goodrain/builder && cd builder
          
        2. 因内网提供的软件源无指定版本的sqlite3,所以对代码做出修改,不再指定版本

          cat buildpacks/heroku-buildpack-python/bin/steps/sqlite3
          
          sqlite3_version() {
          if [ "$STACK" = "cedar-14" ]; then
              # SQLITE3_VERSION="3.8.2-1ubuntu2.2"
              SQLITE3_VERSION=""
          else
              SQLITE3_VERSION=${SQLITE3_VERSION:-$(dpkg -s libsqlite3-0 | grep Version | sed 's/Version: //')}
          fi
          export SQLITE3_VERSION
          }
          
        3. 修改执行pip install操作时指定的源

          cat buildpacks/heroku-buildpack-python/bin/steps/python
          
          rm -fr /app/.heroku/python/lib/python*/site-packages/pip-*
          rm -fr /app/.heroku/python/lib/python*/site-packages/setuptools-*
          # 把镜像地址改成公司地址
          /app/.heroku/python/bin/python "$ROOT_DIR/vendor/get-pip.py" pip=="$PIP_UPDATE" -i https://xxxx.com.cn/artifactory/api/pypi/public-pypi-virtual/simple
          /app/.heroku/python/bin/pip install "$ROOT_DIR/vendor/setuptools-39.0.1-py2.py3-none-any.whl" &> /dev/null
          

          另外,还要设置环境变量 BUILD_PIP_INDEX_URL (设置方法在上文的【添加组件】-【高级设置】中有提及),否则就需要手动修改 builder 项目中所有的 pip 源

          BUILD_PIP_INDEX_URL=https://xxxx.com.cn/artifactory/api/pypi/public-pypi-virtual/simple
          
      3. 制作新的builder镜像并替换掉原有builder镜像

        1. 修改Dockerfile,将镜像的软件源添加进新镜像

          # FROM rainbond/cedar14:20180416
          FROM docker-public.xxxx.com.cn/rainbond/cedar14:20180416
          
          # 中间省略
          
          # 替换成公司的 source.list
          ADD ./sources.list /etc/apt/sources.list
          RUN cat /etc/apt/sources.list
          # rainbond 用的是 debian 版本的 linux,不是 ubuntu
          
        2. 编译镜像

          sudo docker build -t goodrain.me/builder .
          
          # 编译过程
          Sending build context to Docker daemon  26.58MB
          Step 1/22 : FROM docker-public.xxxx.com.cn/rainbond/cedar14:20180416
          ---> 5a5a7a0f8d0d
          
          # 中间省略
          ....
          
          ---> 2c3ee1182125
          # 替换 sources.list
          Step 5/22 : ADD ./sources.list /etc/apt/sources.list
          ---> ecd909c0d942
          Step 6/22 : RUN cat /etc/apt/sources.list
          ---> Running in 02886dc6fd84
          #/etc/apt/sources.list
          deb http://mirrors.xxxx.com.cn/debian buster main non-free contrib  
          deb http://mirrors.xxxx.com.cn/debian buster-proposed-updates main contrib non-free  
          deb http://mirrors.xxxx.com.cn/debian-security buster/updates main contrib non-free  
          
          deb-src http://mirrors.xxxx.com.cn/debian buster main non-free contrib    
          deb-src http://mirrors.xxxx.com.cn/debian buster-proposed-updates main contrib non-free    
          deb-src http://mirrors.xxxx.com.cn/debian-security buster/updates main contrib non-free  
          
          #deb http://security.debian.org/ buster/updates main contrib  
          #deb-src http://security.debian.org/ buster/updates main contribRemoving intermediate container 02886dc6fd84
          ---> 1039d332f6b8
          ...
          Removing intermediate container eee574244f49
          ---> d9686571a77f
          Successfully built d9686571a77f
          Successfully tagged goodrain.me/builder:latest
          
        3. 因rainbond平台所在的服务器无法连接内网,所以需要将制作好的镜像导入到rainbond平台所在的服务器

          • 在制作镜像的服务器将镜像打包发送到rainbond平台所在的服务器
          docker save goodrain.me/builder > builder.tar
          #发送到服务器
          scp builder.tar szdev@12.3.200.100:/home/szdev
          
          • 加载builder镜像,并push到本地镜像仓库
          docker load < builder.tar 
          docker push goodrain.me/builder