本章主要介绍docker结合pm2以及webhooks实现自动化部署,主要需要注意卷映射路径和问题。
docker相关配置
配置 Dockerfile
1 2 3 4 5 6 7 8 9
| FROM keymetrics/pm2:latest-alpine ADD . /server/ WORKDIR /server RUN npm install EXPOSE 8000
CMD ["pm2-runtime", "start", "process.yml"]
|
配置 docker-compose.yaml
注:这里的卷映射主要是将上传到容器的图片映射到主机(服务器)的 share/images
当中。此外network_mode: bridge
是Docker网络bridge桥接模式,是创建和运行容器时默认模式。这种模式会为每个容器分配一个独立的网卡,桥接到默认或指定的bridge上,同一个Bridge下的容器下可以互相通信的。这里是为了让另一个docker容器中 nginx
与之建立通信,因此在下一章会有所介绍。
1 2 3 4 5 6 7 8 9 10
| version: "3.1" services: ps: container_name: ps network_mode: bridge build: . ports: - 8000:8000 volumes: - /home/xshellv/share/images/:/server/images
|
创建自动构建脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| echo Deploy Project
git pull
docker-compose down docker-compose up -d --force-recreate --build
|
编写 webhooks.js
实现自动部署
webhooks的配置网上有很多教程,这里不再赘述了,这里我们监听到 push
事件后自动触发创建的 deploy-dev.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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| var http = require('http') var createHandler = require('gitee-webhook-handler') var handler = createHandler({ path: '/webhooks', secret: '12345' })
function run_cmd(cmd, args, callback) { var spawn = require('child_process').spawn; var child = spawn(cmd, args); var resp = "";
child.stdout.on('data', function (buffer) { resp += buffer.toString(); }); child.stdout.on('end', function () { callback(resp) }); }
http.createServer(function (req, res) { handler(req, res, function (err) { res.statusCode = 404 res.end('no such location') }) }).listen(6666, () => { console.log('WebHooks Listern at 6666'); })
handler.on('error', function (err) { console.error('Error:', err.message) })
handler.on('Push Hook', function (event) { console.log('Received a push event for %s to %s', event.payload.repository.name, event.payload.ref); if (event.payload.ref === 'refs/heads/master') { console.log('deploy master..') run_cmd('sh', ['./deploy-dev.sh'], function (text) { console.log(text) });
} })
|
参考文章