标签搜索

drone-cli 自动发布

jjiaper
2022-05-21 / 0 评论 / 17 阅读 / 正在检测是否收录...

引子

最近公司业务重构,架构升级到了微服务,模块是一个接着一个的加,更新发布手动打包上传是真的麻烦,一件很无聊的事。有问题就有解决办法,搞个自动发布不就行啦。
目前接触和使用过的几种自动发布的方案有如下:

  • 直接使用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

2022-05-21T14:32:06.png
设置好用户名密码和数据库连接后进入gogs后台
2022-05-21T14:36:19.png

安装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的登录名和密码)

http://192.168.1.165:3080/
2022-05-21T14:40:32.png

创建测试仓库:
2022-05-21T14:46:05.png
drone管理端同步仓库
2022-05-21T14:47:37.png
配置自动发布的设置
2022-05-21T15:02:04.png
gogs配置webhook
2022-05-21T15:05:38.png
代码仓库中添加自动发布的脚本

---
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 # 从宿主机中挂载的目录

提交代码,测试

2022-05-21T15:24:17.png

脚本内容为:
2022-05-21T15:55:04.png
执行后
2022-05-21T15:55:35.png

0

评论 (0)

取消