在这个例子中,我们要用Ansible将一个Docker化的应用程序部署到暂存服务器,作为Jenkins CI/CD管道的一部分。请阅读下面的实际流程。
Jenkins服务器的必备条件
确保你涵盖了以下几点。
-
完成了GitHub集成。
-
Ansible已经安装。
-
Jenkins用户可以运行
ansible命令。 -
Ansible可以通过SSH进入暂存服务器。
-
在终端上登录Docker Hub,这样
jenkins用户就可以推送镜像。
我们有一个Jenkins和一个Staging服务器,详情如下。
-
Jenkins:
192.168.99.40/jenkins(IP/用户)。 -
Staging:
192.168.99.30/vagrant(IP/user).
流程
Jenkins和GitHub的集成已经设置好了,所以当我把一个PR合并到develop 分支时,GitHub会与Jenkins通信,部署管道在那里运行。
-
Jenkins拉出仓库。
-
Jenkins 构建 docker 镜像。
-
Jenkins将docker镜像推送到DockerHub。
-
Jenkins清理docker人工制品。
-
Ansible SSH进入暂存服务器并开始部署过程。
-
创建应用程序目录。
-
复制docker文件。
-
启动应用程序
-
安装
secure-delete包。 -
安全地删除所有复制过来的文件。
结构
.
文件
cicd/merge/develop/Jenkinsfile
pipeline {
cicd/provision/stag/hosts.yml
all:
cicd/provision/stag/site.yml
我手动安装了docker和docker-compose到暂存服务器上,但理想情况下应该在这里完成。此外,这个文件还可以进行改进,比如使用变量等等。
---
docker/dev/php/Dockerfile
我们将应用文件复制到镜像中,这样在构建过程中,这些文件就不会暴露在主机操作系统中。
FROM alpine:3.9
docker/stag/docker-compose.yml
我们的镜像已经在DockerHub上了。
version: "3"
docker/stag/Makefile
build:
src/test.php
echo 'success';
.dockerignore
.git/
.env
DB_USER=root
测试
假设我们已经合并了一个PR信息develop 分支。
Jenkins控制台输出
Running on Jenkins in /var/lib/jenkins/workspace/mini-merge-develop
检查暂存服务器
正如你所看到的,我们在开始时创建的/home/vagrant/mini ,在部署过程的最后已经被删除了。
vagrant@staging:~$ ls -l
让我们检查一下docker组件。
vagrant@staging:~$ docker images
vagrant@staging:~$ docker ps
vagrant@staging:~$ docker exec -it stag_mini_php_1 php src/test.php