前言

俗话说,不想当一个好运维的程序员不是一个合格的产品经理。作为一个业余时间会写点小玩意整活的三流开发,我很快就厌倦了每次发布新版本都要上传程序到服务器,停止旧程序,然后再运行新程序的过程,经常scp命令写着写着就忘记了自己的应用文件夹在在哪里了,只能气急败坏的在ssh窗口里再pwd一遍。于是我在服务器上愉快地装起了Jenkins,并且使用了一段时间。

然而随着我的项目向容器迁移,并且加入多个微服务相关组件,尤其是当我买了一台DMA5F(Minisforum出品的一台家用NUC)用于部署我的所有项目的时候,接连遇到了几个问题:

  1. 由于使用SpringCloudConfig作为配置中心,国内访问github经常抽风,导致配置服务器启动失败。
  2. 配置中有含有大量个人关键信息,把配置交给公网git服务实在有些不放心。
  3. 代码本身放在github上,构建的时候经常拉不下来。

我的个人项目大多数是不需要公网ip的,需要公网ip的项目我可以通过frp内网穿透出去,所以我把项目大多数部署在了DMAF5上,并且全部容器化了。但是SpringCloudConfig依旧需要把配置保存在github上,于是问题就变成了我需要部署一个我自己的私有Git仓库,而且需要具备完整的devOps功能,比如拥有类似于Github Action的功能,或能结合主分支tag,自动发布RELEASE等与版本控制深度结合的功能。由于只是个人开发使用,我没有选用gitlab,因为感觉太重了,大部分功能我都用不到,这个时候有一个项目映入我的眼帘,那就是OneDev

关于OneDev的简介,可以参照这篇文章。它满足了我的大部分需求,而且功能干练简洁,易于上手,提供了可视化的构建配置界面,可以说相当友好了。最重要的是它是开源的,以Java语言编写而成,并且目前依旧在频繁的更新迭代,作为一个Javaer而言,它在各种意义上都挺有吸引力的。
OneDev在OneDev平台开源

搭建OneDev

这里我选择使用Docker搭建OneDev。

官方提供的命令:

docker run -it --rm -v /var/run/docker.sock:/var/run/docker.sock -v $(pwd)/onedev:/opt/onedev -p 6610:6610 -p 6611:6611 1dev/server

由于我是运行在自家Nuc上的,重启后希望它自动运行。以及官方命令里面$(pwd)会将挂载目录设定到执行命令的目录下,因此我做了一些改动。大家可以根据自己的需要来设定命令参数

docker run -it --restart=always --name onedev --net lainnet -v /var/run/docker.sock:/var/run/docker.sock -v /root/onedev:/opt/onedev -p 6610:6610 -p 6611:6611 1dev/server

加入--net lainnet参数是因为希望onedev能与我的配置中心处于同一个网络,方便互相访问,没有这方面需求的可以无视这个参数。

执行后,浏览器访问6610端口,就能看到ovedev的登录页面了。

配置通知邮箱

邮件通知是功能是必不可少的,假如我们的自动构建或者自动测试因为某些原因失败了,当然是希望能收到提醒的。这里我们来设置一下邮箱提醒,我这里这里使用的是163邮箱,当然你也可以在构建流程里触发钉钉的消息推送,这个我们在之后的构建里再做。

点开Mail Setting

image.png

image.png

按照图片设置即可。SMTP User和Sender Address要一致,不然会报 553 Mail from must equal authorized user

发送测试邮件,成功即可。

新建代码仓库并配置构建

点开Projects,点击+号Add Project
image.png
image.png
填写项目信息后,仓库就创建好了,接着我们上传代码。
image.png
这里为了示范,我就不上传实际的代码了,直接通过AddFile在线创建了一个README.md文件。和Github一样,项目主页会自动展示README中的信息。
image.png
可以看到,在添加了文件之后,OneDev会提醒你可以为项目添加构建支持文件 .onedev-buildspec.yml了。这个文件是一个yml文件,提供了和gitlab-ci.yml类似的功能,可以配置项目的CICD发布流程。

点击add .onedev-buildspec.yml,就能看见配置页面了。

image.png
没错,OneDev提供了一套前端UI来辅助我们进行配置,并且在需要使用到系统变量的地方会给予提示,可以说是非常人性化了。这里我们就来尝试一下。
image.png

onedev的构建需要你指定一个用于构建项目的镜像,在这个job中,所有的命令都会在这个镜像中进行。比如我们想使用maven进行打包,就可以在这里填入maven:latest,又比如我们想在这个job里打包镜像,就可以填入docker:19.03.5 这种利用docker in docker,能够调用宿主机的docker指令的镜像。当然我个人更推荐根据自己的需求,自己构建一个用于打包发布的工具镜像,比如maven,我们可能会需要使用自己的镜像源,这个时候就可以自己写好maven的配置文件然后构建自己专属的打包镜像,在onedev种使用即可。

这里我用openjdk:11.0.9-jdk举个例子

image.png

点击运行

image.png

可以看到输出了我们代码仓库的文件以及容器中java的版本。

小Tips:实际上工作空间中的仓库代码是通过Retrieve Source设置导入的,这个选项默认开启,并且还提供了从其他地方clone代码的功能。(比如我们可以在github上开源代码,然后通过WebHook触发构建,同步到OneDev里面,然后再创建一个job,当代码合并到dev的时候通过git镜像推送回github,以此达到一个同步的功能。
image.png

开启推送

之前我们配置了邮件推送,那么要怎么样使用它呢?这个设置有点隐秘,实际上它在搜索框里面。
image.png
点击Show Saved Queries,可以看到官方为我们预设了一些搜索筛选的情景,边上有个小按钮,点击就可以订阅相应的提醒啦。
image.png
这里我订阅了Running,然后重新启动了构建#1,可以看到成功的收到了邮件提醒。
image.png
当然你也可以自定义场景,OneDev为你提供了一套简易的语法,并且提供了丰富的提示,使得你可以快速的自定义自己的提醒场景
image.png

结语

今天就分享这写使用心得,可以看出来,OneDev是一个很完善、易上手的devOps实践平台,而且非常轻量级,很适合个人开发者。OneDev的中文资料目前仅有作者Shen Robin的五六篇教程,并且Shen Robin很乐于回答我的问题,对我在OneDev的探索中帮助很大,我之后也会继续分享一些使用心得,非常感谢OneDev的开发者为我们带来这么棒的开源项目!

Q.E.D.


重度玲音爱好者
Java后端码畜
略懂前端