git集成drone自动部署

发布项目到git(前端Vue。后端java)

提交前端项目

1
2
3
4
5
git init
git add *
git commit -m "first commit"
git remote add origin https://nas.lzz.plus:8030/public/project-ui.git
git push -u origin master

提交后端到git

1
2
3
4
5
git init
git add *
git commit -m "first commit"
git remote add origin https://nas.lzz.plus:8030/public/project-java.git
git push -u origin master

安装Drone(dockerfile安装)

Drone-server安装,编写dockerfile文件

docker-compose-drone.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
version: '3'
services:
drone-server:
restart: always
image: drone/drone:2
ports:
- "10080:80"
volumes:
- /home/docker/drone/drone:/var/lib/drone/
- /home/docker/drone/data:/data/
environment:
- DRONE_GITEA_SERVER=https://xxx.com:8030/ # 支持http, https
- DRONE_GITEA_CLIENT_ID=2e796e47-b970-4a76-a5fc-b5e921399bdb #Gitea oauth 客户端 ID
- DRONE_GITEA_CLIENT_SECRET=gto_kjwgzincxrby3rq6esvrojtwpbmy2oklont7izun5bj5c4cqnmna #Gitea oauth 客户端密钥。
- DRONE_SERVER_HOST=https://xxx.com:8040 #drone外部主机名或 IP 地址
- DRONE_SERVER_PROTO=https # 支持http, https
- DRONE_RPC_SECRET=9876543210123 #设置drone主服务于runner之间的密钥
- DRONE_GIT_ALWAYS_AUTH=true
- DRONE_GIT_USERNAME=drone-server #在git 生成的访问令牌名称
- DRONE_GIT_PASSWORD=cb6e711e651b20548ce8XXXXXX4fdcfb060317b3 #在git 生成的访问令牌密钥
- DRONE_USER_CREATE=username:liuzhuangzhuang,admin:true # 开启并设置管理员账户(即一个真实的 GitHub 用户)

安装runner,用于运行发布项目

docker-compose-drone-runner.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
version: '3'
services:
drone-runner-docker:
restart: always
image: drone/drone-runner-docker:1
ports:
- "10081:3000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DRONE_RPC_PROTO=http # 支持http, https
- DRONE_RPC_HOST=drone-server #drone-server地址
- DRONE_RPC_SECRET=9876543210123 #drone主服务于runner之间的密钥,于 drone-server设置相同
- DRONE_RUNNER_NAME=drone-runner-docker
- DRONE_RUNNER_CAPACITY=2 #并发数量
- DRONE_RUNNER_LABELS=server:runner1 #runner标签,后续可在yml配置发版到哪一个标签服务器

编写发版文件后端(java)

编写entrypoint.sh 服务启动脚本

entrypoint.sh

1
2
3
4
5
6
7
8
#!/bin/sh

java -Xms128m -Xmx128m -jar /app/project.jar --spring.profiles.active=dev

if [ $? != 0 ]; then
echo Failed to start java >&2
exit 1
fi

–spring.profiles.active=dev : 命令行传参dev,执行dev环境配置文件

编写 Dockerfile 用于将java打包到容器中

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
FROM openjdk:17-jdk-alpine				
ENV SERVICE_PORTS=8081

FROM openjdk:17-jdk-alpine

# 设置服务端口作为环境变量
ENV SERVICE_PORTS=8081

# 更新 apk 源并安装字体,同时清理缓存
RUN set -xe \
&& sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
&& apk --no-cache add ttf-dejavu fontconfig \
&& apk --no-cache upgrade \
&& rm -rf /var/cache/apk/*

# 创建应用目录并设置为工作目录
WORKDIR /app

# 将 shell 脚本复制到容器中并设置权限
COPY entrypoint.sh .

# 由于我们已经在前面设置了权限,这里不需要再递归设置
RUN chmod +x entrypoint.sh

# 复制应用程序 JAR 文件
COPY UniManage*.jar .

# 创建一个非特权用户并切换过去
RUN adduser -D appuser
USER appuser

# 设置入口点
ENTRYPOINT ["/app/entrypoint.sh"]

编写run.sh 用于后期启动docker镜像使用

run.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/bin/sh
# 定义应用组名
group_name='com.gitea.lzz'
# 定义应用名称
app_name='project'
# 定义应用版本
app_version='latest'

# 尝试停止名为 ${app_name} 的运行中的容器
docker stop ${app_name}
echo '----stop container----'
# 移除已停止的容器
docker rm ${app_name}
echo '----rm container----'
# 强制删除同名的旧镜像
docker rmi ${group_name}/${app_name}:${app_version}

echo '----rm image----'
# 打包编译docker镜像
# 使用当前目录下的 Dockerfile 构建一个新的 Docker 镜像,并打上标签
docker build -t ${group_name}/${app_name}:${app_version} .

echo '----build image----'
# 启动一个新容器,将主机的 8080 端口映射到容器内的 80 端口,
# 设置时区环境变量为亚洲/上海,
# 并挂载主机的系统时间文件到容器内,
# 最后以后台模式运行容器。

docker run -p 8080:80 --name ${app_name} \
-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime \
-d ${group_name}/${app_name}:${app_version}

echo '----start container----'

编写.drone.yml

.drone.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
kind: pipeline
type: docker
name: ai

node:
server: runner1 # 在上面的docker-compose-drone-runner.yml 定义的DRONE_RUNNER_LABELS,如果不填写,则会每台runner都会部署

steps:
- name: build-jar # 流水线名称
image: maven:3.8.5-openjdk-17 # 定义创建容器的Docker镜像
volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置
- name: maven-cache
path: /root/.m2 # 将maven下载依赖的目录挂载出来,防止重复下载
- name: maven-build
path: /app/build # 将应用打包好的Jar和执行脚本挂载出来
commands: # 定义在Docker容器中执行的shell命令
- mvn clean package -DskipTests=true # 应用打包命
- cp target/project-0.0.1-SNAPSHOT.jar /app/build/project-0.0.1.jar
- cp entrypoint.sh /app/build/
- cp Dockerfile /app/build/
- cp run.sh /app/build/

- name: build-docker
image: plugins/docker
volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置
- name: maven-build
path: /app/build # 将应用打包好的Jar和执行脚本挂载出来
- name: docker
path: /var/run/docker.sock # 挂载宿主机的docker
settings:
dockerfile: /app/build/Dockerfile
commands: # 定义在Docker容器中执行的shell命令
- cd /app/build
- chmod +x run.sh
- sh run.sh
- docker ps

volumes: # 定义流水线挂载目录,用于共享数据
- name: maven-build
host:
path: /home/data/maven/build # 从宿主机中挂载的目录
- name: maven-cache
host:
path: /home/data/maven/cache
- name: docker
host:
path: /var/run/docker.sock

编写发版文件前端(Vue)

编写.drone.yml发版文件

.drone.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
kind: pipeline
type: docker
name: project-ui

node:
server: runner1


# 声明宿主机 映射到 drone执行器的数据卷
volumes:
- name: node_modules # 数据卷名称
# Host Volume, 挂载到宿主机上的卷轴
host:
# 宿主机的绝对路径
path: /home/data/cache/node_modules

- name: blog_path
host:
# 宿主机的绝对路径
path: /home/data/project


steps:
- name: build-project # 步骤名称
image: node:18.15.0-alpine3.17 # 使用镜像和版本
volumes: # 当前步骤使用(挂载)的卷轴
- name: node_modules # 数据卷名称
path: /drone/src/node_modules # 容器内的绝对路径
- name: blog_path
path: /drone/src/build_web
# 执行的命令
commands:
- sed -i 's@https://dl-cdn.alpinelinux.org/@https://mirrors.aliyun.com/alpine/@g' /etc/apk/repositories
- apk update && \
apk add --no-cache python3 make g++ autoconf && \
npm config set registry https://registry.npmmirror.com && \
npm ci && \
apk del python3 make g++ autoconf
- npm run build
- cp -r /drone/src/dist/* /drone/src/build_web

# 打包应用镜像并运行
- name: build-start
image: appleboy/drone-ssh
settings:
host:
from_secret: ssh_url
username:
from_secret: ssh_user
key:
from_secret: ssh_key
port: 22
command_timeout: 5m
script:
- cd /usr/local/nginx/sbin
- pwd
- cd /usr/local/nginx/sbin/ && ./nginx -s reload
- pwd


ssh_url、ssh_user和ssh_key 需要提前在git上创建凭证