【Drone-初识篇】Drone借助GitLab构建CICD环境、以及编写 .drone.yaml 流水线

简介: 【Drone-初识篇】Drone借助GitLab构建CICD环境、以及编写 .drone.yaml 流水线

概述

drone是一个持续集成化工具,能够使用强大的云原生管道引擎自动化他们的构建、测试和发布工作流;

简单来说:类似写shell脚本,只是脚本内容不一样;

其他持续集成工具,如:jenkins、gitlab-cicd;

环境准备

  • linux系统
  • docker

动手操作

容器部署gitlab

gitlab详细安装步骤,点击这里;本次使用的gitlab-ce是docker hub仓库,2022年5月最新版:

  • 如果hostname没做DNS域名解析,请使用IP地址(不写端口,默认80)。例:192.168.200.30
    注意:hostname不能包含端口,否则gitlab启动不起来;
export GITLAB_HOME=/mydata/gitlab
docker run --detach \
  --hostname "192.168.200.30" \
  --publish 1443:443 --publish 80:80 --publish 1022:22 \
  --name gitlab \
  --restart always \
  --volume $GITLAB_HOME/config:/etc/gitlab \
  --volume $GITLAB_HOME/logs:/var/log/gitlab \
  --volume $GITLAB_HOME/data:/var/opt/gitlab \
  gitlab/gitlab-ce:latest
  • 报错信息(后面的步骤):下图因为gitlab的hostname填写的域名(gitlab.admin.com),结果Drone流水线clone(克隆)代码时连接报错:

上图的问题除了修改gitlab主机名(hostname)之外,还可以修改drone-runner默认clone(克隆)地址解决。如下代码(这里看不懂没关系,请继续往下看后面会解释):

kind: pipeline
type: docker
name: default
clone:
  disable: true  #禁用默认克隆
steps:
- name: clone-test
  image: alpine/git
  pull: if-not-exists  # 如果在本地缓存中找不到图像,则仅拉取图像
  commands:
  - git clone http://192.168.200.30/root/test.git  #自定义克隆地址
  - git version
- name: greeting
  image: alpine
  commands:
  - echo hello
  - echo world
[root@master drone]# docker exec -it gitlab bash
root@192:/# cat /etc/gitlab/initial_root_password |grep Password:
Password: RUb+s6cnRsJk7S7Mg785nHewbwzoL4Cblfk/nnGKWZA=
  • 创建 OAuth 应用程序( Application)
    创建一个 GitLab OAuth 应用程序。Consumer Key 和 Consumer Secret 用于授权Drone访问 GitLab 资源
    注意:这里我提前在gitlab创建好了test仓库(空仓库),用于我们下面的演示;

  • Application URL地址是Drone服务地址后必须跟一个/login。例:http://192.168.200.30:82/login

  • Application生成的Consumer ID和 Consumer Secret,下面我们会用于安装Drone,gitlab授权drone:

容器部署Drone

Drone部署需要安装docker-server(Drone 与流行的源代码控制管理提供商无缝集成) WEB界面和docker-runner守护进程执行器

  • 创建一个共享密钥,用于drone-runner和drone-server之间的通信:
[root@master drone]# openssl rand -hex 16
8172cd9155d16593d4f6a445b70e2d6e
  • 部署drone-server:
docker run \
  --volume=/var/lib/drone:/data \
  --env=DRONE_GITLAB_SERVER=http://192.168.200.30/ \ #GitLab 服务器 url,默认https://github.com
  --env=DRONE_GITLAB_CLIENT_ID=56ef91f20270b6f945f722e2b93e2e9eacad65f0b5edcad997d4842df47cc5a8 \ #GitLab oauth 客户端 ID(必填项)
  --env=DRONE_GITLAB_CLIENT_SECRET=159ab07250d7b02f171408a1a6e21f506295b33b5174c211b7dcb59b548e05a3 \ #GitLab oauth 客户端密码 (必填项)
  --env=DRONE_RPC_SECRET=8172cd9155d16593d4f6a445b70e2d6e\  #验证服务器和运行器之间的 rpc 连接(drone-server和drone-runner连接时必填项)
  --env=DRONE_SERVER_HOST=192.168.200.30:82 \ #供drone服务主机名或 IP 地址 (必填项)
  --env=DRONE_SERVER_PROTO=http \  #drone服务使用的协议 (必填项)
  --publish=82:80 \
  --publish=443:443 \
  --restart=always \
  --detach=true \
  --name=drone \
  --env=DRONE_USER_CREATE=username:root,admin:true \  #Drone管理员用户创建 
  drone/drone:2
* drone启动参数很多,下面解释下:
  + DRONE_GITLAB_SERVER: GitLab 服务器 url,默认https://github.com
  + DRONE_GITLAB_CLIENT_ID: GitLab oauth 客户端 ID(必填项)
  + DRONE_GITLAB_CLIENT_SECRET: GitLab oauth 客户端密码 (必填项)
  + DRONE_RPC_SECRET: 验证服务器和运行器之间的 rpc 连接(drone-server和drone-runner连接时必填项)
  + DRONE_SERVER_HOST: 提供drone服务主机名或 IP 地址 (必填项)
  + DRONE_SERVER_PROTO: drone服务使用的协议 (必填项)
  + DRONE_USER_CREATE: Drone管理员用户创建
  • 部署drone-runner
docker run --detach \  
  --volume=/var/run/docker.sock:/var/run/docker.sock \
  --env=DRONE_RPC_PROTO=http \  #用于连接 Drone 服务器的协议
  --env=DRONE_RPC_HOST=192.168.200.30:82 \ #提供 Drone 服务器的主机名
  --env=DRONE_RPC_SECRET=8172cd9155d16593d4f6a445b70e2d6e \  #用于向 Drone 服务器进行身份验证的共享密钥
  --env=DRONE_RUNNER_CAPACITY=2 \   #限制运行器可以执行的并发管道的数量
  --env=DRONE_RUNNER_NAME=test-runner \   #设置runner的名字
  --publish=3000:3000 \
  --restart=always \
  --name=runner \
  drone/drone-runner-docker:1
* drone-runner启动参数很多,下面解释下:
  + DRONE_RPC_PROTO: 用于连接 Drone 服务器的协议
  + DRONE_RPC_HOST: 提供 Drone 服务器的主机名
  + DRONE_RPC_SECRET: 用于向 Drone 服务器进行身份验证的共享密钥
  + DRONE_RUNNER_CAPACITY: 限制运行器可以执行的并发管道的数量
  + DRONE_RUNNER_NAME: 设置runner的名字
  • 验证drone-runner是否连接上drone-server(successfully pinged the remote server):
[root@master drone]# docker logs -ft runner
2022-05-10T05:21:02.637256271Z time="2022-05-10T05:21:02Z" level=info msg="starting the server" addr=":3000"
2022-05-10T05:21:02.640121666Z time="2022-05-10T05:21:02Z" level=info msg="successfully pinged the remote server"
2022-05-10T05:21:02.640157924Z time="2022-05-10T05:21:02Z" level=info msg="polling the remote server" arch=amd64 capacity=2 endpoint="http://192.168.200.30:82" kind=pipeline os=linux type=docker
  • 浏览器访问drone-server Web界面(http://192.168.200.30:82),点击继续:

  • 点解继续后,会跳转到这个Application URL地址(http://192.168.200.30:82/login)gitlab给Drone(Application)授权:

  • 注册drone用户:

  • 点击Drone右上角SYNC(同步),进入我们的test仓库下激活存储库,发现错误(这个错误我们需要打开gitlab的出入站请求

  • 回到gitlab,点击Admin-->settings

  • 打开出站请求,并打开允许web hooks(挂钩) 和服务向本地网络发出请求

  • 回到drone,test仓库再一次激活(成功),并开启Trusted特权容器(docker-runner在使用docker执行器时,类似使用root权限)

注意:这里还有一个问题,如果出现没有Trusted选项的情况,需要在启动运行drone-server服务是添加:--env=DRONE_USER_CREATE=username:root,admin:true

流水线脚本编写.drone.yml

  • 在gitlab依次点击,创建.drone.yml文件:
  • .drone.yml文件内容(写的比较简单,主要了解流水线操作流程),如下:
kind: pipeline
type: docker
name: default
steps:
- name: greeting
  image: alpine
  commands:
  - echo hello
  - echo world

.drone.yml文件属性解释:

  • kind:定义了对象的种类,此示例定义了一个pipeline(管道)对象;
  • type:定义pipeline(管道)的类型,此示例定义了一个 Docker 管道,其中每个管道步骤都在 Docker 容器内执行;
  • name:定义了pipeline(管道)的名称;
  • steps:定义了一系列串行执行的pipeline(管道)步骤,出现一个步骤失败,立即退出;
    * name:定义管道步骤的名称;
    * image:定义了一个执行 shell 命令的 Docker 镜像;
    * commands:在docker容器内执行shell命令;

流水线触发

  • 在自己项目下(test)点击:settings-->webhooks:
  • 这里不需要再次创建webhooks(挂钩),Drone连接后会自动创建一个默认的webhooks
  • 回到drone会看到,我们编写的流水线文件被自动触发(之后gitlab仓库代码更新或上传新代码都会自动触发).drone.yml:
  • 点击我们的流水线,可以查看流水线详细步骤、步骤的状态和步骤的logs

总结+遇到的问题

我这里的.drone.yml文件写的比较简单,主要时了解过程入门。如果需要练习可以试着部署自己的项目;

最后请各位注意三个我在学习gitlab+drone遇到的问题

下列小括号‘()’中是解决方法;

  • clone克隆地址连接不上(修改默认clone克隆)
  • 没有Trusted选项,启动drone-server时添加(--env=DRONE_USER_CREATE=username:root,admin:true)
  • .drone.yml文件中sed命令报错:sed: -e expression #1, char 34: unknown option to s (改成感叹号!或者| 分割,如:sed -i ‘s! 源内容 ! 替换内容 !g’ )

参考资料

https://docs.drone.io/


目录
相关文章
|
9天前
|
运维 Devops Shell
云效产品使用报错问题之流水线通过控制台创建的用yaml实现失败如何解决
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
9天前
|
JSON 运维 Kubernetes
云效产品使用报错问题之流水线中配置了AppStack,构建时下载的制品内容为json字符串,如何解决
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
9天前
|
敏捷开发 安全 Java
云效产品使用常见问题之不知道自定义镜像构建是作用在整个流水线,还是只作用在一个卡片如何解决
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
18天前
无缝构建与部署:GitLab CI/CD首秀的实战攻略
无缝构建与部署:GitLab CI/CD首秀的实战攻略
38 0
无缝构建与部署:GitLab CI/CD首秀的实战攻略
|
18天前
|
Linux Go iOS开发
GitLab Runner全解析:深入了解构建、测试和部署的关键执行者
GitLab Runner全解析:深入了解构建、测试和部署的关键执行者
32 0
GitLab Runner全解析:深入了解构建、测试和部署的关键执行者
|
18天前
|
存储 持续交付 API
GitLab CI/CD简介:构建持续集成与持续交付的全方位指南
GitLab CI/CD简介:构建持续集成与持续交付的全方位指南
31 0
GitLab CI/CD简介:构建持续集成与持续交付的全方位指南
|
29天前
|
jenkins 持续交付
Jenkins构建简单流水线
Jenkins构建简单流水线
12 0
|
2月前
|
Java 测试技术 API
云效流水线构建gradle项目失败提示gradle版本过低如何解决
云效(CloudEfficiency)是阿里云提供的一套软件研发效能平台,旨在通过工程效能、项目管理、质量保障等工具与服务,帮助企业提高软件研发的效率和质量。本合集是云效使用中可能遇到的一些常见问题及其答案的汇总。
36 0
|
2月前
|
NoSQL 关系型数据库 MySQL
Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)
Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)
233 0
|
3月前
|
JavaScript Java API
云效问题之流水线使用npm制品仓库构建拉取依赖特别慢如何解决
云效仓库是阿里云提供的代码托管和版本控制服务,支持Git等多种版本管理工具;本合集聚焦于云效仓库的使用技巧、团队协作流程以及常见问题解答,旨在帮助开发者更高效地进行代码管理和协作开发。
116 0

热门文章

最新文章