用Ansible部署Docker化的应用程序作为CI/CD Jenkins管道的一部分

148 阅读2分钟

在这个例子中,我们要用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通信,部署管道在那里运行。

  1. Jenkins拉出仓库。

  2. Jenkins 构建 docker 镜像。

  3. Jenkins将docker镜像推送到DockerHub。

  4. Jenkins清理docker人工制品。

  5. Ansible SSH进入暂存服务器并开始部署过程。

  6. 创建应用程序目录。

  7. 复制docker文件。

  8. 启动应用程序

  9. 安装secure-delete 包。

  10. 安全地删除所有复制过来的文件。

结构

.

文件

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