当前位置: 移动技术网 > IT编程>脚本编程>Ruby > 自动化部署Ruby on Rails应用(docker + jenkins)

自动化部署Ruby on Rails应用(docker + jenkins)

2019年07月09日  | 移动技术网IT编程  | 我要评论
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应用流程就结束了,大家可以尝试一下。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网