如何使用Google Cloud Build和Triggers的DevOps管道自动化

399 阅读12分钟

利用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管道的阶段

构建从开发到生产的管道涉及不同的阶段。

下面的图片描述了所有预先定义的阶段。

DevOps Stages

让我们更多地了解每个阶段。

计划

如果没有一个适当的计划,没有人能够成功地开发一个应用程序。在踏上开发的旅程之前,必须制定一个适当的计划。

在这一阶段,应该对技术栈和其他所需的东西进行论证。

编码

开发人员在第一阶段确定了需求后,开始了编码部分。他们将通过一个单一来源的资源库进行合作,来开发应用程序。

构建

在这个阶段,开发的应用程序将被打包,并通过选择一个软件包管理器(如Docker )构建成图像。

应用程序也将被运送到容器中,并附上启动所需的配置文件。

测试

一系列的测试将通过应用程序运行以获得更好的性能。开发人员进行各种类型的应用程序测试,如单元测试、烟雾测试、集成测试等。

其他测试可以由测试人员和质量保证工程师来完成。Selenium 是业界最流行的持续测试框架。

发布

这是持续集成阶段开始的地方。只要应用程序有任何更新,这个阶段就会重复无数次。

用于此的流行工具有:JenkinsGitHub ActionsTeam City 、等等。

部署

一个通过持续集成阶段的应用程序将进入部署阶段。在部署前的第一件事是使用工具,如Ansible,Puppet, 或Chef

操作

实际的部署在这个阶段开始,使用像terraform 等工具。然后,完善的应用程序将被部署,其操作将被监控。

监控

部署的应用程序将在性能方面被监控。日志将在监控过程中产生。

所有这些CI/CD阶段都可以通过云来完成。

在本教程中,我们将通过构建一个简单的应用程序来进一步了解这些管道。通过构建,你将了解DevOps架构的开发和运营部分。

为应用程序制作一个资源库

首先,你将在谷歌云平台控制台创建一个免费试用账户。这个免费账户将贯穿一年的时间跨度,并有一个用于计费的金额之和。

点击这个链接来创建一个新账户。

成功创建一个新账户后,你将被转到仪表板页面,如图所示。

Cloud Console Dashboard

在任何资源可以在云中被消耗之前,必须创建一个项目。

你可以通过点击导航栏中的下拉菜单来创建该项目。然后,在弹出的页面里面点击New Project 按钮。

请注意,每个创建的项目都在一个组织之下。一个项目既有name ,又有一个自动生成的唯一的ID

此外,我们将利用所提供的云资源库。

云源码库作为开发代码的存储器。这项服务与Github、Gitlab、Bitbucket等平台的服务非常相似。

最终,你将创建一个构建触发器,当代码被推送到它时,启动一个持续集成管道。

要在源码中创建一个仓库,请按照以下步骤进行。

  • 在云控制台的菜单中,点击Source Repositories
  • 点击按钮Add repository
  • 选择Create a new repository 并点击Continue
  • 将资源库命名为devops-repo
  • 从列表中选择你当前的项目ID。
  • 然后,点击Create

下面的图片显示了创建的资源库。刷新页面以验证已上传的代码。

Source Repository

  • 回到云控制台仪表板,点击顶部菜单栏的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

该程序将显示在一个新的浏览器标签中,如图所示。

Result of deployment

  • 要停止该程序,请返回云控制台并在云外壳中按下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-repo Git 仓库。
  • 选择.*(any branch) 作为分支。
  • 选择Dockerfile 作为构建配置,并选择默认图像。

注意:下面的图片描述了你的构建配置的方式。

Configuration

  • 接受其余的默认值,然后点击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 BuildBuild TriggersContainer Registry ,建立了一条持续集成管道。

你学到了当代码库中出现更新时,如何使用构建触发器来实现管道的自动化。你还了解了git的基本命令以及如何从头开始启动Flask服务器。