练涛

Gogs私有git仓库 + Drone构建CI/CD

Gogs私有git仓库 + Drone构建CI/CD平台

参考便捷搭建教程:https://github.com/alicfeng/gogs_drone_docker

前提

  • 安装有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

注意事项:

  1. 在drone项目中配置,配置ssh_passworld(也就是服务器的远程连接密码。drone官网也有提供配置ssh key的配置)

  1. 把host: 60.205.254.71改成你的ip

  2. 配置文件中的路径:/var/lib/cache 、/data/drone/helloDemo,drone竟然不会自动构建!!,假设我们的服务器该路径不存在,它会报错 (观察第四点的log日志看出来的)...就无语 : P ,自行手动创建,或者直接写存在的路径。

  3. 最值得注意的一点:我发现ssh帮我们执行shell的时候,有些构建命令出错、drone是不会提示执行失败的。它有时候有不停的重复运行、或者也返回执行成功的标识,就很离谱。

  4. 如果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秒

(以上用时没有什么意义,单纯无聊了)

感受

  1. 因为安装gogs、drone,用的docker,所以,当安装失败时候完全可以删库重来。

  2. 其次,配置自动构建任务只需要编写yml文件,所有的环境都从docker镜像来,比起jenkins要配置各种东西,简直不要太舒服。

  3. 最后一点,目前我没有搭建有docker私有仓库,如果公司有搭建私有仓,那么构建镜像push到私有仓,剩下的就交给运维吧。。

个人认为,Drone很简便、并且也有超高的自由度。

posted @ 2021-04-18 09:00  练涛  阅读(1091)  评论(0编辑  收藏  举报