Jenkins Docker实现自动复制MySQL数据库

需求

测试环境需要持续模拟生产环境的数据库,由于生产的数据库只能晚上复制,所以想写一个自动复制数据库的脚本,决定使用Jenkins的管道脚本,方便设置定时运行

Pipeline脚本

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
#!groovy
pipeline {
agent any

stages {
stage('clean') {
steps {
sh '((docker stop mysql_prod && docker rm mysql_prod) && echo "clean success") || echo "clean error"'
}
}
stage('start') {
steps {
sh 'docker run --name mysql_prod -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=??? -e MYSQL_USER=??? -e MYSQL_PASSWORD=??? -e MYSQL_DATABASE=efi mysql:5.7.18 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci'
}
}
stage('wait to start') {
steps {
sleep 10
}
}
stage('dump') {
steps {
sh 'docker exec mysql_prod sh -c "exec mysqldump -h??? -u??? -p??? efi > efi.sql"'
}
}
stage('import') {
steps {
sh 'docker exec mysql_prod sh -c "exec mysql -u??? -p??? efi < efi.sql"'
}
}
}
}
  • clean: 停止并删除老的数据库容器,因为测试用所以数据可以直接丢弃
  • start: 运行一个新的数据库容器,指定root密码、管理用户的用户名密码、默认数据库名称等
  • wait to start: 等待容器启动和初始化,一般10s就可以了,去掉这步后面的命令会有奇怪的问题
  • dump: 使用mysqldump命令导出制定的数据源,-h可以指定远程数据库的host
  • import: 使用mysql命令导入刚刚导出的sql文件到本地数据库

MySQL官方镜像的说明中推荐使用/docker-entrypoint-initdb.d目录存放初始化的sql脚本,但是这种方法需要挂载目录到容器中,由于本人不喜欢做挂载目录(感觉会把宿主机弄脏),所以利用Jenkins的脚本做了以上的简单实现

文章目录
  1. 1. 需求
    1. 1.1. Pipeline脚本