如何用CircleCI和GitHub建立持续集成

905 阅读7分钟

本教程包括:

  1. 创建一个简单的Python应用程序(使用Flask)。
  2. 为这个应用程序编写测试
  3. 添加config.yml 文件

持续集成(CI)涉及到在项目中的功能分支被合并到Git主分支之前的自动化测试。这可以确保代码库不会因为某些变化而被更新。另一方面,持续交付(CD)是在CI的基础上,对这些分支或主分支进行自动化发布。这使得小规模的增量更新能够更快地到达你的用户,符合敏捷软件开发理念。

在这篇文章中,我将带你了解GitHub的CI/CD流程。我们将使用一个Python应用程序来演示我们的CI管道

我将带领你完成这些步骤。

  1. 创建一个简单的Python应用程序(使用Flask)
  2. 为这个应用程序创建测试
  3. 添加config.yml 文件
  4. 推送到GitHub
  5. 配置CircleCI
  6. 用徽章更新我们的README
  7. 创建一个PR,看看CircleCI的运行情况

前提条件

要跟上这个教程,需要一些东西。

  1. 在您的本地系统上安装Python
  2. 一个CircleCI账户
  3. 一个GitHub账户

创建一个简单的Python应用程序

为了创建我们的应用程序,我们将使用Flask,一个Python的微框架。在我们的练习中,对该框架的最小知识是必要的。

构建应用程序

首先,创建一个项目目录(文件夹)和cd 到其中。在终端键入这个内容。

mkdir python_app && cd $_/

接下来,打开你喜欢的编辑器,创建一个hello.py 文件。然后,将以下几行复制到该文件中。

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

Python中的虚拟环境

在Python中工作时,强烈建议你使用虚拟环境。这允许你在一个抽象的环境中安装Python包,而不是你的整个本地机器。做到这一点的一些常见方法是使用 virtualenv或者,甚至更好。 virtualenvwrapper.我们将使用作为 Python3 的一部分的模块venv

创建虚拟环境。

python3 -m venv venv

你可以为你的虚拟环境使用其他名字,如下例所示。

python3 -m venv Env

激活环境。

source venv/bin/activate

如果你为环境使用了另一个名字,用这个名字替换venv 。你会注意到环境名称就在 shell 提示符之前,这告诉你虚拟环境已经激活。任何安装的 Python 包都将安装在这个环境中。要停用这个环境,只需运行。

deactivate

运行应用程序

现在是时候在你的编辑器中创建一个requirements.txt 文件了。在文件中添加Flask ,然后保存。

Flask

然后,在虚拟环境中,通过运行以下命令来安装该软件包。

pip install -r requirements.txt

运行这个应用程序的最终命令是。

FLASK_APP=hello.py flask run

在你的浏览器上进入http://localhost:5000/ ,查看该应用程序。

创建测试

在你的编辑器中,创建一个tests.py 文件,并将这些行粘贴到其中。

from hello import app
with app.test_client() as c:
    response = c.get('/')
    assert response.data == b'Hello World!'
    assert response.status_code == 200

现在你可以运行测试了。打开终端并运行。

python3 tests.py

没有任何东西会被返回到你的终端。为什么? 我们构造了我们的Flask应用,所以它在通过时不会输出到终端。没有终端输出意味着你的测试是通过的。前面提到的资源提供了更详细的例子,说明终端如何处理通过和失败的测试。

创建一个CircleCI配置文件

创建一个.circleci 文件夹。在该文件夹中,创建一个 config.yml文件。然后,将这几行复制到其中。

version: 2.1
jobs:
  build:
    docker:
      - image: cimg/python:3.10.1
    steps:
      - checkout
      - restore_cache:
          key: deps1-{{ .Branch }}-{{ checksum "requirements.txt" }}
      - run:
          command: |
            python3 -m venv venv
            . venv/bin/activate
            pip install -r requirements.txt
      - save_cache:
          key: deps1-{{ .Branch }}-{{ checksum "requirements.txt" }}
          paths:
            - "venv"
      - run:
          name: Running tests
          command: |
            . venv/bin/activate
            python3 tests.py
      - store_artifacts:
          path: test-reports/
          destination: python_app

推送到GitHub

使用早期和经常提交代码的理念,我们会在这个过程中更早地初始化Git,并且我们会有原子提交。因为本教程是关于CircleCI和GitHub的集成,所以我故意把它搁置到现在。

目前的代码结构看起来是这样的。

.
├── .circleci
│   └── config.yml
├── hello.py
├── requirements.txt
└── tests.py

打开你的编辑器,在工作目录中创建一个.gitignore 文件。我们将用这个文件来说明哪些文件和文件夹希望提交给Git。将以下几行复制到该文件中。

# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]

# Virtualenv
venv/*

通过运行以下命令提交你的代码。

git add .
git commit -m "Initial commit"

如果你还没有GitHub账户,请到GitHub的主页上创建一个。如果你是GitHub的新手,你可能需要阅读关于推送项目到GitHub的教程。然后,到github.com/new 创建一个仓库。

我将使用python_app 这个名字,其余的默认设置保持不变,然后点击创建仓库的按钮。(如果不可见,请向下滚动)。

GitHub create repo

创建完你的新版本库后,你会进入一个类似这样的页面。

Newly created repo

选择第二个选项,推送一个现有的版本库。运行。

git remote add origin git@github.com:NdagiStanley/python_app.git
git branch -M main
git push -u origin main

配置CircleCI

现在仓库已经在GitHub上,我们可以通过配置CircleCI来完成CI。前往CircleCI的注册页面。如果你还没有,用你的GitHub账户注册CircleCI。

CircleCI

登录后,确保你的个人GitHub账户是激活的。如果您在几个GitHub组织中,其中一个可能已经激活。只要点击下拉菜单(左上角),选择你的GitHub用户名。然后,点击添加项目。最近的项目,'python_app',就列在那里。

CircleCI project

在包括我们项目的那一行的右边点击设置项目

在重定向的页面上,你会注意到三个选项(Fastest、Faster和Fast),选择Fastest作为默认选项。我们将使用这个默认选项。注意其他两个选项的描述。

在GitHub分支的输入栏中输入main(注意该栏下面的文字,确认有.circleci/config.yml 文件),然后点击Set Up Project

2022-04-14-cci-config

没过多久,构建就通过了。成功了!

Passing build

重要的是,你要熟悉这个项目可以改变的设置。现在我将谈谈与我们有关的内容。

在右上角,点击项目设置(带有齿轮图标的按钮)。然后点击左边的高级

CircleCI settings

找到Only build pull requests卡(如果你有必要,可以向下滚动)。默认情况下,它是关闭的。这意味着每个推送到GitHub的项目都会在CircleCI上运行,包括PR。如果你认为有必要,可以随时切换。有时,在一个大的团队环境中,建议这样做以缓和构建时间。

README - 状态徽章

在我们的本地机器上,通过运行检查出到另一个 Git 分支。

git checkout -b add_readme

打开你的编辑器,创建一个README.md 文件。复制并粘贴以下几行到这个文件中,相应地替换掉用户名NdagiStanley

# PYTHON APPLICATION

This Python application repo was created to showcase the integration between GitHub and CircleCI.

[![CircleCI](https://circleci.com/gh/NdagiStanley/python_app.svg?style=svg)](https://circleci.com/gh/NdagiStanley/python_app)

这样就增加了一个标题、一个简短的描述和一个状态徽章

现在,运行以下命令。

git add .
git commit -m "Add README"
git push -u origin add_readme

如果你去看GitHub repo,https://github.com/<< username >>/python_app ,你会发现我们有一个新的分支:add_readme 。点击比较并拉动请求

GitHub branch

打开一个拉动请求

这是我设置PR的方法。

PR的标题是自动生成的,作为提交信息。我在描述中输入了以下内容,但这是可选的。

#### What does this PR do?

Adds README.md file and a CircleCI badge in it.

点击 "创建拉动请求",很快你就有了一个成功的构建!

GitHub PR

注意,我点击了显示所有检查,以显示成功的检查是来自CircleCI。(现在它显示了隐藏所有检查的选项。)甚至浏览器的标签favicon也显示了成功运行的绿色勾。

如果你点击隐藏所有检查下面的细节,你将被重定向到CircleCI上的构建。

The build on CircleCI

在顶部,点击python_app。你将被重定向到这个项目的构建。

CircleCI builds

总结

你已经拥有了它!我们已经把GitHub和CircleCI整合在一起了。

综上所述,我们建立了一个Python应用程序,并为其创建了测试。然后我们创建了一个CircleCI配置文件,并将代码库推送到GitHub。最后,我们把我们创建的GitHub仓库连接到CircleCI。

现在你可以在GitHub中设置自己的项目,并在CircleCI上配置CI构建。恭喜你开始了持续集成的实践!让你的团队其他成员参与进来,通过增加更多的应用程序、更多的测试和自动化部署来提高水平。