如何为CircleCI Docker镜像创建CI/CD流水线

如果您正在寻找一种测试和部署您的 CircleCI Docker 镜像的方法,创建一个 CI/CD 流水线可以帮助您大大改善软件交付。

在本教程中,您将学习如何可能为您的 Docker 镜像使用 CircleCI 开发 CI/CD 流水线。

继续阅读并部署您的 Docker 镜像,前提是它们通过了测试!

先决条件

本教程将进行实践演示。如果您想跟着做,请确保您具备以下条件:

创建基于 Python 的应用程序的 Docker 镜像

在开始创建 CI/CD 流水线之前,您将首先构建一个基于 Python 应用程序的 Docker 镜像,该应用程序在 Web 浏览器上显示文本。您将简要介绍应用程序的构建过程,编写应用程序的测试用例,然后将应用程序容器化。

1. 打开您的终端,并运行以下命令来安装 Flask 和 Pytest。Flask是一个用于在Python中构建Web应用程序的框架,而Pytest用于编写Python代码的测试。

pip install flask pytest

2. 接下来,使用您喜欢的名称创建一个项目目录,但在本演示中,项目目录被称为flask-circleci。这个目录是您将存储本教程资源的地方。

mkdir flask-circleci

3. 创建一个名为flask-circleci/main.py的文件,并填入以下代码。

下面的代码在浏览器的主页上显示“欢迎来到我的Flask应用”文本。

from flask import Flask

app = Flask(__name__) #创建刚刚导入的Flask类的实例

@app.route('/')
def main():
    #在主页中显示一个字符串
    return "Welcome to my Flask App"

4. 现在,创建另一个名为flask-circleci/test_main.py的文件,并复制/粘贴以下代码。

下面的代码为您的应用程序创建一个测试客户端。

Pytest要求您的测试文件名以test_开头,如下所示。

from main import app

def test_main():
		# 为该应用程序创建一个测试客户端。
    response = app.test_client().get('/') 

		# 断言页面('/')的状态码为200
    assert response.status_code == 200 
		# 断言返回页面的语句
    assert response.data == b'Welcome to my Flask App' 

5. 运行以下命令以导航到您的项目目录(flask-circleci),运行项目的测试。

cd flask-circleci
pytest

如果测试成功,您将会得到100%的进度,如下所示。

Running Test for the Project

6. 接下来,在根目录下创建一个文本文件(requirements.txt)来记录您的依赖关系,并填写下面的文本。构建Docker镜像时,此文件对于使其正常工作至关重要。

Flask==2.0.3
pytest==6.2.5

7. 最后,在flask-circleci/Dockerfile中创建一个新文件,并将下面的指令写入Dockerfile以构建您的Docker镜像。

Dockerfile中的指令执行以下操作:

  • 在您的镜像中创建一个文件。
  • 将当前目录中的所有文件复制到当前目录中的文件(flask-circleci)。
  • 运行您的代码
# 设置基础镜像,您的镜像将基于此构建
FROM python:3.8 
# 在根目录创建名为 flask-circleci 的目录
# 此目录将包含当前代码所在的位置
RUN mkdir /flask-circleci

# 将工作目录设置为 /flask-circleci
WORKDIR /flask-circleci

# 将您的 requirements 文件复制到刚刚创建的目录
COPY requirements.txt /flask-circleci 

RUN pip install -r requirements.txt

# 将本地机器上的当前目录复制到图像中的 /flask-circleci
ADD . /flask-circleci

EXPOSE 5000

CMD python main.py

创建 CircleCI CI/CD 流水线

现在您的 Docker 镜像已准备就绪,您将创建一个 CI/CD 流水线来测试您的代码,如果所有测试都通过,则将 Docker 镜像推送到 Docker Hub。Docker Hub 是一个类似于 GitHub 的服务,但专为 Docker 镜像而设计,帮助您在团队或其他开发人员之间找到并共享容器镜像。

要创建 CI/CD 流水线,请按照以下步骤操作:

1. 打开您喜欢的网络浏览器并登录到您的 Docker Hub 帐户

2. 在 Docker Hub 主页上,点击 创建仓库 选项以在 Docker Hub 上创建一个仓库。

Creating a Repository

3. 为您的存储库设置一个唯一的名称。本教程使用一个名为circleci-tutorial的存储库,如下所示。

Naming and Creating the Docker Hub Repository

4. 在项目的根目录下创建一个新文件(flask-circleci/config.yml),并将下面的代码复制/粘贴到config.yml文件中。

以下代码获取一个现成的Python镜像,并使用它安装依赖项并运行单元测试,以构建并推送您的Docker镜像到您的存储库 Docker Hub。

通常,对于一个实际项目,您会希望将用户名和密码保护在CircleCI中,或者放在一个 .env 文件中。

version: 2  # CircleCI 版本
jobs:
  build:
    docker:
      - image: python:3.8
    steps:
      - checkout

      - run:
        # 为您的项目创建一个虚拟环境,
				# 在其中安装依赖项并运行测试
          name: Run unit tests
          command: |
            python3 -m venv venv
            . venv/bin/activate
            pip install -r requirements.txt
            pytest
			# 创建一个远程 Docker 环境,配置以执行 Docker 命令。
      - setup_remote_docker 
       
      - run:
        # 安装将用于运行 Docker 命令的 Docker 客户端
          name: Install Docker client
          command: |
            set -x
            VER="17.03.0-ce"
            curl -L -o /tmp/docker-$VER.tgz https://get.docker.com/builds/Linux/x86_64/docker-$VER.tgz
            tar -xz -C /tmp -f /tmp/docker-$VER.tgz
            mv /tmp/docker/* /usr/bin
      - run:
         # 构建要推送到 Docker Hub 的 Docker 镜像
				 # 标签 (-t) 模式如下,其中 CircleCI 
				 # 从当前目录获取 Dockerfile。
         # 
          name: Build Docker image
          command: docker build -t khabdrick/circleci-tutorial:v1 .

      - run:
        # 将您创建的 Docker 镜像推送到 Docker Hub。
        # 将 khabdrick/circleci-tutorial:v1 替换为上述构建镜像时使用的
				# 
          name: Push to Docker Hub
          command: |
            docker login -u username -p password
            docker push khabdrick/circleci-tutorial:v1

5. 最后,在项目的根目录上运行以下命令将代码提交推送到您的 GitHub 仓库。

git add . # 将更改添加到暂存区
git commit -m "update" # 提交您的更改
git push # 推送到 GitHub

激活CircleCI CI/CD流水线

您刚刚创建了CircleCI CI/CD流水线,但目前它只是静置在那里,没有做太多事情。您需要通过在CircleCI帐户中设置项目来激活您的流水线。

1. 使用您的GitHub帐户在Web浏览器上登录到您的CircleCI帐户

2. 接下来,在左侧面板上点击项目选项卡,然后在项目右侧点击设置项目按钮以激活项目上的CircleCI流水线。

由于您使用GitHub帐户登录到CircleCI,您的项目将与CircleCI同步,就像下面的图片中所示。

Setting up a Project

3. 返回仪表板选项卡,您将看到成功状态。成功状态表示一切都按预期运行,图像已推送到您的Docker Hub存储库。

单击构建以查看流水线中运行的所有步骤。

Viewing Project Status

在下面,您可以看到CircleCI执行流水线所采取的步骤列表。

Viewing Steps that Ran the Pipeline

4. 最后,切换回到您的Docker Hub存储库,您将看到通过CircleCI流水线推送到Docker Hub的图像。

Viewing Pushed circleci docker images in Docker Hub Repository

将更改推送到GitHub以触发CircleCI流水线

到现在,您已经有一个可工作的CircleCI流水线了。但也许您对项目进行了更改。如果是这样,您如何知道流水线仍然有效呢?您可以通过将更改推送到您的GitHub存储库来触发CircleCI,并查看测试是否成功。

1. 在您的本地计算机上,使用以下代码替换您在test_main.py中的代码。下面的代码故意确保测试失败,因为状态代码从200更改为400

from main import app

def test_main():
		# 为此应用程序创建一个测试客户端。
    response = app.test_client().get('/') 

		# 当页面('/')的状态代码不是400时,断言页面('/')的状态代码为400,
		# 导致测试失败。
    assert response.status_code == 400 
		# 断言页面的返回语句
    assert response.data == b'Flask App' 

2. 接下来,使用以下代码替换config.yml中构建Docker镜像并将其推送到Docker Hub的steps

在下面的代码中,您只是更改版本以确保仅将新更改推送到您的GitHub存储库。

      - run:
          name: Build Docker image
          command: docker build -t khabdrick/circleci-tutorial:v2 .

      - run:
          name: Push to DockerHub
          command: |
            docker login -u username -p password
            docker push khabdrick/circleci-tutorial:v2

3. 在您项目的根目录下运行以下命令来commitpush代码到您的GitHub存储库。

git add . # 将更改添加到暂存区
git commit -m "v2" # 提交您的更改
git push # 推送到GitHub

4. 现在,转到您的CircleCI仪表板,您将看到构建失败,如下所示。

点击“构建”以查看推送更改所采取的步骤,并确认导致构建失败的原因。

Viewing Project Status (Failed)
Showing Failed Tests

5. 最后,导航到您的Docker Hub存储库,并确认更改未被推送。

如下图所示,v2未上传,因为测试失败了。

Viewing Repository in Docker Hub

结论

通过本教程,您学会了如何编写测试,并将您的Python应用程序Docker化。您使用CircleCI创建了一个CI/CD流水线,该流水线运行应用程序的测试并将Docker镜像推送到Docker Hub。

到目前为止,您已经掌握了使用CircleCI开发CI/CD流水线的基础知识。现在,您打算如何运用这些新获得的知识呢?也许创建一个CI/CD流水线,将您的Docker镜像部署到Heroku

Source:
https://adamtheautomator.com/circleci-docker-images/