• Gogs + Drone 实现CI/CD(CI)


      本文通过docker-compose方式安装运行drone,先将drone的server和agent镜像拉取到本地,这样docker-compose脚本执行速度会快一点。当然,不是必须先拉取drone镜像,完全可以直接用docker-compose执行编写好的脚本。

      拉取drone镜像

    sudo docker pull drone/drone:1.0.0-rc.5
    
    sudo docker pull drone/agent:1.0.0-rc.5

      安装docker-compose,已安装的话可跳过。

    sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose

      需要创建一个目录,在此目录下编写docker-compose.yml文件,然后运行docker-compose命令

    mkdir /etc/drone
    vi /etc/drone/docker-compose.yml

       docker-compose.yml内容如下:

    version: '3'
    
    services:
      drone-server:
        image: drone/drone:1.0.0-rc.5
        ports:
          - 10081:80
        volumes:
          - /var/lib/drone:/var/lib/drone
          - /var/run/docker.sock:/var/run/docker.sock restart: always env_file:
    - /etc/drone/server.env drone-agent: image: drone/agent:1.0.0-rc.5 command: agent depends_on: - drone-server volumes: - /var/run/docker.sock:/var/run/docker.sock restart: always env_file: - /etc/drone/agent.env

      生成drone和agent之间通信需要的密钥

    LC_ALL=C </dev/urandom tr -dc A-Za-z0-9 | head -c 65 && echo

      此次生成的密钥内容为:MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM

      在/etc/drone/目录创建文件server.env,保存如下内容:

    DRONE_RPC_SECRET=MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM
    DRONE_SERVER_HOST=192.168.1.137:10081
    DRONE_SERVER_PROTO=http
    DRONE_OPEN=true
    DRONE_GOGS=true
    DRONE_GOGS_SERVER=http://192.168.1.137:10080
    DRONE_PROVIDER=gogs
    DRONE_LOGS_TRACE=true
    DRONE_LOGS_DEBUG=true

      agent.env内容如下:

    DRONE_RPC_SECRET=MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM
    DRONE_RPC_SERVER=http://192.168.1.137:10081
    DRONE_LOGS_TRACE=true
    DRONE_LOGS_DEBUG=true

      通过命令启动drone

    docker-compose up -d

      本地访问drone服务器地址http://192.168.1.137:10081,用gogs账号登录drone

       登录失败,gogs服务器connection refused,应该是端口问题,那就开放gogs端口。请确保gogs已经启动。

    sudo firewall-cmd --zone=public --add-port=10080/tcp --permanent
    sudo firewall-cmd --reload

      登录之后在drone面板先同步gogs代码仓库,选择一个仓库,在设置选项填写之前生成的密钥,保存设置之后,gogs仓库会生成一个web hook

      由于之前已经配置好了gogs,进入项目仓库,更新web钩子,将推送地址加上drone服务器端口号

      更新web hook之后,点击下面的测试推送,如果失败提示connection refused的话,就开放drone的10081端口。

      为这个空仓库新增.drone.yml文件

    kind: pipeline
    name: greeting
    
    steps:
    - name: en
      image: alpine
      commands:
      - echo hello
      - echo world
    
    - name: es
      image: alpine
      commands:
      - echo hola
      - echo mundo
    
    - name: fr
      image: alpine
      commands:
      - echo bonjour
      - echo monde
    
    - name: zh
      image: alpine
      commands:
      - echo 你好
      - echo 世界

      提交到gogs仓库后,自动触发web hook事件,drone会执行yml文件中的脚本

      然鹅构建却一直pending...

      这个drone.yml脚本比较简单,只是简单的打印消息,然而不解的是不知道为什么没有输出。不得其解就继续翻官方文档和各种issue以及网络教程,没什么头绪就把配置项尽可能写全一点,发现原来是数据库配置项的原因,drone默认使用sqlite做数据持久化,但是文档也写明说不需要额外的配置,但是按照目前的配置,虽然web hook可以触发,但是pipeline任务一直处于pending状态,加上数据库配置项,终于有了动静。

      虽然官方强烈建议使用postgres而不是mysql,但是既然drone支持使用mysql,而且我安装的就是mysql,那当然是使用mysql配置项了。drone还强烈建议使用gitea而不是gogs呢。在server.env中加上下面这两行配置,mysql账号密码和ip改成自己的。

    DRONE_DATABASE_DRIVER=mysql
    DRONE_DATABASE_DATASOURCE=root:password@tcp(1.2.3.4:3306)/drone?parseTime=true

      也可以使用下面的配置,会在配置路径下产生sqlite脚本,drone产生的数据会保存在这个脚本中。

    - DRONE_DATABASE_DATASOURCE=/var/lib/drone/drone.sqlite
    - DRONE_DATABASE_DRIVER=sqlite3

      重新执行一下pipeline脚本,终于成功。

      以上的docker-compose.yml也可以整合为一个文件,贴一下内容,可供参考

    version: '3'
    services:
      drone-server:
        image: drone/drone:1.0.0-rc.5
        ports:
          - 10081:80
        volumes:
          - ./drone:/var/lib/drone/
          - /var/run/docker.sock:/var/run/docker.sock
        restart: always
        environment:
          - DRONE_OPEN=true
          - DRONE_SERVER_HOST=192.168.1.137:10081
          - DRONE_SERVER_PROTO=http
          - DRONE_LOGS_TRACE=true
          - DRONE_LOGS_DEBUG=true
          - DRONE_GOGS=true
          - DRONE_GOGS_SERVER=http://192.168.1.137:10080
          - DRONE_PROVIDER=gogs
          - DRONE_DATABASE_DATASOURCE=root:your_password@tcp(192.168.1.137:3306)/drone?parseTime=true
          - DRONE_DATABASE_DRIVER=mysql
          - DRONE_RPC_SECRET=MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM
      drone-agent:
        image: drone/agent:1.0.0-rc.5
        depends_on:
          - drone-server
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
        restart: always
        environment:
          - DRONE_RPC_SERVER=http://192.168.1.137:10081
          - DRONE_RPC_SECRET=MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM
          - DRONE_LOGS_TRACE=true
          - DRONE_LOGS_DEBUG=true

      记录一下可能会遇到的问题:

      1、web hook可以正常推送消息,而pipeline脚本一直pending,检查drone-server的数据库配置项;

      2、以非root用户运行,可能会遇到docker权限问题,需要将当前用户加入到docker用户组,避免重新登录的话可以su root,然后再su当前用户;

      3、pipeline脚本执行的时候抛出docker权限异常,需要将drone-agent挂载docker执行目录。

      通过此番操作,已经实现了持续集成,要实现持续交付,关键在于.drone.yml的编写,Deployment部分待下回推送代码之后再做分享。

      顺便说一下drone的文档,1.0之前的文档提供的安装方式是docker compose,有中文文档;1.0之后的文档提供的安装方式的使用docker,只有英文版,不过好像断层了,没有提供1.0版本之前的文档链接。

  • 相关阅读:
    软工假期预习作业1
    2号团队-团队任务4:每日立会(汇总)
    2号团队-团队任务4:每日立会(2018-11-26)
    2号团队-团队任务4:每日立会(2018-11-27)
    第二小组首次会议记录
    第二次作业
    自我介绍+课后作业1:准备
    Linux安装redis
    Redis面试题
    Mybatis面试题
  • 原文地址:https://www.cnblogs.com/fallTakeMan/p/11866584.html
Copyright © 2020-2023  润新知