自动化部署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应用流程就结束了,大家可以尝试一下。
自动化部署Ruby on Rails应用(docker + jenkins)的更多相关文章
- Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(三):搭建jenkins集群环境
写在前面 大家可以看到本文的配图,左边是jenkins单机环境,右边是jenkins集群.个中区别,不言而喻,形象生动. 前面我分别介绍了.net core 程序的多种部署方式(无绝对孰优孰劣): 1 ...
- 最详细之教你Jenkins+github自动化部署.Net Core程序到Docker
环境 centos7.9,.NET5 一.Jenkins搭建 1)下载Jenkins的war包 在\home目录建一个jenkins目录放jenkins的包 #进入\home目录 cd \home # ...
- .Net Core自动化部署系列(一):Jenkins + GitLab
项目进行微服化改造后系统发布就变得愈为重要,因为持续集成导致部署变得越来越频繁,人工部署带来的一些问题日渐凸显,大家可能都有被系统部署线问题困扰过的经历. 本篇我们将会使用Jenkins+Gitlab ...
- 自动化部署:在Windows平台安装Jenkins
在软件开发中经常会提到持续集成Continuous Integration(CI)和持续交付Continuous Delivery(CD).其中Jenkins是一个开源软件项目,是基于Java开发的一 ...
- Jenkins+Docker+Git 自动化部署
Jenkins+Docker+Git 自动化部署图文教程 https://blog.csdn.net/qq_38252039/article/details/89791247 前言: 通过几天的学习和 ...
- 【开发工具】Jenkins+Gitlab实现自动化部署
我在尝试在容器中安装Jenkins时,初衷是希望使用docker in docker 的模式来实现Jenkins slave容器按需创建.在实现的时候需要在Jenkins 中安装Kubernetes插 ...
- 利用PowerShell+Jenkins,实现项目的自动化部署
当项目越来越庞大,部署环境越来越多以后,就会越来越依赖于自动化.比如本人公司的项目,目前有6个web和4个windows service,同时本地有两套环境:开发自测试环境和QA测试环境.每次版本发布 ...
- 微服务项目的docker自动化部署流程
目录 微服务的Docker自动化部署 制作JDK1.8的Docker镜像 Docker常用命令介绍 制作image的一般流程 将本地的image上传至私人仓库 使用Maven插件实现自动化docker ...
- 项目测试环境自动化部署[jenkins前后端配置、Nginx配置]
持续部署:关注点在于项目功能部署到服务器后可以正常运行,为下一步测试环节或最终用户正式使用做准备.(问题点:一个环节有问题,其他环节跟着有问题) 持续集成:关注点是在于尽早发现项目整体运行问题,尽早解 ...
随机推荐
- 第一章 权限管理DEMO简介
源代码GitHub:https://github.com/ZhaoRd/Zrd_0001_AuthorityManagement 1.系列介绍 工作已有五年之久,一直有想通过博客写点自己知道的,在博客 ...
- E203 译码模块(2)
常用的alu算术运算指令(包括ecall和 ebreak)在regular alu单元处理.regular alu单元为alu单元的一个子单元.regular单元的信息总线共21位,格式如下图所示,其 ...
- Finished with error: ProcessException: Process "D:\FlutterAPP\flutter_appfive\android\gradlew.bat" exited abnormally:
在使用Flutter进行开发是遇到这样一个问题 Finished with error: ProcessException: Process "D:\FlutterAPP\flutter_a ...
- C++智能指针解析
前言 在C++程序中,内存分为三种静态内存.栈内存.堆内存.其中静态内存和栈内存由系统进行维护,而堆内存则是由程序员自己进行维护,也就是我们在new和delete对象时,这些对象存放的区域.任何有C+ ...
- Innodb整体架构
如下图展示了Innodb内存中和磁盘的结构: 内存中结构主要有如下几种: buffer pool change buffer adaptive hash index (自适应的hash索引) Log ...
- Linux Tools 之 iostat 工具总结
iostat是Linux中被用来监控系统的I/O设备活动情况的工具,是input/output statistics的缩写.它可以生成三种类型的报告: CPU利用率报告 设备利用率报告 网络文件系统报 ...
- 08、启动过程+at+crond+anacron
[root@li ~]# 加电--BIOS (basic input output system)--以什么设备来启动--/dev/sda -- mbr -- grub.conf --vmlinux ...
- Linux---用户及权限管理类命令
1.Linux用户 分为三类: 超级用户:拥有最高权限 系统用户:与系统服务相关,但不能用于登录 普通用户:由超级用户创建并赋予权限,只能操作其拥有权限的文件和目录,只能管理自己启动的进程 2.用户管 ...
- VIJOS-P1423 最佳路线
VIJOS-P1423 最佳路线 JDOJ 1507 https://neooj.com/oldoj/problem.php?id=1507 Description 年久失修的赛道令国际汽联十分不满. ...
- LG4171/BZOJ1823 「JSOI2010」满汉全席 2-SAT
问题描述 LG4171 BZOJ1823 题解 显然,每个评委对每个材料的满式/汉式要求是对\(n\)个元素的\(0,1\)取值限制. 显然想到\(\mathrm{2-SAT}\) 于是就可以切掉了. ...