zoukankan      html  css  js  c++  java
  • 自动化部署Ruby on Rails应用(docker + jenkins)

    docker安装参考链接

    docker官网

    jenkins中文官网


    我的博客网站已经迁移到了https://johnnyting.github.io/,如果有兴趣的可以关注下。
    下面文章格式可能有点乱,可以查看我的博客原文: https://johnnyting.github.io/posts/%E4%BD%BF%E7%94%A8jenkinsdocker%E8%87%AA%E5%8A%A8%E5%8C%96%E9%83%A8%E7%BD%B2rails%E5%BA%94%E7%94%A8/

    服务器环境为Ubuntu 16.04.2 LTS

    1.卸载旧版本docker

    sudo apt-get remove docker 
                  docker-engine
                  docker.io

    2.安装docker,使用脚本自动安装

    curl -fsSL get.docker.com -o get-docker.sh

    sudo sh get-docker.sh --mirror Aliyun

    3.启动docker

    # 设置开启自启动
    sudo systemctl enable docker

    # 启动docker
    sudo systemctl start docker

    # 查看版本
    docker -v    # docker --version
    Docker version 18.09.5, build e8ff056

    4.安装docker-compose

    sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

    # 添加执行权限
    sudo chmod +x /usr/local/bin/docker-compose

    # 查看版本
    docker-compose -v    # docker-compose --version

    5.安装compose bash补全命令

    curl -L https://raw.githubusercontent.com/docker/compose/1.8.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

    6.如果需要卸载docker-compose,删除可执行文件即可

    sudo rm /usr/local/bin/docker-compose

    7.配置docker镜像加速

    在/etc/docker/daemon.json 中写入如下内容,如果没有此文件新建即可:
    {
    "registry-mirrors": [
      "https://dockerhub.azk8s.cn",
      "https://reg-mirror.qiniu.com"
    ]
    }


    重新启动服务:
    sudo systemctl daemon-reload
    sudo systemctl restart docker

    检查加速器是否生效:
    docker info

    如果出现下面内容则配置成功
    Registry Mirrors:
    https://dockerhub.azk8s.cn/
    https://reg-mirror.qiniu.com/

    8.安装jenkins,使用blue ocean镜像,来创建流水线项目

    docker run 
       --name jenkins
       -u root
       -d
       -p 8090:8080
       -v /home/oliver/jenkins_home:/var/jenkins_home
       -v /home/oliver/.ssh:/root/.ssh
       --restart=always
      jenkinsci/blueocean
       
    # 将jenkins的数据目录挂载出来,防止数据丢失
    # 这里把.ssh目录挂载出来的原因是:
    # 1.之后需要将rails应用部署到其他服务器上,需要通过ssh认证来远程部署应用,所以主机host需要保证和部署服务器连通。
    # 2.需要将ssh公钥传入到git服务器上,保证能正常拉取代码

    9.查看jenkins日志,获取管理员密码

    ➜  ~ sudo docker ps
    CONTAINER ID       IMAGE                 COMMAND                 CREATED             STATUS             PORTS                               NAMES
    a210c6d643a3       jenkinsci/blueocean   "/sbin/tini -- /usr/…"   3 minutes ago       Up 3 minutes        50000/tcp, 0.0.0.0:8090->8080/tcp   jenkins

    # 查看jenkins日志
    ➜ ~ sudo docker logs -f --tail=50 a210c6d643a3

    看到密码后复制,或者进入容器内的/var/jenkins_home/secrets/initialAdminPassword 查看,因为jenkins容器目录挂载到了/home/oliver/jenkins_home下,所以也可以查看

    /home/oliver/jenkins_home/secrets/initialAdminPassword 文件中的内容。

     

    10.选择安装推荐插件就行

     

    11.然后等待安装完成,如果安装失败就重新安装。

     

    12.然后下一步提示创建一个管理员账号,填写完就进入jenkins首页。

     

    13.配置凭据

     

    添加全局凭据:

     

    添加ssh私钥,在/home/oliver/.ssh/id_rsa中

     

    14.在本地rails项目中添加 Jenkinsfile:

    pipeline {
       agent any
       stages {
          stage('start') {
             steps {
               echo 'jenkins构建开始...'
            }
          }
          stage('build') {
             steps {
               sh 'sh ssh.sh'
            }
          }
      }
      post {
          success {
               echo 'jenkins构建成功'
            }
          failure {
               echo 'jenkins构建失败'
            }
      }
    }

    15.连接应用部署服务器ssh.sh(jenkins所在服务器与应用部署服务器区分开):

    #! /bin/bash
    branch=$(git symbolic-ref --short -q HEAD)
    echo "分支: ${branch}"
    ssh root@xxxx 'bash -s' < deploy.sh ${branch}

    # 这里获取分支名称是为了在部署服务器上区分分支项目,也用来区分每个分支的docker容器
    # 后面的deploy.sh 是连接到部署服务器上后执行的脚本

     

    16.根据部署脚本deploy.sh启动容器:

    #! /bin/bash
    app=$1
    cd /root/workspace/
    if [ ! -d "${app}" ];then
       echo "克隆项目${app}"
       git clone -b $app git@xxxx/xxxx.git $app
       cd ${app}
    else
       cd ${app}
       echo "拉取项目${app}"
       git pull origin $app
    fi
    branch=${app//-/}
    echo ${branch}
    web=$(docker-compose ps | grep $branch | awk '{print $1}')
    if [ -z $web ];then
       echo "构建容器: ${web}"
      docker-compose up -d
    else
       echo "重启容器: ${web}"
      docker-compose restart
    fi

    # 上面shell主要的作用是:不存在某个分支的项目则克隆到指定目录,存在则拉取最新代码;然后根据分支名称查看容器是否构建过,没有则开始构建并启动,之前构建过则重启容器

     

    17.构建所需要的Dockerfile:

    FROM ruby:2.5.3
    RUN apt-get update -qq && apt-get install -y curl netcat &&
       curl -sL https://deb.nodesource.com/setup_10.x |  bash - &&
      apt-get install -y nodejs postgresql-client openjdk-8-jdk &&
       npm install -g yarn --registry=https://registry.npm.taobao.org &&
      yarn config set registry https://registry.npm.taobao.org -g &&
      yarn config set sass_binary_site http://cdn.npm.taobao.org/dist/node-sass -g &&
      apt-get purge -y --auto-remove curl && apt-get clean &&
       rm -rf /var/lib/apt/lists/*
    ENV LANG=C.UTF-8 RAILS_ROOT=/myapp
    WORKDIR $RAILS_ROOT
    VOLUME $RAILS_ROOT
    COPY entrypoint.sh /usr/bin/
    RUN chmod +x /usr/bin/entrypoint.sh
    ENTRYPOINT ["entrypoint.sh"]
    EXPOSE 3000
    # Start the main process.
    CMD ["rails", "server", "-b", "0.0.0.0"]

     

    18.入口点entrypoint.sh

    #!/bin/bash
    # Remove a potentially pre-existing server.pid for Rails.
    rm -f /myapp/tmp/pids/server.pid
    bundle install
    rm -rf build/
    ./gradlew generateProto
    nohup sh bin/rpcServer_development.sh >rpc.log 2>&1 &
    echo $! > rpc.pid
    while ! nc -z localhost 6600;
        do
         echo "wait for rpc...";
         sleep 2;
        done;
    echo "rpc is ready!";
    if [ -f "bin/downloadCenter_development.sh" ];then
      nohup sh bin/downloadCenter_development.sh >download.log 2>&1 &
      echo $! > download.pid
    fi
    yarn install
    # Then exec the container's main process (what's set as CMD in the Dockerfile).
    exec "$@"

    # 注意:上面脚本需要根据自己项目的具体情况来写

    19.docker-compose.yml

    version: '3'
    services:
    web:
      build: .
      volumes:
         - .:/myapp
      ports:
         - "3000:3000"
       restart: always

     

    20.然后创建jenkins项目,打开blue ocean

     

    21.选择git代码仓库,填入git地址

    填入地址后根据提示需要将你的ssh公钥key配置到git服务器上,然后创建流水线。创建后多分支项目根目录有Jenkinsfile的自动构建。

     

    22.在项目配置中,选择扫描项目的时间间隔,分支有改动自动触发构建

    这里设置每五分钟扫描一次git仓库

     

    之后就是每次推送了代码,jenkins发现代码有改动就会触发构建并使用docker部署到指定的服务器上,可以在jenkins后台查看构建过程,也可以在部署服务器查看容器日志。

     

    整个自动化部署rails应用流程就结束了,大家可以尝试一下。

  • 相关阅读:
    Mysql存储类型选择
    Mysql的MVCC
    SQL标准中的四种隔离级别
    web权限管理总结
    关于oauth2中为什么不直接返回token而是传授权码code
    课程作业——爬取校园新闻首页的新闻的详情,使用正则表达式,函数抽离
    网络爬虫基础练习
    Python中文词频统计
    关于Maven的配置与学习
    课程作业——综合练习:英文词频统计
  • 原文地址:https://www.cnblogs.com/dingxu/p/11158071.html
Copyright © 2011-2022 走看看