Cane's Blog

Cane

【Drone】Drone + GOGS 自动CI/CD

188
2022-11-30

Drone 安装

version: "3.5"
services:
  drone-server:
    image: drone/drone:latest
    container_name: drone
    ports:
      - "9999:80"
    volumes:
      - /home/drone:/data
    restart: always
    environment:
      - DRONE_LOGS_TRACE=true
      - DRONE_LOGS_DEBUG=true
      - DRONE_AGENTS_ENABLED=true
      - DRONE_SERVER_HOST=xxxx:9999
      - DRONE_SERVER_PROTO=http
      - DRONE_RPC_SECRET=drone-passwd
      - DRONE_GIT_ALWAYS_AUTH=true
      - DRONE_GOGS_SERVER=https://*.com
      - DRONE_USER_CREATE=username:admin,admin:true
  drone-agent:
    image: drone/drone-runner-docker:latest
    container_name: agent
    restart: always
    depends_on:
      - drone-server
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - DRONE_RPC_PROTO=http
      - DRONE_RPC_HOST=drone-server
      - DRONE_RPC_SECRET=drone-passwd

注意

  1. 「DRONE_SERVER_HOST」,这个写 Drone 的地址

  2. 「DRONE_RPC_SECRET」,这个要与 drone-agent 中的「DRONE_RPC_SECRET」值一致

    上例中的 「drone-agent」是一个 docker-runner,drone 有很多种不同类型的 runner,按需配置,详见:Drone Runner List

  1. 「DRONE_GIT_ALWAYS_AUTH」这个不设置的话,在后面 clone 仓库可能会出现权限验证等错误

  2. 「DRONE_USER_CREATE」设置 gogs 登录的管理员账户

登录

访问:xxxx:9999 进行登录,输入 gogs 帐号密码进行登录

2022-11-30 16-11-57.png

如果登录失败,提示 「Forbidden 」、「Unauthorized」

  1. 一般是多次部署导致的,在「gogs - 用户配置 - 授权应用」中删除 drone 的授权,重新登录既可

    2022-11-30 16-16-04.png

    生成新的令牌,然后将 ID、TOKEN 分别填在部署时候的「未验证是否可行
    「DRONE_GITEA_SERVER」: gogs 服务器的 url 地址
    「DRONE_GITEA_CLIENT_ID」:id
    「DRONE_GITEA_CLIENT_SECRET」:token

  2. 检查部署的时候,是否正确设置了「DRONE_USER_CREATE=username:admin,admin:true」(username 后跟gogs 的用户)

登录成功,可以看到该账户下的所有仓库

2022-11-30 16-19-31.pngDemo

Docker镜像自动构建

  1. 选择要操作的仓库,激活

    2022-11-30 16-21-18.png

  1. 如果镜像涉及到 Volumes 的操作,打开 truested 选项(建议打开),然后保存 2022-11-30 16-22-30.png

    Configuration 的名字即仓库里 drone pipeline 的名称,可以修改,但是建议保持默认

  2. 如果在 CI/CD 的过程中涉及一些敏感信息/密钥(比如构建好镜像好,上传到指定仓库,需要输入帐号密码),可以在 Secret 界面进行配置

    2022-11-30 16-25-30.pngSecret 的使用,详见 [「Drone - Secrets」](https://docs.drone.io/secret/)

    方法一

    kind: pipeline
    name: default
    steps:
    - name: test
      image: busybox
      commands:
      - echo "Pypi Account Test"
      - echo $USERNAME, $PASSWORD
      environment:
        USERNAME:
          from_secret: pypiuser
        PASSWORD:
          from_secret: pypipasswd

    方法二

    kind: pipeline
    name: default
    
    steps:
    - name: build
      image: plugins/docker
      settings:
        repo: octocat/hello-world
        username:
          from_secret: docker_username
        password:
          from_secret: docker_password
      commands:
        - echo "You can call the secrets like this examples below."
        - echo $USERNAME
        - echo $PASSWORD
        - echo "In both cases, and for security reasons, you will see asteriks '*******' instead the value under the echo command."
  3. 查看 Webhook

    按照上面的步骤配置,如果一切顺利的话,在 gogs 仓库的「仓库配置 - 管理Web钩子」应该可以看到刚刚配置好的,webhook

    2022-11-30 16-35-36.png

  4. 编写 pipeline 文件: 「Pipline Document

       kind: pipeline # 默认为 pipeline
    type: docker
    name: deployment # 构建文件名称
    
    steps: # 数组结构,流水线化的构建步骤
    - name: buiild
      pull: if-not-exists # 如果镜像不存在则拉取,免去每次都要重新下载
      image: plugins/docker
      settings:
        dockerfile: Dockerfile  # Dockerfile 在项目中的位置
        tags:
         - latest # 生成镜像后的Tag标签

    关于 plugins/docker 的具体可选参数和设置,详见:「Drone - Plugins - Docker