GitLab基于Drone搭建持续集成(CI/CD)
本文介绍了如何为 Gitee 安装 Drone 服务器。服务器打包为在 DockerHub 上分发的最小 Docker 映像。
1. 准备工作
创建OAuth应用
创建 GitLab OAuth 应用。Consumer Key 和 Consumer Secret 用于授权访问极狐GitLab 资源。
ps:授权回调 URL 必须与以下格式和路径匹配,并且必须使用确切的服务器方案和主机。
2. 创建共享密钥
创建共享密钥以验证运行程序与中央 Drone 服务器之间的通信。
您可以使用 openssl 生成共享密钥:openssl rand -hex 16
3. 部署runner :
在服务创建一个文件夹,可以命名为drone,里面放docker-compose.yml和.env文件。文件内容如下:
docker-compose配置文件:
version: '3'
services:
drone-server:
image: drone/drone:2
ports:
- 8280:80
- 443:443
volumes:
- /var/lib/drone:/data
- /root/.ssh:/root/.ssh/
restart: always
environment:
- DRONE_GITLAB_CLIENT_ID=${DRONE_GITHUB_CLIENT_ID} #您的 GitLab oauth 客户端 ID
- DRONE_GITLAB_CLIENT_SECRET=${DRONE_GITHUB_CLIENT_SECRET} #GitLab oauth 客户端密钥
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET} #提供在上一步中生成的共享密钥。这用于验证服务器和 runner 之间的 rpc 连接。
- DRONE_SERVER_HOST=${DRONE_SERVER_HOST} 您的外部主机名或 IP 地址。如果使用 IP 地址,则可以包含端口。
- DRONE_SERVER_PROTO=http #外部协议方案。此值应设置为 http 或 https。如果您配置 ssl 或 acme,则此字段默认为 https。
- DRONE_GITLAB_SERVER=http://gitlab.com # 您的gitlab服务器URL
- DRONE_USER_CREATE=username:YPF,admin:true # 管理员账户
drone-runner:
image: drone/drone-runner-docker:latest
restart: always
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /root/.ssh/:/root/.ssh/
environment:
- DRONE_RPC_PROTO=http
- DRONE_RPC_HOST=${DRONE_SERVER_HOST}
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
- DRONE_RUNNER_CAPACITY=2
- DRONE_RUNNER_NAME=${HOSTNAME}
.env:
DRONE_GITHUB_CLIENT_ID=xxx
DRONE_GITHUB_CLIENT_SECRET=xxx
DRONE_RPC_SECRET=xxx
DRONE_SERVER_HOST=192.168.xx.xx:8280
拉取镜像并部署runner,运行命令:docker-compose up -d
直接拉取docker镜像,一般情况下都会报错、超时拉取不到
restore-cache: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
解决办法
配置国内docker镜像源:
{
"registry-mirrors": [
"https://yt7qrop4.mirror.aliyuncs.com",
"https://ccr.ccs.tencentyun.com",
"https://2a6bf1988cb6428c877f723ec7530dbc.mirror.swr.myhuaweicloud.com",
"https://docker.m.daocloud.io",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://your_preferred_mirror",
"https://dockerhub.icu",
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc"
]
}
上面为加速器地址,需要把下面代码放到/etc/docker/daemon.json这个文件内(没有这个文件就创建一个)
换源之后执行以下指令: systemctl daemon-reload
重新加载配置 systemctl restart docker
重新启动docker
验证
运行docker ps可以看到以下容器:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8b1704182e38 drone/drone-runner-docker:latest "/bin/drone-runner-d…" 3 months ago Up About a minute 3000/tcp drone-drone-runner-1
69cecad7b541 drone/drone:2 "/bin/drone-server" 3 months ago Up About a minute 0.0.0.0:443->443/tcp, 0.0.0.0:8280->80/tcp drone-drone-server-1
运行起来后,浏览器输入http://192.168.xx.xx:8280/就可以访问到了。
点击CONTINUE按钮会跳转到gitlab的授权页面,授权完之后会跳回来,注册一下。
注册完进去就可以看见我们gitlab上面所有的仓库了。
选一个仓库进去,点击激活按钮activate,激活成功后,会在gitlab仓库里面添加一个WebHooks,可以到gitlab去看看。
setting里面的Secrets可以设置一些敏感的参数,比如密码,密钥那些。
设置好之后可以在pipeline里面用from_secret语法使用。
4. Docker Pipelines
这一步是配置构建流水线了。
在git仓库根目录添加一个文件.drone.yml,在这里面定义流水线步骤。
kind: pipeline
type: docker
name: front-web-publish
steps:
# 加载依赖
- name: restore-cache
image: drillster/drone-volume-cache
volumes:
- name: cache
path: /drone/src/node_modules
settings:
restore: true
- name: build-project
image: node:lts-slim
privileged: true
volumes: #将容器内目录挂载到宿主机
- name: cache
path: /drone/src/node_modules
- name: build-html
path: /html
commands:
- |
if [ -f /html/yarn.lock ]; then
cp -f /html/yarn.lock ./
yarn install
else
yarn install
fi
- npm run build
- |
if [ "$(ls -A /html)" ]; then
rm -rf /html/*
fi
- cp yarn.lock /html/yarn.lock
- cp -r ./dist /html/forward
- cp ./common/shell/Dockerfile /html/Dockerfile
- cp ./common/shell/build.sh /html/build.sh
- tar -zcvf ./front-web.tar.gz /html/
- cp -rf ./front-web.tar.gz /html/front-web.tar.gz
- name: scp-files # 上传文件步骤
image: appleboy/drone-scp
settings:
# 服务器地址, 账号, 密码
host: # 不使用secrets, 明文
from_secret: '${DRONE_COMMIT_BRANCH}_host'
username: root
password:
from_secret: '${DRONE_COMMIT_BRANCH}_psd'
# 需要上传的文件 「需要相对路径, 如果用绝对路径会整条路径打包上传」
source: ./front-web.tar.gz
# 上传的目录文件夹
target: /root/html
port: 22
command_timeout: 2m
when:
branch:
- dev
- test
- name: ssh-commands
image: appleboy/drone-ssh
settings:
host:
from_secret: '${DRONE_COMMIT_BRANCH}_host'
username: root
password:
# 注意在 drone 页面的 Secrets 添加对应配置
from_secret: '${DRONE_COMMIT_BRANCH}_psd'
port: 22
script:
- |
#判断环境变量
ENV="dev"
TAG="3.0"
if [ "${DRONE_COMMIT_BRANCH}" = "release" ]; then
ENV="pre"
TAG="1.0"
mv ./front-web.tar.gz root/html/
elif [ "${DRONE_COMMIT_BRANCH}" = "test1" ]; then
ENV="test"
TAG="2.0"
fi
#拉取镜像并用k8s部署
- cd /root/html
- tar -zxvf front-web.tar.gz --strip-components 1 -C ./
- chmod +x build.sh
- sh ./build.sh "web" $ENV $TAG
volumes: # 定义流水线挂载目录,用于共享数据
- name: build-html
host:
path: /root/drone/html # 从宿主机中挂载的目录
- name: cache
host:
path: /root/drone/src/node_modules
trigger:
branch:
- dev
- test
- release
event:
- push
- pull_request
完成后提交到仓库,gitlab会通过上面注册的webhook发送通知给Drone执行构建。
build.sh脚本
#!/bin/bash
echo "接受参数:$1,$2,$3"
project=$1
environment=$2
suffix=$3
rm front-web.tar.gz
rm yarn.lock
echo "查看当前目录中的文件"
pwd && ls -al
echo "复制配置文件"
cp -f /opt/conf/k8s-${environment}-default.conf default.conf
echo "构建docker镜像,并推送到仓库"
docker build -f Dockerfile -t harborv2.ichub.com/ichub2/micro-web:${suffix} . && docker push harborv2.ichub.com/ichub2/micro-web:${suffix}
echo "重启前端pod并暴露服务"
cd /root/ichub2/${environment}
pwd && ls -al
kubectl delete -f web-${environment}.yaml
kubectl apply -f web-${environment}.yaml
echo "清理镜像文件"
docker rmi harborv2.ichub.com/ichub2/micro-web:${suffix} ##测试环境
本文根据Dron官方文档结合自己公司项目整理而成。