引子
最近公司业务重构,架构升级到了微服务,模块是一个接着一个的加,更新发布手动打包上传是真的麻烦,一件很无聊的事。有问题就有解决办法,搞个自动发布不就行啦。
目前接触和使用过的几种自动发布的方案有如下:
- 直接使用docker:流程如下,服务器端安装号docker服务端,并开启远程访问(开启使用密钥登录),如果使用idea开发,在插件市场安装docker插件,配置好远程服务器地址并能正确访问,在项目内编写好DockerFile,配置编译或者打包或者发布的时候关联docker build 构建docker镜像,然后通过idea的docker操作栏进行容器的启动。
- git + maven + shell 脚本:这个是属于半自动发布吧,流程是这样,服务器安装配置好git和maven,在IDE里编辑好代码后,push到git仓库,服务器编写一个shell脚本(python 或者bat脚本也行,只要可以操作maven和git),通过ssh登录到远程服务器后运行该脚本(此脚本的处理流程为,拉取指定仓库的代码,切换到指定的分支,maven编译和打包该代码,将原来的程序文件备份,命令行操作停止原来的程序,启动此版本的程序),完成程序更新。
- git仓库(gitlab或者gogs此类带webhook的仓库)+ 自动发布的程序(Jenkins或者drone-cli)这种自动化程度比较高,定制性也比较强,总体的流程为提交代码,触发git仓库的webhook,webhook访问自动发布程序,自动发布程序根据制定好的流程进行一步步操作,比如,克隆代码->编译->验证->登录远程服务器->拷贝文件->启停应用程序;大体是这个流程。
小结
目前的常见的就是这几种,当然方式很多,只不过别的没咋接触过,有别的可以下方留言学习下哈。方式千千万,但得找个适合自己的不是,看自己的场景吧,小项目,数量少,服务器数量少,感觉可以用docker,比如自己搞个博客,想改改源代码,直接docker搞起来就行了,如果你的项目比较复杂,编译比较耗时,打好的包比较大,可以用第二种,当然,用第三种结合第二种也行哈,如果项目比较多,部署比较复杂,服务器比较多,第三种应该是个比较好的选择。
如果使用第三种,那又要进行一波选择,用哪个程序比较好呢(有实力的可以进行自研。)我只调研过jenkins和drone,Jenkins大名鼎鼎,老牌选手了,功能比较完善,其优点也是其缺点,功能太多了,有点臃肿。drone-cli功能相对来说是比较简单,但是自动发布,定时发布,ssh远程登录,文件拷贝,这些功能都有。
drone-cli 依赖docker实现自动发布,基础架构分为服务端和runner,通过webhook调用后进行后续操作。
其官网可以看这里 drone官网
使用流程:
1:安装docker环境
都可以找到的资料就不写了,可以看此处《菜鸟教程》的centos安装docker,以下内容是摘抄过来的
使用官方安装脚本自动安装
安装命令如下:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
也可以使用国内 daocloud 一键安装命令:
curl -sSL https://get.daocloud.io/docker | sh
手动安装
卸载旧版本
较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,请卸载它们以及相关的依赖项。
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
**安装 Docker Engine-Community
使用 Docker 仓库进行安装**
在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。之后,您可以从仓库安装和更新 Docker。
设置仓库
安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
使用以下命令来设置稳定的仓库。
使用官方源地址(比较慢)
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
可以选择国内的一些源地址:
阿里云
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
清华大学源
sudo yum-config-manager \
--add-repo \
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
安装 Docker Engine-Community
安装最新版本的 Docker Engine-Community 和 containerd,或者转到下一步安装特定版本:
sudo yum install docker-ce docker-ce-cli containerd.io
如果提示您接受 GPG 密钥,请选是。
有多个 Docker 仓库吗?
如果启用了多个 Docker 仓库,则在未在 yum install 或 yum update 命令中指定版本的情况下,进行的安装或更新将始终安装最高版本,这可能不适合您的稳定性需求。
Docker 安装完默认未启动。并且已经创建好 docker 用户组,但该用户组下没有用户。
要安装特定版本的 Docker Engine-Community,请在存储库中列出可用版本,然后选择并安装:
1、列出并排序您存储库中可用的版本。此示例按版本号(从高到低)对结果进行排序。
yum list docker-ce --showduplicates | sort -r
docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
2、通过其完整的软件包名称安装特定版本,该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。例如:docker-ce-18.09.1。
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
启动 Docker。
sudo systemctl start docker
通过运行 hello-world 映像来验证是否正确安装了 Docker Engine-Community 。
sudo docker run hello-world
卸载 docker
删除安装包:
yum remove docker-ce
删除镜像、容器、配置文件等内容:
rm -rf /var/lib/docker
设置自动自动:
systemctl enable docker
安装 gogs
gogs(一个轻型的git仓库)
拉取镜像:
docker pull gogs/gogs
安装gogs
docker run -p 10022:22 -p 10080:3000 --name=gogs \
-e TZ="Asia/Shanghai" \
-v /mydata/gogs:/data \
-d gogs/gogs
浏览器访问:
http://192.168.1.165:10080
设置好用户名密码和数据库连接后进入gogs后台
安装Drone
拉取 Drone的Server
docker pull drone/drone
拉取 Drone的Runner(还有ssh runner如果需要自行安装,更多见drone runner)
docker pull drone-runner-docker
drone server和runner运行
Server
docker run \
-v /mydata/drone:/data \
-e DRONE_AGENTS_ENABLED=true \
-e DRONE_GOGS_SERVER=http://192.168.1.165:10080 \
-e DRONE_RPC_SECRET=dronerpc666 \
-e DRONE_SERVER_HOST=192.168.1.165:3080 \
-e DRONE_SERVER_PROTO=http \
-e DRONE_USER_CREATE=username:jjia,admin:true \
-e TZ="Asia/Shanghai" \
-p 3080:80 \
--restart=always \
--detach=true \
--name=drone \
drone/drone
Runner
docker run -d \
-v /var/run/docker.sock:/var/run/docker.sock \
-e DRONE_RPC_PROTO=http \
-e DRONE_RPC_HOST=192.168.1.165:3080 \
-e DRONE_RPC_SECRET=dronerpc666 \
-e DRONE_RUNNER_CAPACITY=2 \
-e DRONE_RUNNER_NAME=runner-docker \
-e TZ="Asia/Shanghai" \
-p 3000:3000 \
--restart always \
--name runner-docker \
drone/drone-runner-docker
浏览器访问: (用户名密码为gogs的登录名和密码)
创建测试仓库:
drone管理端同步仓库
配置自动发布的设置
gogs配置webhook
代码仓库中添加自动发布的脚本
---
kind: pipeline
type: docker
name: test_publish_pipeline
#流程触发的方式
trigger:
#指定分支
branch:
- master
#指定事件
event:
- push
steps: # 定义流水线执行步骤,这些步骤将顺序执行
- name: package # 流水线名称
image: maven:3-jdk-8 # 定义创建容器的Docker镜像
volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置
- name: mevan-setting
path: /usr/share/maven/conf #同步配置
- name: mevan-cache
path: /root/.m2 # 将maven下载依赖的目录挂载出来,防止重复下载
commands: # 定义在Docker容器中执行的shell命令
- ls # 应用打包命令
- touch aaa # 应用打包命令
# - mvn clean # 应用打包命令
# - mvn install # 应用打包命令
- name: scp files
image: appleboy/drone-scp
settings:
host: 192.168.1.11
username: root
password:
from_secret: rootloginpassword
port: 22
command_timeout: 2m
target: /home/pi/autopublish #tmp目录是远程主机的
source: ./** #需要传输的文件夹,当前目录
- name: start
image: appleboy/drone-ssh # SSH工具镜像
settings:
host: 192.168.1.11 # 远程连接地址
username: root # 远程连接账号
password:
from_secret: rootloginpassword # 从Secret中读取SSH密码
port: 22 # 远程连接端口
command_timeout: 5m # 远程执行命令超时时间
script:
#发布
- /home/pi/autopublish/publish.sh
volumes: # 定义流水线挂载目录,用于共享数据
- name: mevan-setting #用于mevan下载加速
host:
path: /mydata/maven/conf # 从宿主机中挂载的目录
- name: mevan-cache
host:
path: /mydata/maven/cache # 从宿主机中挂载的目录
提交代码,测试
脚本内容为:
执行后
评论 (0)