最近学习了一下自动化部署相关的技术,记录一下自己的学习历程。
去年的时候腾讯云服务器搞活动,于是购买了一台云服务器用于学习。自己毕业后在第一家公司工作时,一直感觉项目上线是一件很头疼的事情,当时是采用pm2+nodejs的方式,项目上线就是登录到服务器上,手动替换js文件,然后用pm2重启进程。由于当时部门之间分工不明确,我作为开发有时候也要负责项目上线,经常每天晚上11点在家加班,那时候感觉还是挺痛苦的,于是感觉自动化部署是很有必要的。
自己学习的时候,也是锁定了两款自动化部署工具:jenkins、drone,然后选择了drone先学习一下,根据好多前辈的反馈,drone比jenkins更加小巧一点吧,但是也够用;然后git仓库,选择的是drone支持的gogs,功能可能没有GitHub多但是也够用了,个人感觉一些中小型公司完全是可以直接使用的。
大致安装配置步骤如下:
1、安装docker
1、确保 yum 包更新到最新:
sudo yum update
2、卸载旧版本:
sudo yum remove docker docker-common docker-selinux docker-engine
3、安装需要的软件包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
4、设置yum源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
5、查看所有仓库中所有docker版本,并选择特定版本安装
yum list docker-ce --showduplicates | sort -r
6、安装docker
sudo yum install docker-ce
7、启动并加入开机启动
sudo systemctl start docker
sudo systemctl enable docker
8、验证安装是否成功
docker version
关于docker下载速度慢的问题,网上有很多解决办法,可以自行百度,我推荐一种方法:
2、docker加速:
1、登录阿里云,控制台里面找到“容器镜像服务”,再找到“镜像加速器”选项:
2、编辑文件:
vim /etc/docker/daemon.json
加入花括号以及里面的内容:
{
"registry-mirrors": ["xxxxx"]
}
3、安装 docker-compose。
1、执行以下命令下载:
sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/1.27.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
2、赋予文件可执行权限
sudo chmod +x /usr/local/bin/docker-compose
3、执行docker-compose命令查看安装是否成功
docker-compose version
4、准备 docker-compose.yml 文件,用于安装 drone、gogs、mysql 等等。
version: '3'
services:
drone-server:
image: drone/drone:latest
ports:
- "8080:80"
- "8843:443"
- "9000"
volumes:
- ./drone:/var/lib/drone/
- /var/run/docker.sock:/var/run/docker.sock
restart: always
environment:
- DRONE_OPEN=true
- DRONE_SERVER_HOST=drone-server
- DRONE_SERVER_PROTO=http
- DRONE_LOGS_TRACE=true
- DRONE_LOGS_DEBUG=true
- DRONE_GOGS=true
- DRONE_GOGS_SERVER=http://xxx:3000
- DRONE_PROVIDER=gogs
- DRONE_DATABASE_DATASOURCE=/var/lib/drone/drone.sqlite
- DRONE_DATABASE_DRIVER=sqlite3
- DRONE_RPC_SECRET=MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM
- DRONE_USER_CREATE=username:xxx,admin:true
drone-agent:
image: drone/agent:latest
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock
restart: always
environment:
- DRONE_RPC_SERVER=http://drone-server
- DRONE_RPC_SECRET=MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM
- DRONE_LOGS_TRACE=true
- DRONE_LOGS_DEBUG=true
gogs:
image: gogs/gogs:latest
ports:
- "10022:22"
- "3000:3000"
volumes:
- ./data/gogs:/data
depends_on:
- mysql
mysql:
image: mysql:5.7.16
volumes:
- ./gogs/mysql:/var/lib/mysql
ports:
- 3308:3306
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
environment:
MYSQL_ROOT_PASSWORD: pass
MYSQL_DATABASE: gogs
MYSQL_USER: gogs
MYSQL_PASSWORD: pass
TZ: Asia/Shanghai
以上有些用x代表的地方换成自己的ip或者名称就好。
5、将 docker-compose.yml 文件上传到云服务器,目录自己定就好,然后执行:
docker-compose up -d
之后,docker就会自动安装好:drone、gogs、mysql
6、然后就是配置gogs和drone,首先登录 http://ip:3000/,第一次登录需要配置,如下图:
之后点击立即安装,gogs就安装好了。
7、配置drone,打开http://ip:8080/,初始登录账号密码就是上面最后一张图里面你配置的gogs的账号密码,之后就会进入到主界面。
8、创建node项目
自己随便在gogs创建一个nodejs项目,比如一个简单的后端server就行,只要可以运行就可以,然后上传到gogs
9、登录drone,同步项目
10、同步结束之后,再次登录gogs,打开项目仓库,仓库设置,管理web钩子,会发现自动多出了一条钩子,可以打开并测试它
11、之后在nodejs项目根目录添加.drone.yml文件,我自己想的是,项目一共分为3个分支:devlopment, test, master,服务器也有3个,并对应这三个分支的运行环境
pipeline:
# 加载缓存 node_modules
restore-cache:
image: drillster/drone-volume-cache
restore: true
mount:
- ./node_modules
volumes:
- /tmp/cache:/cache
when:
# 触发事件类型[push], [pull_request]
event: [push, pull_request]
# 触发分支
branch: [devlopment, test, master]
# install
install:
image: node:12-alpine
commands:
# 删除文件 npm install
- rm -rf package-lock.json
- npm --registry https://registry.npm.taobao.org install
when:
event: [push, pull_request]
branch: [devlopment, test, master]
# 更新node_modules缓存
rebuild-cache:
image: drillster/drone-volume-cache
rebuild: true
mount:
- ./node_modules
volumes:
- /tmp/cache:/cache
when:
event: [push, pull_request]
branch: [devlopment, test, master]
# push
dev-push:
image: appleboy/drone-scp
host: xxx # 可以写到secret中
port: 22
username: xxx
password: xxx
target: /app/vue-manage-server
source: .
rm: true
when:
event: [push, pull_request]
branch: [devlopment]
# push
test-push:
image: appleboy/drone-scp
host: xxx # 可以写到secret中
port: 22
username: xxx
password: xxx
target: /app/vue-manage-server
source: .
rm: true
when:
event: [push, pull_request]
branch: [test]
# push
master-push:
image: appleboy/drone-scp
host: xxx # 实际应用中,可以写到secret中
port: 22
username: xxx
password: xxx
target: /app/vue-manage-server
source: .
rm: true
when:
event: [push, pull_request]
branch: [master]
# run
dev-run:
image: appleboy/drone-ssh
host: xxx
username: xxx
password: xxx
port: 22
command_timeout: 300s
script:
- cd /app/vue-manage-server
- mkdir seresr
when:
event: [push, pull_request]
branch: [devlopment]
# run
test-run:
image: appleboy/drone-ssh
host: xxx
username: xxx
password: xxx
port: 22
command_timeout: 300s
script:
- cd /app/vue-manage-server
- mkdir seresr
when:
event: [push, pull_request]
branch: [test]
# run
master-run:
image: appleboy/drone-ssh
host: xxx
username: xxx
password: xxx
port: 22
command_timeout: 300s
script:
- cd /app/vue-manage-server
- docker build -t vue-manage-server .
- docker run -d -p 4000:4000 vue-manage-server
when:
event: [push, pull_request]
branch: [master]
上面的文件其实挺好理解,xxx替换成自己的,有些路径也替换成自己的。
12、由于上面最后发布项目利用了docker,所以需要项目添加 Dockerfile 文件,根据你自己的项目自行编写文件
FROM node:12-alpine
WORKDIR /usr/src/app
COPY package.json ./
COPY package-lock.json ./
# in workdir install
RUN npm --registry https://registry.npm.taobao.org install
# Bundle app source
COPY . ./
EXPOSE 4000
CMD ["node","server.js"]
13、把.drone.yml和Dockerfile文件推上去之后,可能会报错:untrusted repositories cannot mount host volumes,在drone设置里改一下配置即可:
14、执行结果如下,那么就算成功了,整个流程当然肯定有不太稳妥的地方,毕竟第一次学习。