如何為 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

# 將您的需求文件複製到剛剛創建的目錄中
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。
         # <docker_hub_username/docker-hub-password:version>。
          name: Build Docker image
          command: docker build -t khabdrick/circleci-tutorial:v1 .

      - run:
        # 將您創建的 Docker 映像推送到 Docker Hub。
        # 使用上面構建映像時使用的 
				# <docker_hub_username/docker-hub-password:version> 替換 khabdrick/circleci-tutorial:v1
          name: Push to Docker Hub
          command: |
            docker login -u username -p password
            docker push khabdrick/circleci-tutorial:v1

5. 最後,在您專案的根目錄上運行以下命令 commitpush 代碼(flask-circleci/config.yml) 到您的 GitHub 存儲庫。

git add . # 將更改添加到暫存區
git commit -m "update" # 提交您的更改
git push # 推送到 GitHub

啟用 CircleCI CI/CD Pipeline

您剛創建了 CircleCI CI/CD Pipeline,但現在它只是閒置在那裡並沒有做太多事情。您需要通過在 CircleCI 帳戶中設置項目來啟用您的 Pipeline。

1. 使用您的 GitHub 帳戶在網頁瀏覽器上登錄到您的 CircleCI 帳戶

2. 接下來,在左側面板上點擊 Projects 標籤,然後在您的項目右側點擊 Set Up Project 按鈕來啟用該項目上的 CircleCI Pipeline。

由於您使用 GitHub 帳戶登錄到 CircleCI,您的項目將與 CircleCI 同步,就像下面的圖像一樣。

Setting up a Project

3. 返回到 Dashboard 標籤,您將看到 Success 狀態。 Success 狀態表示一切運行正常,圖像已被推送到您的 Docker Hub 存儲庫中。

點擊 build 以查看 Pipeline 中運行的所有步驟。

Viewing Project Status

下面,您可以看到 CircleCI 執行 Pipeline 的步驟列表。

Viewing Steps that Ran the Pipeline

4. 最後,切換回您的 Docker Hub 存儲庫,您將看到通過 CircleCI Pipeline 推送到 Docker Hub 的圖像。

Viewing Pushed circleci docker images in Docker Hub Repository

將更改推送到 GitHub 以觸發 CircleCI Pipeline

現在,您已經擁有一個運作中的 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/