1. 授权认证
  2. 获取用户个人信息
  3. 项目协同
  4. 代码托管
  5. 持续集成
  6. 制品仓库
  7. 测试管理
  1. 项目协同
  2. 代码仓库
  3. DevOps 实践之旅
  4. 一分钟开始持续集成之旅
  5. 持续部署
  6. 制品库

Python + Flask 构建应用

FlaskPython 中最流行的 Web 框架之一,以小巧、灵活、可扩展性强著称。相比 Django,它给了开发者最大限度的自由。

本文将通过一个简单的 Demo 项目,来演示如何在 CODING 持续集成 中快速集成 Python + Flask 项目,并利用 Jenkins 进行构建,之后推送至 CODING 制品库

准备工作

当然,你还需要一个 CODING 账号 :) 立即注册

1. 初始化代码

这里我已经为大家准备好了一个 Python + Flask 的 Demo 项目: python-flask-demo,可供大家参考。

想自己搭建项目的同学,也可以通过一些脚手架工具来快速搭建起来,比如 PyCharm 就提供了 Flask 项目的快速创建方式:

创建Flask项目-1

填好项目位置以及项目名称之后,点击 Create 即可完成创建:

创建Flask项目-2

这时我们可以在 Terminal 中输入 python3 app.py 来直接运行我们的 Demo 项目:

运行Demo项目

可以看到,我们的 Flask Demo app 已经运行在了本地的 5000 端口。在浏览器中直接访问 http://127.0.0.1:5000 来验证:

测试项目

项目文件解释

这里以我准备好的 python-flask-demo 项目的目录结构来做讲解:

python-flask-demo
├── .gitignore
├── Dockerfile
├── Jenkinsfile
├── README.rst
├── app.py
└── requirements.txt

0 directories, 5 files
  • .gitignore

    可以在内声明一些不需要加入到 Git 管理的文件或文件夹,这样就不用每次提交代码的时候再特地处理这些文件了。

  • Dockerfile

    Dockerfile 就是我们用来构建 Docker 镜像的源码,Docker 可以读取里面的指令来自动构建镜像。

  • Jenkinsfile:

    Jenkinsfile 是一个文本文件,它包含了 Jenkins 流水线的定义并被检入源代码控制仓库。

  • README.rst

    由开发者写给其他人阅读的一个文本文件,描述了这是个什么样的项目,有什么用,如何安装和使用等。

  • app.py

    包含 main 函数的主要程序代码文件。

  • requirements.txt

    requirements.txt 可以保证项目依赖包版本的确定性, 不会因为依赖更新而导致异常产生,通常可以由 pip 来生成

2. 编译/构建

什么是编译/构建

编译(Compiling) 就是帮我们将 源代码 文件通过 编译器 转换为 目标文件 的过程。

编译(Compiling)构建(Building) 的一个部分,构建还包括:链接(Linking)**、测试(Testing)** 等环节。

为什么需要编译/构建

我们开发时所写的源代码,都是写给人看的,机器并不理解其意。而若想在计算机上运行一个应用程序,则必须将该程序由 源代码 转换成计算机所能理解的 二进制机器码。为此,我们需要将程序编译成可执行文件,通过构建来执行更加工程化、结构化、严谨的一系列步骤,并将产出的 制品 部署上生产环境。

在将我们开发的程序给他人使用时,他人的系统中可能并没有安装 Python 环境或没有安装第三方库,这个时候如果要求对方去装环境并不太现实,会特别不方便,特别是当对方不是个技术人员的时候。这个时候如果我们将开发好的程序编译打包成一个可执行文件,那么一切就会变得简单起来。

如何编译/构建

在进行编程操作的时候,我们常常会遇到很多与编程无关的项目管理工作,如下载依赖编译源码单元测试项目部署 等操作。一般的,小型项目我们可以手动实现这些操作,然而大型项目这些工作则相对复杂。构建工具 是帮助我们实现一系列项目管理、测试和部署操作的工具。同时,它能大大提升我们的效率。

由于本章我们使用的是 Python,所以这里介绍并演示下如何以 PyInstaller 来编译打包 Python 项目。

PyInstaller 自身支持跨平台,并且自身基础操作十分简单、易上手。这里拿我们的 python-flask-demo 项目来做示例(此处不介绍安装步骤,请自行前往 官网 或者 GitHub 上查看相关文档):

PyInstaller打包项目

由于我们的项目十分简单,只有一个 app.py 源代码文件,所以这里使用 -F Flag,来编译生成单个可执行文件。

pyinstaller -F app.py

运行命令,在产生了许多编译日志之后,在项目下生成了两个新目录:builddist

PyInstaller编译后的图示

这里我们可以看到 dist 目录下生成了一个可执行程序 app。这就是我们这次编译所得到的主要制品了,下面让我们来运行一下它看看:

测试Demo项目

可以看到,执行这个可执行文件之后,出现了和之前运行 python3 app.py 相同的日志,并且在访问本地的 http://127.0.0.1:5000/ 的时候,同样返回了我们一个 Hello World

3. 使用 CODING 持续集成实现自动化

在上述操作中,存在着一些完全可以抽离出来自动化的步骤。比如我们每次写完代码,在提交前要进行编译、单元测试,而这些步骤的操作可能大致相同,那么我们是不是可以把这些步骤交给某个自动化的工具来完成呢?甚至你可能已经写好了编译、测试的脚本,只需要运行一下即可,那么我们甚至可以把这个运行脚本的步骤也抽离出去。

使用 CODING 持续集成,可以帮助我们很好的自动化这些重复的工作。我们需要做的只是编写好一次编译、测试脚本,或者 Jenkinsfile,那么之后我们只需要提交代码至远端,即可自动触发构建,并及时编译、测试,如果在期间发现代码有问题,CODING 持续集成还能及时通过多种形式通知到你,让你及时发现错误、改正错误,而不是等合进 master 分支后才发现。

接下来我将演示如何使用 CODING 持续集成 来将我们上面的项目编译以及测试等。

推送代码至 CODING 项目

如果你使用的就是 CODING 项目,那么你可以直接跳过这一步。如果你还没有,则可以参考我们的帮助文档

创建持续集成计划

  1. 首先,进入你的项目,选择左侧导航栏中的 持续集成,然后点击其右侧的构建
    项目
  1. 点击新建构建计划配置
    持续集成

  2. 输入计划名称,这里 代码源 我们选用 CODING,代码仓库 选择我们刚才创建好的项目即可,配置来源 我们可以选用代码仓库中的 Jenkinsfile,也可以使用下面的静态配置的 Jenkinsfile 模板我们内置了具有代表性的一些模板,也欢迎你向我们提供模板或者提出需要某种模板的需求。如果你对 Jenkins 有所了解,你也可以选择 自定义构建过程
    新建构建计划

  3. 如果你使用的是上面提供的 Demo 项目,那么新建成功后我们就会默认进入到 图形化的编辑器 的页面:
    图形化编辑器

当然如果你喜欢通过代码直接编辑 Jenkinsfile,也可以选择 文本编辑器
文本编辑器

至此,我们的 CODING 持续集成构建计划已创建完毕,你还可以根据自身情况,来修改持续集成的 触发规则变量与缓存 以及 通知提醒 等。
导航栏

开始构建

我们返回至 持续集成 -> 构建 页面,此时可以看到我们刚新建的 构建计划,现在,我们可以开始构建我们的项目了。

  1. 点击右上角的 立即构建 按钮:
    构建记录

  2. 点击后会弹出一个 立即构建 的窗口,我们可以在此选择 构建目标,目标可以是你的任意 Git branch,或者 Tag,亦或 commit ID 都行。

    我们还可以自定义 启动参数,自定义的启动参数将会在构建期间以 环境变量 的形式注入到 Jenkins Pipeline 之中。

    确认之后我们即可点击下方的 立即构建 来开启我们的构建:

    立即构建

  3. 此时 CODING 持续集成已经在为你的项目依照之前的配置开启了构建:

    -准备构建:

    准备构建

    -构建成功:

    构建成功

    -构建详情:

    构建详情

  4. 检查制品库中是否已有我们构建好的 Docker 镜像:

    -首先在侧边栏中点击 制品库 进入制品库页面:

    制品库侧边栏

    -在该页面中,我们可以看到构建成功后的 Docker 镜像已被我们成功推送至制品库内,我们可以随时将其 拉取 下来,推送 至其他制品库,或者共享出去,将其运行后访问 5000 端口即会返回一个 Hello World

    制品库

Jenkinsfile 文件代码解释

pipeline {
  agent any
  // 环境变量,全局可用
  environment {
    // 你的企业唯一标识
    ENTERPRISE = "coding-public"
    // 项目名称
    PROJECT = "python-flask-demo"
    // 制品仓库名称
    ARTIFACT_REPO = "registry"
    // Docker 镜像名称
    IMAGE_NAME = "python-flask-demo"
    // CODING DOMAIN,无需更改
    CODING_DOMAIN = "coding.net"

    // 制品库 Registry 的基础 HOST,无需更改
    ARTIFACT_BASE = "${ENTERPRISE}-docker.pkg.${CODING_DOMAIN}"
    // Docker 镜像全名,无需更改
    ARTIFACT_IMAGE = "${ARTIFACT_BASE}/${PROJECT}/${ARTIFACT_REPO}/${IMAGE_NAME}"
  }
  stages {
    stage('检出') {
      steps {
        // Git checkout,无需更改
        checkout([
          $class: 'GitSCM',
          branches: [[name: env.GIT_BUILD_REF]],
          userRemoteConfigs: [[url: env.GIT_REPO_URL, credentialsId: env.CREDENTIALS_ID]]
        ])
      }
    }
    stage('打包镜像') {
      steps {
        // 根据项目根目录下的 Dockerfile 制作镜像
        sh "docker build -t ${ARTIFACT_IMAGE}:${env.GIT_BUILD_REF} ."
    // 将制作出来的镜像打上标签
        sh "docker tag ${ARTIFACT_IMAGE}:${env.GIT_BUILD_REF} ${ARTIFACT_IMAGE}:latest"
      }
    }
    stage('推送到制品库') {
      steps {
    script {
      // 推送至制品库
          docker.withRegistry("https://${ARTIFACT_BASE}", "${env.DOCKER_REGISTRY_CREDENTIALS_ID}") {
            docker.image("${ARTIFACT_IMAGE}:${env.GIT_BUILD_REF}").push()
               docker.image("${ARTIFACT_IMAGE}:latest").push()
          }
        }
      }
    }
  }
}

结语

本文介绍了如何利用 CODING 的 持续集成、制品库 来帮你的应用通过 Jenkins 自动化构建、测试等。并通过一个 Python + Flask 的 Demo 示例来进一步带你一步一步的实践。

上一篇构建 Node + Express 应用
最近更新
感谢反馈有用
感谢反馈没用