今年5月份已经更新完成了GitLabCI教程,补充一下关于Python的交付流水线实现。这里只做一个通用的Demo,很多细节还需大家自行根据实际情况进行优化与补充。

 

首先,我们需要在github中找一个Python项目,如果具有编码能力也可以写一个简单web app。以下项目是一个Flask项目,简单的web应用。这个项目之前使用的是Jenkins完成的持续交付,现在改造成GitlabCI完成。

 

基于GitLabCI的Python交付流水线实现_基于GitLabCI的Python交付流

 

一般一个Python项目的发布,可能会包含以下步骤:

  • 使用pip安装依赖模块

  • 编译目录下所有python源文件为pyc

  • junit单元测试

  • 代码扫描

  • 构建Docker镜像

  • 发布到Kubernetes

 

Pipeline

这里我们根据之前的最佳实践工作流来设计Python流水线,我们需要设置构建镜像为python:3.7,设置Pip缓存、配置Pip源加速构建。创建一个dockerfile
  •  
FROM python:3.7
# copy all filesRUN mkdir helloCOPY . /helloWORKDIR /hello
# install required librariesRUN pip install Flask -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.comRUN pip install Flask_Script -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
EXPOSE 5000
CMD ["python", "run.py"]

 

创建流水线

  •  
include:  - project: 'cidevops/cidevops-newci-service'    ref: master    file: 'templates/default-pipeline.yml'
variables: ## 全局配置 GIT_CLONE_PATH: ${CI_BUILDS_DIR}/builds/${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}/${CI_PIPELINE_ID} GIT_CHECKOUT: "false"
## 作业控制 RUN_PIPELINE_BUILD: "yes" #是否运行构建 yes/no RUN_PIPELINE_TEST: "no" #是否运行测试 yes/no RUN_CODE_ANALYSIS: "yes" #是否代码扫描 yes/no RUN_BUILD_IMAGE: "yes" #是否生成镜像 yes/no RUN_DEPLOY_ARTIFACTS: "no" #是否上传制品 yes/no RUN_DEPLOY_K8S: "yes" #是否发布K8S yes/no
## 依赖容器镜像 BUILD_IMAGE: "python:3.7" CURL_IMAGE: "curlimages/curl:7.70.0" SONAR_IMAGE: "sonarsource/sonar-scanner-cli:latest" KUBECTL_IMAGE: "lucj/kubectl:1.17.2"

## 构建测试参数 PIP_CACHE_DIR: "/home/gitlab-runner/ci-build-cache/pip-cache" BUILD_SHELL: "python -m compileall . "

## 单元测试参数 TEST_SHELL : ' ' #测试命令 JUNIT_REPORT_PATH: 'target/surefire-reports/TEST-*.xml' #单元测试报告
## 代码扫描 SONAR_SOURCE_DIR : "." #项目源码目录 SONAR_SERVER_URL: "http://192.168.1.200:30090" #SonarQube服务器信息 SONAR_SERVER_LOGIN: "ee2bcb37deeb6dfe3a07fe08fb529559b00c1b7b" #Sonar Token最好在项目中定义。 SONAR_SCAN_ARGS: "-Dsonar.sources=${SONAR_SOURCE_DIR} " #项目扫描参数
## 构建镜像 CI_REGISTRY: 'registry.cn-beijing.aliyuncs.com' #镜像仓库地址 CI_REGISTRY_USER: 'xxxxx' #仓库用户信息 #CI_REGISTRY_PASSWD: 'xxxxxxxx.' #仓库用户密码 IMAGE_NAME: "${CI_REGISTRY}/${CI_PROJECT_PATH}:${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHORT_SHA}" #镜像名称 DOCKER_FILE_PATH: "./Dockerfile" #Dockerfile位置
## 上传制品库(artifactory) #ARTIFACTORY_URL: "http://192.168.1.200:30082/artifactory" #制品库地址 #ARTIFACTORY_NAME: "${CI_PROJECT_NAMESPACE}" #制品库名称 #ARTIFACT_PACKAGE: "jar" #制品类型 #ARTIFACT_PATH: "target/*.${ARTIFACT_PACKAGE}" #制品位置 #TARGET_FILE_PATH: "${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}/${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHORT_SHA}" #目标制品位置(目录结构) #TARGET_ARTIFACT_NAME: "${CI_PROJECT_NAME}-${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHORT_SHA}.${ARTIFACT_PACKAGE}" #目标制品名称
## 部署应用k8s APP_NAME: "$CI_PROJECT_NAME" #应用名称 <-->deploymentName CONTAINER_PORT: "5000" #服务端口 <--> servicesPort NAMESPACE: "$CI_PROJECT_NAME-$CI_PROJECT_ID-$CI_ENVIRONMENT_SLUG" #名称空间 ENV_URL: "${ENV_NAME}.${CI_PROJECT_NAMESPACE}.${CI_PROJECT_NAME}.devops.com/hello" #IngressHosts

build: before_script: - "pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com " extends: .build

 

 

实验截图

基于GitLabCI的Python交付流水线实现_基于GitLabCI的Python交付流_02

 

基于GitLabCI的Python交付流水线实现_基于GitLabCI的Python交付流_03

 

基于GitLabCI的Python交付流水线实现_基于GitLabCI的Python交付流_04

 

基于GitLabCI的Python交付流水线实现_基于GitLabCI的Python交付流_05