Gogs私有git仓库 + Drone构建CI/CD
Gogs私有git仓库 + Drone构建CI/CD平台
前提
- 安装有docker、docker-compose
- 安装有git
- 安装有mysql
使用docker-compose安装gogs、Drone(建议先看完文章)
# 拉取代码:
git clone https://github.com/alicfeng/gogs-drone-docker.git
## 在 .drone.yml中,把 - DRONE_USER_CREATE=username:${DRONE_ADMIN},admin:true
## 改为 DRONE_USER_CREATE=username:admin,admin:true
## 不写一个用户的话,会导致无法触发自动构建任务。
# 进入项目目录,然后使用docker-compose运行
cd gogs-drone-docker && docker-compose up -d
ps: 安装报错解决:
error:
ERROR: Network ev-dev-network declared as external, but could not be found. Please create the network manually using `docker network create ev-dev-network` and try again.
执行命令:
docker network create ev-dev-network
初始化gogs
参照文章:http://www.mdslq.cn/archives/1a623683.html
按照里面的图进行gogs初始化
配置Drone自动构建Spring boot项目
拉取项目代码
地址:https://github.com/Famine-Life/Springboot-helloworld-drone
编写 .rone.yml 文件,用来构建自动构建任务
# drone 本地构建
kind: pipeline
type: docker
name: MyHelloWorld
# drone构建步骤
steps:
# 1.maven打包
- name: maven compile
pull: if-not-exists
image: maven:ibmjava-alpine
volumes:
# maven构建缓存
- name: cache
path: /root/.m2
# 挂载宿主机的目录
- name: data
path: /home
commands:
# 开始打包maven工程
- ls
# - cd springboot-helloworld
- mvn clean package -Dmaven.test.skip=true
# 将打包后的文件复制到宿主机映射目录
- cp target/*.jar /home
- cp Dockerfile /home
# 2.使用ssh访问主机制作镜像并运行
- name: ssh commands
pull: if-not-exists
image: appleboy/drone-ssh:1.5.7
settings:
host: 60.205.254.71
username: root
password:
# 从drone仓库配置中秘密空间读取密码
from_secret: ssh_password
port: 22
# 注意把下面的 springboot-helloworld 改成自己项目mvn pkg会生成的jar包名称
script:
- echo =======暂停容器=======
- docker stop `docker ps -a | grep springboot-helloworld | awk '{print $1}' `
- echo =======暂停旧容器和镜像=======
- docker rm -f `docker ps -a | grep springboot-helloworld | awk '{print $1}' `
- docker rmi `docker images | grep springboot-helloworld | awk '{print $3}' `
- echo =======开始构建新镜像=======
- cd /data/drone/helloDemo
- docker build -t springboot-helloworld:latest .
- echo =======镜像列表,如果服务器镜像太多建议注释=======
- docker images
- echo =======开始部署应用=======
- docker run -d -p 8080:8080 --name springboot-helloworld springboot-helloworld:latest
- echo =======清理构建文件,建议保留=======
#- rm -rf *
- echo =======部署成功=======
# 3.钉钉通知 (注释掉,没测试过)
# - name: dingTalk notification
# pull: if-not-exists
# image: guoxudongdocker/drone-dingtalk:latest
# settings:
# token:
# from_secret: dingtalk_token
# type: markdown
# message_color: true
# message_pic: true
# sha_link: true
# when:
# status: [failure, success]
# 挂载的主机卷,可以映射到docker容器中
volumes:
# maven构建缓存
- name: cache
host:
# path: /tmp/cache/.m2
path: /var/lib/cache
# maven构建后与宿主机通信的共享目录
- name: data
host:
path: /data/drone/helloDemo
# drone执行触发器
trigger:
branch:
- master
注意事项:
- 在drone项目中配置,配置ssh_passworld(也就是服务器的远程连接密码。drone官网也有提供配置ssh key的配置)
-
把host: 60.205.254.71改成你的ip
-
配置文件中的路径:/var/lib/cache 、/data/drone/helloDemo,drone竟然不会自动构建!!,假设我们的服务器该路径不存在,它会报错 (观察第四点的log日志看出来的)...就无语 : P ,自行手动创建,或者直接写存在的路径。
-
最值得注意的一点:我发现ssh帮我们执行shell的时候,有些构建命令出错、drone是不会提示执行失败的。它有时候有不停的重复运行、或者也返回执行成功的标识,就很离谱。
-
如果push代码后,并没有生成构建任务,检查两点:
(1)在git仓库设置中的管理web钩子,可能会没有填写ip,点击修改加上。并且点击进去可以推送测试
(2)检查drone项目的Trusted是否勾选
推送测试
demo搭建、运行完成后,下面在项目代码中添加一个接口作为一个持续集成的测试。
在原有的 /hello
下面,加上/test
@GetMapping("/test")
public String test() {
return "Hello Drone!";
}
然后,push到gogs的git库:git push
构建信息:
-
不小心push了不需要的idea文件,clone代码用了41秒
-
maven编译由于java文件少、用了7秒
-
build镜像到运行容器,用了13秒
(以上用时没有什么意义,单纯无聊了)
感受
-
因为安装gogs、drone,用的docker,所以,当安装失败时候完全可以删库重来。
-
其次,配置自动构建任务只需要编写yml文件,所有的环境都从docker镜像来,比起jenkins要配置各种东西,简直不要太舒服。
-
最后一点,目前我没有搭建有docker私有仓库,如果公司有搭建私有仓,那么构建镜像push到私有仓,剩下的就交给运维吧。。
个人认为,Drone很简便、并且也有超高的自由度。