自动化部署
参考:
Gogs安装
docker pull gogs/gogs
docker run -p 10022:22 -p 10080:3000 --name=gogs \
-v /home/docker/gogs/data:/data \
-d gogs/gogs
Drone安装
- 首先下载Drone的Server和Runner的镜像;
# Drone的Server
docker pull drone/drone:1
# Drone的Runner
docker pull drone-runner-docker:1
Server:为Drone的管理提供了Web页面,用于管理从Git上获取的仓库中的流水线任务。
Runner:一个单独的守护进程,会轮询Server,获取需要执行的流水线任务,之后执行。
- 安装
drone-server
docker run \
-v /home/mydata/drone:/data \
-e DRONE_AGENTS_ENABLED=true \
-e DRONE_GOGS_SERVER=http://192.168.1.253:10080 \
-e DRONE_RPC_SECRET=dronerpc666 \
-e DRONE_SERVER_HOST=192.168.1.253:3080 \
-e DRONE_SERVER_PROTO=http \
-e DRONE_USER_CREATE=username:sunbt,admin:true \
-e TZ="Asia/Shanghai" \
-p 3080:80 \
--restart=always \
--detach=true \
--name=drone \
drone/drone:1
-
配置参数
-
- DRONE_GOGS_SERVER:用于配置Gogs服务地址。
- DRONE_RPC_SECRET:Drone的共享秘钥,用于验证连接到server的rpc连接,server和runner需要提供同样的秘钥。
- DRONE_SERVER_HOST:用于配置Drone server外部可访问的地址。
- DRONE_SERVER_PROTO:用于配置Drone server外部可访问的协议,必须是http或https。
- DRONE_USER_CREATE:创建一个管理员账号,该账号需要在Gogs中注册好。
-
安装
drone-runner-docker
,当有需要执行的任务时,会启动临时的容器来执行流水线任务;
docker run -d \
-v /var/run/docker.sock:/var/run/docker.sock \
-e DRONE_RPC_PROTO=http \
-e DRONE_RPC_HOST=192.168.1.253:3080 \
-e DRONE_RPC_SECRET=dronerpc666 \
-e DRONE_RUNNER_CAPACITY=2 \
-e DRONE_RUNNER_NAME=runner-docker \
-e TZ="Asia/Shanghai" \
-p 3001:3000 \
--restart always \
--name runner-docker \
drone/drone-runner-docker:1
-
配置参数
-
- DRONE_RPC_PROTO:用于配置连接到Drone server的协议,必须是http或https。
- DRONE_RPC_HOST:用于配置Drone server的访问地址,runner会连接到server获取流水线任务并执行。
- DRONE_RPC_SECRET:用于配置连接到Drone server的共享秘钥。
- DRONE_RUNNER_CAPACITY:限制runner并发执行的流水线任务数量。
- DRONE_RUNNER_NAME:自定义runner的名称。
项目的配置文件
.drone.yml
kind: pipeline # 定义对象类型,还有secret和signature两种类型
type: docker # 定义流水线类型,还有kubernetes、exec、ssh等类型
name: mall-tiny-drone # 定义流水线名称
steps: # 定义流水线执行步骤,这些步骤将顺序执行
- name: package # 流水线名称
image: maven:3-jdk-8 # 定义创建容器的Docker镜像
volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置
- name: maven-cache
path: /root/.m2 # 将maven下载依赖的目录挂载出来,防止重复下载
- name: maven-build
path: /app/build # 将应用打包好的Jar和执行脚本挂载出来
commands: # 定义在Docker容器中执行的shell命令
- mvn clean package # 应用打包命令
- cp target/mall-tiny-drone-1.0-SNAPSHOT.jar /app/build/mall-tiny-drone-1.0-SNAPSHOT.jar
- cp Dockerfile /app/build/Dockerfile
- cp run.sh /app/build/run.sh
- name: build-start
image: appleboy/drone-ssh # SSH工具镜像
settings:
host: 192.168.1.253 # 远程连接地址
username: root # 远程连接账号
password:
from_secret: ssh_password # 从Secret中读取SSH密码
port: 22 # 远程连接端口
command_timeout: 5m # 远程执行命令超时时间
script:
- cd /home/mydata/maven/build # 进入宿主机构建目录
- chmod +x run.sh # 更改为可执行脚本
- ./run.sh # 运行脚本打包应用镜像并运行
volumes: # 定义流水线挂载目录,用于共享数据
- name: maven-build
host:
path: /home/mydata/maven/build # 从宿主机中挂载的目录
- name: maven-cache
host:
path: /home/mydata/maven/cache
Dockerfile
# 该镜像需要依赖的基础镜像
FROM java:8
# 将当前目录下的jar包复制到docker容器的/目录下
ADD dzzh-0.0.1-SNAPSHOT.jar /dzzh-0.0.1-SNAPSHOT.jar
# 声明服务运行在8088端口
EXPOSE 7771
# 指定docker容器启动时运行jar包
ENTRYPOINT ["java", "-jar","/dzzh-0.0.1-SNAPSHOT.jar"]
# 指定维护者的名字
MAINTAINER sunbt
run.sh
#!/usr/bin/env bash
# 定义应用组名
group_name='sunbt'
# 定义应用名称
app_name='dzzh'
# 定义应用版本
app_version='0.0.1-SNAPSHOT'
# 定义应用环境
profile_active='qa'
echo '----copy jar----'
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镜像
docker build -t ${group_name}/${app_name}:${app_version} .
echo '----build image----'
docker run -p 7771:7771 --name ${app_name} \
--link mysql:db \
-e 'spring.profiles.active'=${profile_active} \
-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime \
-v /home/mydata/app/${app_name}/logs:/var/logs \
-d ${group_name}/${app_name}:${app_version}
echo '----start container----'
自动化相关密码
主机IP:192.168.1.253
gogs:
-
http://192.168.1.253:10080/
-
sunbt/123456 / 数据库:postgreSQL postgres/postgres
Drone:
- http://192.168.1.253:3080/
- sunbt/123456