drone CI/CD 时的特殊配置
我这里的情况比较特殊,一般使用 drone 都比较简单化,因为我这里比较特殊,所以 pipeline 的 type 设置为了 exec,也就是宿主机执行。
这就导致了里面的所有 steps 都不可能使用 docker image,原本我这里有一个逻辑,就是当流程中的任意一项执行失败的时候,就会拉取一个镜像发送邮件,但现在是 exec 模式,所以无法拉取,这就导致项目构建失败。所以需要拆分流水线,经过多次尝试配置,这次终于配置成功,以下是完整代码:
kind: pipeline
type: exec
name: CI-building
clone:
disable: true
environment:
GOOS: linux
GOARCH: amd64
GOPROXY: https://proxy.golang.com.cn,direct
GONOPROXY: gitea.xxx.com
GOPRIVATE: gitea.xxx.com
steps:
- name: CI
environment:
GOPROXY: https://proxy.golang.com.cn,direct
GONOPROXY: gitea.xxx.com
GOPRIVATE: gitea.xxx.com
GOPATH: /root/go
PROJECT_API_NAME:
from_secret: PROJECT_API_NAME
PROJECT_RPC_NAME:
from_secret: PROJECT_RPC_NAME
DOMAIN_PREFIX:
from_secret: STAGE_DOMAIN_PREFIX
command_timeout: 360s
commands:
- pwd
- cd /xxx/app_project/${DRONE_REPO_NAME}
- git config --global url."https://alanal:Alanal126com@gitea.xxx.com".insteadOf "https://gitea.xxx.com"
#- git remote add origin https://userName:pwd@gitea.xxx.com/xxxpower/${DRONE_REPO_NAME}.git
- git checkout -- .
- git pull
- git switch ${DRONE_COMMIT_BRANCH}
#- git branch --set-upstream-to=origin/${DRONE_COMMIT_BRANCH} ${DRONE_COMMIT_BRANCH}
- git pull
- export PATH=$PATH:/usr/local/go/bin
- go env
- go version
- go mod tidy
- go build -ldflags="-s -w" -o ./app api/*.go
- docker build -f api/Dockerfile -t $${PROJECT_API_NAME}:latest .
- docker tag $${PROJECT_API_NAME}:latest harbor.xxx.com/xxx/$${PROJECT_API_NAME}:${DRONE_COMMIT:0:10}
- docker login harbor.xxx.com -u admin -p Harborxxx
- docker push harbor.xxx.com/xxx/$${PROJECT_API_NAME}:${DRONE_COMMIT:0:10}
- echo "API构建完成, 你可以通过 docker pull harbor.xxx.com/xxx/$PROJECT_API_NAME:${DRONE_COMMIT:0:10} 获取镜像"
- |
if [ -d "rpc" ]; then
go build -ldflags="-s -w" -o ./rpc_app rpc/*.go
docker build -f rpc/Dockerfile -t $${PROJECT_RPC_NAME}:latest .
docker tag $${PROJECT_RPC_NAME}:latest harbor.xxx.com/xxx/$${PROJECT_RPC_NAME}:${DRONE_COMMIT:0:10}
docker push harbor.xxx.com/xxx/$${PROJECT_RPC_NAME}:${DRONE_COMMIT:0:10}
rm -rf ./rpc_app
echo "RPC构建完成, 你可以通过 docker pull harbor.xxx.com/xxx/$${PROJECT_RPC_NAME}:${DRONE_COMMIT:0:10} 获取镜像"
fi
- name: stage-publish
environment:
PROJECT_API_NAME:
from_secret: PROJECT_API_NAME
PROJECT_RPC_NAME:
from_secret: PROJECT_RPC_NAME
DOMAIN_PREFIX:
from_secret: STAGE_DOMAIN_PREFIX
when:
branch:
- develop
commands:
- echo ">>>>>>>>>>>>>>>>>>>>"
- echo 1 $DOMAIN_PREFIX 2
- cd /xxx/app_project/${DRONE_REPO_NAME}
- docker compose down
- export DOMAIN_PREFIX=$DOMAIN_PREFIX
- export GIT_COMMIT=${DRONE_COMMIT:0:10}
- export ENV=""
- |
if [ -d "rpc" ]; then
echo $PROJECT_RPC_NAME 12345
docker tag $PROJECT_RPC_NAME:latest harbor.xxx.com/xxx/$PROJECT_RPC_NAME:${DRONE_COMMIT:0:10}
docker push harbor.xxx.com/xxx/$PROJECT_RPC_NAME:${DRONE_COMMIT:0:10}
docker images | grep $${PROJECT_RPC_NAME} | awk '{print $3}' | xargs docker rmi -f
fi
- docker images | grep $${PROJECT_API_NAME} | awk '{print $3}' | xargs docker rmi -f
- docker compose up -d
volumes:
- name: docker-sock
host:
path: /var/run/docker.sock
trigger:
branch:
- develop
- master
event:
include:
- push
- custom
- merge_request
---
kind: pipeline
type: docker
name: CI-Master-publish
depends_on:
- CI-building
steps:
- name: prod-publish
image: appleboy/drone-ssh
environment:
PROD_DOMAIN_PREFIX:
from_secret: PROD_DOMAIN_PREFIX
PROJECT_API_NAME:
from_secret: PROJECT_API_NAME
PROJECT_RPC_NAME:
from_secret: PROJECT_RPC_NAME
settings:
host:
from_secret: PROD_HOST_IP
username:
from_secret: PROD_HOST_NAME
password:
from_secret: PROD_HOST_PWD
port: 22
command_timeout: 360s
envs: [PROJECT_API_NAME,PROD_DOMAIN_PREFIX,PROJECT_RPC_NAME]
script:
- bash
- cd /xxx/app_project/${DRONE_REPO_NAME}
- git pull https://xxx:xxx@gitea.xxx.com/xxxpower/${DRONE_REPO_NAME}.git
- docker login harbor.xxx.com -u admin -p Harborxxx
- git pull origin
- git branch
- git fetch origin
- git checkout master
- export ENV="-prod"
- export DOMAIN_PREFIX=$${PROD_DOMAIN_PREFIX}
- export GIT_COMMIT=${DRONE_COMMIT:0:10}
# - docker compose down
# - docker images | grep $${PROJECT_API_NAME} | awk '{print $3}' | xargs docker rmi -f
# - docker images | grep $${PROJECT_RPC_NAME} | awk '{print $3}' | xargs docker rmi -f
- docker compose up -d
retry:
limit: 2
delay: 360s
volumes:
- name: docker-sock
host:
path: /var/run/docker.sock
trigger:
branch:
- master
event:
include:
- push
- custom
- merge_request
---
kind: pipeline
type: docker
name: promote/rollback
steps:
- name: stage-rollback
image: appleboy/drone-ssh
environment:
PROJECT_API_NAME:
from_secret: PROJECT_API_NAME
PROJECT_RPC_NAME:
from_secret: PROJECT_RPC_NAME
DOMAIN_PREFIX:
from_secret: DOMAIN_PREFIX
settings:
host:
from_secret: STAGE_HOST_IP
username:
from_secret: STAGE_HOST_NAME
password:
from_secret: STAGE_HOST_PWD
port: 22
command_timeout: 300s
envs: [PROJECT_API_NAME,STAGE_DOMAIN_PREFIX,PROJECT_RPC_NAME]
script:
- cd /xxx/app_project/${DRONE_REPO_NAME}
- export GIT_COMMIT=${DRONE_COMMIT:0:10}
- export DOMAIN_PREFIX=$${STAGE_DOMAIN_PREFIX}
- export ENV=""
- docker compose down
- docker compose up -d
- echo "版本已经更新到 ${DRONE_COMMIT:0:10}, ${DRONE_COMMIT_MESSAGE}"
when:
branch:
- develop
- name: prod-rollback
image: appleboy/drone-ssh
environment:
PROJECT_API_NAME:
from_secret: PROJECT_API_NAME
PROJECT_RPC_NAME:
from_secret: PROJECT_RPC_NAME
DOMAIN_PREFIX:
from_secret: DOMAIN_PREFIX
settings:
host:
from_secret: PROD_HOST_IP
username:
from_secret: PROD_HOST_NAME
password:
from_secret: PROD_HOST_PWD
port: 22
command_timeout: 300s
envs: [PROJECT_API_NAME,DOMAIN_PREFIX,PROJECT_RPC_NAME]
script:
- cd /xxx/app_project/${DRONE_REPO_NAME}
- export GIT_COMMIT=${DRONE_COMMIT:0:10}
- export DOMAIN_PREFIX=$${DOMAIN_PREFIX}
- export ENV="-prod"
- docker compose down
- docker compose up -d
- echo "版本已经更新到 ${DRONE_COMMIT:0:10}, ${DRONE_COMMIT_MESSAGE}"
when:
branch:
- master
volumes:
- name: docker-sock
host:
path: /var/run/docker.sock
trigger:
branch:
- develop
- master
event:
- rollback
- promote
---
kind: pipeline
type: docker
name: CI-notify
clone:
disable: true
steps:
- name: notify
image: drillster/drone-email
settings:
host:
username:
password: xxx2023
port: 465
from:
trigger:
status:
- failure
depends_on:
- CI-building
声明: 因编程语言版本更新较快,当前文章所涉及的语法或某些特性相关的信息并不一定完全适用于您当前所使用的版本,请仔细甄别。文章内容仅作为学习和参考,若有错误,欢迎指正。
开发者
专题·造轮子
编程笔记·热门
相关文章
-
windows wsl 子系统 ubuntu 安装 golang 服务器
09-25
-
git 多帐户登录操作
09-24
-
debian 更换镜像源
09-24
-
Linux 通过 ntp 命令同步时间
08-03
-
linux 查看端口被哪个进程占用
07-31