利用Google Cloud Build和Triggers实现DevOps管道自动化
DevOps是一套实践或阶段,每个应用程序在部署之前和之后都会经历,这确保了应用程序的持续集成和部署(CI/CD)。CI/CD管道将代码变更部署到指定类型的环境中的过程自动化。
软件开发生命周期(SDLC)与运营周期相结合,使得开发和运营(被称为DevOps)。
Docker将应用程序打包成Docker镜像,并将其存储在容器中,其配置在DockerFile 。
谷歌云平台(GCP)的 Cloud Build和容器注册表都是用来构建和管理构建的docker镜像。
先决条件
要轻松地跟上本教程,应该具备以下条件。
- 对Git存储库和Python等编程语言有基本的了解。
- 已经安装了Python。
- 安装了一个IDE或代码编辑器,最好是Visual Studio Code。
- 对Docker有基本的了解。
- 对Flask有基本的了解。
教学目的
在本教程中,我们将学习如何使用GCP的Cloud Build ,实现DevOps管道的自动化。
通过阅读这篇文章,你将获得以下经验。
- 定义DevOps管线的阶段。
- 为应用程序制作一个资源库。
- 创建一个Python应用程序。
- 用于测试的Cloud Shell。
- 构建Docker镜像。
- 使用GCP容器注册表来管理镜像。
- 用触发器处理自动化。
- 构建变化测试。
定义DevOps管道的阶段
构建从开发到生产的管道涉及不同的阶段。
下面的图片描述了所有预先定义的阶段。

让我们更多地了解每个阶段。
计划
如果没有一个适当的计划,没有人能够成功地开发一个应用程序。在踏上开发的旅程之前,必须制定一个适当的计划。
在这一阶段,应该对技术栈和其他所需的东西进行论证。
编码
开发人员在第一阶段确定了需求后,开始了编码部分。他们将通过一个单一来源的资源库进行合作,来开发应用程序。
构建
在这个阶段,开发的应用程序将被打包,并通过选择一个软件包管理器(如Docker )构建成图像。
应用程序也将被运送到容器中,并附上启动所需的配置文件。
测试
一系列的测试将通过应用程序运行以获得更好的性能。开发人员进行各种类型的应用程序测试,如单元测试、烟雾测试、集成测试等。
其他测试可以由测试人员和质量保证工程师来完成。Selenium 是业界最流行的持续测试框架。
发布
这是持续集成阶段开始的地方。只要应用程序有任何更新,这个阶段就会重复无数次。
用于此的流行工具有:Jenkins 、GitHub Actions 、Team City 、等等。
部署
一个通过持续集成阶段的应用程序将进入部署阶段。在部署前的第一件事是使用工具,如Ansible,Puppet, 或Chef 。
操作
实际的部署在这个阶段开始,使用像terraform 等工具。然后,完善的应用程序将被部署,其操作将被监控。
监控
部署的应用程序将在性能方面被监控。日志将在监控过程中产生。
所有这些CI/CD阶段都可以通过云来完成。
在本教程中,我们将通过构建一个简单的应用程序来进一步了解这些管道。通过构建,你将了解DevOps架构的开发和运营部分。
为应用程序制作一个资源库
首先,你将在谷歌云平台控制台创建一个免费试用账户。这个免费账户将贯穿一年的时间跨度,并有一个用于计费的金额之和。
点击这个链接来创建一个新账户。
成功创建一个新账户后,你将被转到仪表板页面,如图所示。

在任何资源可以在云中被消耗之前,必须创建一个项目。
你可以通过点击导航栏中的下拉菜单来创建该项目。然后,在弹出的页面里面点击New Project 按钮。
请注意,每个创建的项目都在一个组织之下。一个项目既有name ,又有一个自动生成的唯一的ID 。
此外,我们将利用所提供的云资源库。
云源码库作为开发代码的存储器。这项服务与Github、Gitlab、Bitbucket等平台的服务非常相似。
最终,你将创建一个构建触发器,当代码被推送到它时,启动一个持续集成管道。
要在源码中创建一个仓库,请按照以下步骤进行。
- 在云控制台的菜单中,点击
Source Repositories。 - 点击按钮
Add repository。 - 选择
Create a new repository并点击Continue。 - 将资源库命名为
devops-repo。 - 从列表中选择你当前的项目ID。
- 然后,点击
Create。
下面的图片显示了创建的资源库。刷新页面以验证已上传的代码。

- 回到云控制台仪表板,点击顶部菜单栏的
Activate Cloud Shell。
第一次,你将不得不使用以下命令在shell中设置你的项目。
gcloud config set project
- 如果有提示,点击
Continue。 - 在云端外壳中输入以下命令,创建一个新的文件夹
learning-devops,并克隆创建的资源库。
mkdir learning-devops
cd learning-devops
gcloud source repos clone devops-repo
注意:克隆的资源库可以在导航菜单下的
Source Repository部分看到。
创建一个Python应用程序
我们将创建一个Flask应用程序进行演示。这个应用程序将足以测试你将要建立的管道。
下面是该应用程序的一套说明。
- 在云端外壳中,点击
Open Editor,打开代码编辑器。 - 在左边的资源管理器树中选择
learning-devops > devops-repo文件夹。 - 点击
New File,并将其命名为main.py。
将以下内容粘贴到你刚刚创建的文件中。
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route("/")
def main():
model = {"title": "Hello DevOps Fans."}
return render_template('index.html', model=model)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=8080, debug=True, threaded=True)
- 保存你的改动。
- 在
devops-repo文件夹上点击右键,添加一个新的文件夹,名为templates。 - 在该文件夹中,添加一个名为
layout.html的新文件,代码如下。
<!doctype html>
<html lang="en">
<head>
<title>{{model.title}}</title>
</head>
<body>
<div class="container">
{% block content %}{% endblock %}
<footer></footer>
</div>
</body>
</html>
- 同样在
templates文件夹中,添加另一个名为index.html的文件,代码如下。
{% extends "layout.html" %}
{% block content %}
<div>
<div>
<h1>{{model.title}}</h1>
</div>
</div>
{% endblock %}
在这里,我们创建了一个简单的Flask应用程序,渲染一个标题为 "Hello DevOps Fans "的index.html。
- 在Python中,应用程序的依赖性是使用
pip包管理器来管理的。 - 现在,你将添加一个文件,列出这个应用程序的需求。
- 在
devops-repo文件夹中,创建一个新文件requirements.txt,内容如下。
Flask==1.1.2
- 在cloud shell中,输入以下代码。
cd ~/learning-devops/devops-repo
git add --all
- 然后,在输入你的证书后,提交并推送这些修改到版本库。
git config -g user.email "your-mail-here"
git config -g user.name "Your Name Here"
git commit -a -m "Initial Commit"
git push origin master
在刷新版本库页面时,你必须看到我们在本地创建的相同文件。
测试的云端壳的使用
通过以下步骤,可以使用Cloud Shell测试该应用程序。
- 回到Cloud Shell,确保你在你的应用程序的根文件夹中,然后使用
pip安装Flask框架。
cd ~/learning-devops/devops-repo
sudo pip3 install -r requirements.txt
- 要运行该程序,请输入。
python3 main.py
注意:服务器被配置为运行在端口
8080。
- 要看到程序的运行,点击Cloud Shell的工具栏中的
Web Preview。然后,点击Preview on port 8080。
该程序将显示在一个新的浏览器标签中,如图所示。

- 要停止该程序,请返回云控制台并在云外壳中按下
Ctrl+C。 - 在代码编辑器中,在左侧的资源管理器窗格中展开
learning-devops/devops-repo文件夹,并打开main.py文件。 - 将
title改为其他内容,如下图所示。
@app.route("/")
def main():
model={"title": "Whatever you want."}
return render_template('index.html', model=model)
- 在
File菜单下的Code Editor工具栏中,点击Save,保存你的修改。 - 导航到云端外壳,并将更改提交到存储库,如图所示。
cd ~/gcp-course/devops-repo
git commit -a -m "committing another changes"
- 使用以下命令将你的修改推送到云端。
git push origin master
- 回到
Source Repositories页面,刷新版本库,以验证你的修改是否被上传。
构建Docker镜像
使用Docker的第一步是创建一个名为DockerFile 的文件。
这个文件定义了Docker容器的制作方法。它还描述并包含了安装应用程序所需的各种依赖项的说明。
以下是我们的flask应用程序在DockerFile 内所需的一组命令。
- 在Cloud shell代码编辑器中,展开
learning-devops/devops-repo文件夹。点击New File,将其命名为DockerFile。 - 在文件的最上方指定如下的Python图像。
FROM python:3.7
WORKDIR /app
COPY . .
这几行将源代码从当前文件夹复制到/app 文件夹中。
RUN pip install gunicorn
RUN pip install -r requirements.txt
这就使用pip 包管理器将Python应用程序的要求安装到容器中。
Gunicorn 是一个Python网络服务器,将用于运行网络应用。
ENV PORT=80
CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 main:app
环境变量设置端口为80 。最后一行使用gunicorn web服务器运行web应用程序。
- 确保完整的
DockerFile,看起来像这里所示。
FROM python:3.7
WORKDIR /app
COPY . .
RUN pip install gunicorn
RUN pip install -r requirements.txt
ENV PORT=80
CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 main:app
用Cloud Build和Container Registry管理Docker镜像
Docker镜像将被创建并存储在注册表中。然后这个镜像将与容器中的启动命令一起被包裹起来。
Cloud Build 是由GCP提供的用于构建Docker镜像的基础设施。而容器注册表存储了构建的镜像,可以从那里访问。
注意:Docker镜像也可以存储在Docker Hub中。
- 返回到Cloud Shell,并导航到下面的文件。
cd ~/learning-devops/devops-repo
- 有环境变量
DEVSHELL_PROJECT_ID的Cloud Shell包含当前的项目ID。项目ID是在Container Registry中存储镜像所需要的。
输入下面的命令来查看你的项目ID。
echo $DEVSHELL_PROJECT_ID
- 输入下面的命令,使用
Cloud Build来建立你的镜像。
gcloud builds submit --tag gcr.io/$DEVSHELL_PROJECT_ID/devops-image:v0.1 .
注意该命令中的环境变量。该图像将被存储在容器注册表中。
- 如果要求在你的项目中启用
Cloud Build,请输入Yes,让它构建成功。
注意:如果你收到错误
INVALID_ARGUMENT: unable to resolve source,等待几分钟后再试。
在Container Registry ,图像名称总是以gcr.io/ 开始,后面是你正在工作的项目ID,然后是图像名称和版本。
命令末尾的句号代表Docker文件的路径:在这种情况下,它显示的是当前目录。
- 返回到云端控制台,在导航菜单上,点击
Container Registry。你必须能够在列表中看到已构建的镜像。 - 现在,导航到
Cloud Build服务,你的构建应该在历史中列出。 - 现在你将尝试从GCP计算引擎虚拟机上运行这个镜像。
- 导航到
Compute Engine服务。 - 点击
Create Instance,创建一个新的虚拟机。 - 在
Create an instance页面上,指定以下内容,其余设置为默认值。
Property - Value
Container - Deploy a container image to this VM instance
Container image - gcr.io/<your-project-id-here>/devops-image:v0.1 (change the project ID where indicated)
Firewall - Allow HTTP traffic
- 点击
Create。 - 一旦虚拟机启动,创建一个浏览器标签,请求这个新的虚拟机的外部IP地址。该程序应像以前一样工作。
- 现在你将把你的改动保存到Git仓库。
在Cloud Shell中,将所有的本地修改分阶段提交,然后推送到仓库,如图所示。
cd ~/learning-devops/devops-repo
git add --all
git commit -am "Added Docker Support"
git push origin master
使用触发器自动构建
在这里,我们将对应用程序做一些修改,然后使用triggers 来自动构建。这有助于更新应用程序的版本。
- 在菜单上,导航到
Container Registry。在这一点上,你应该有一个名为devops-image的文件夹,里面至少有一个容器。 - 在
Navigation菜单上,点击Cloud Build。构建历史页面应该打开,历史中至少有一个或多个构建。 - 点击左边的
Triggers链接,然后点击Create trigger按钮。 - 将触发器命名为
devops-trigger。 - 选择你的
devops-repoGit 仓库。 - 选择
.*(any branch)作为分支。 - 选择
Dockerfile作为构建配置,并选择默认图像。
注意:下面的图片描述了你的构建配置的方式。

- 接受其余的默认值,然后点击
Create。 - 要测试触发器,点击
Run,然后点击Run trigger。 - 点击
History链接,你应该看到一个构建正在运行。 - 等待构建完成,然后点击它的链接,查看其细节。
- 向下滚动,看一下日志。如果你在你的机器上运行,这里的构建输出就是你会看到的东西。
- 在
Container Registry,你应该看到一个新的文件夹devops-repo,里面有新的图像。 - 返回到Cloud Shell的代码编辑器。在
learning-devops/devops-repo文件夹中找到文件main.py。 - 在
main()函数中,将title属性改为This is from build trigger.,如下所示。
@app.route("/")
def main():
model={"title": "This is from build trigger."}
return render_template('index.html', model=model)
- 阶段,提交,并推送这些更改。
cd ~/learning-devops/devops-repo
git add .
git commit -a -m "build trigger test"
git push origin master
- 返回到云控制台和
Cloud Build服务。你应该看到另一个构建正在运行。
构建变化测试
- 当构建完成后,点击它以查看其细节。
- 在执行细节下,复制图像链接。格式应该是这样的:
gcr.io/<your-project-id>/devops-repoxx34345xx。 - 转到
Compute Engine服务。像你之前做的那样,创建一个新的虚拟机来测试这个镜像。 - 点击方框,将容器镜像部署到虚拟机上,并粘贴复制的镜像。
- 选择
Allow HTTP traffic。 - 当新机器被创建后,你可以通过在浏览器中请求虚拟机的外部IP地址来测试你的变化。你的新信息将被显示出来。
注意:在虚拟机创建后,你可能需要等待几分钟才能启动Docker容器。
总结
在本教程中,你使用谷歌云服务,如云源库、Cloud Build 、Build Triggers 、Container Registry ,建立了一条持续集成管道。
你学到了当代码库中出现更新时,如何使用构建触发器来实现管道的自动化。你还了解了git的基本命令以及如何从头开始启动Flask服务器。