Rails 自动化部署 Rails 应用 (Docker + Jenkins)

JohnnyTing · July 09, 2019 · Last by tewboo replied at September 02, 2020 · 3869 hits

docker 安装参考链接

docker 官网

jenkins 中文官网

服务器环境为 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 应用流程就结束了,大家可以尝试一下。

感谢分享,稍后就抽空去试一盘,thanks~

You need to Sign in before reply, if you don't have an account, please Sign up first.