使用GitLab-CICD进行自动测试和部署
使用GitLab CI/CD进行自动测试和部署
1.基本概念
1.1 CI/CD
CI,Continuous Integration,为持续集成。即在代码构建过程中持续地进行代码的集成、构建、以及自动化测试等;有了 CI 工具,我们可以在代码提交的过程中通过单元测试等尽早地发现引入的错误;
CD,Continuous Deployment,为持续交付。在代码构建完毕后,可以方便地将新版本部署上线,这样有利于快速迭代并交付产品。
1.2 GitLab CI/CD
GitLab CI/CD是一套基于 GitLab 的 CI/CD 系统,可以让开发人员通过 .gitlab-ci.yml 在项目中配置 CI/CD 流程,在提交后,系统可以自动执行任务,完成 CI/CD 操作。而且,它的配置非常简单。GitLab CI/CD是由独立的runner程序完成,runner采用go语言编写,因此可以很好的进行跨平台,通常可以将runner部署到任何gitlab server之外的服务器,从而避免对gitlab server的影响。
2.GitLab CI/CD与其他CI/CD工具的区别及其优势
相比其他的CI/CD工具,gitlab CI/CD配置简单,很容易与gitlab集成,与jenkins相比,不需要配置webhook回调地址,也不需要同时在jenkins新建这个项目的编译配置,只需在工程中配置gitlab-ci.yml文件,就可以让这个工程可以进行编译。而且gitlab CI/CD的过程通过gitlab上的界面可以看到。
3.执行流程
整个 CI 环节有三个默认的Stage:build、test 和deploy。
build 被首先执行。如果发生错误,本次 CI 立刻失败;
test 在 build 成功执行完毕后执行。如果发生错误,本次 CI 立刻失败;
deploy 在 test 成功执行完毕后执行。如果发生错误,本次 CI 失败。
如果一个job没有指定stage,默认为test stage。
3.示例项目
3.1 项目详情
tutorial是一个简单的flask应用。
bp = Blueprint('tutorial', __name__)
@bp.route('/', methods=['GET'])
def hello():
return "Hello World!!!"
docker-compose.yml、Dockerfile 为 docker 的配置文件,用于部署上面的 flask 应用。
Dockerfile:
FROM python:3.6.5
RUN mkdir -p /var/www/gitlab-ci-example
WORKDIR /var/www/gitlab-ci-example
ADD . /var/www/gitlab-ci-example/
RUN pip install -U pip && pip install -r requirement.txt -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
docker-compose.yml:
version: "3"
services:
app:
build: .
container_name: tutorial_app
command: gunicorn -c gunicorn.py app:app
ports: - "50001:5000"
volumes: - .:/var/www/gitlab-ci-example
network_mode: bridge
3.2 CI/CD 配置
在项目中的根目录创建 .gitlab-ci.yml 文件,来配置 CI/CD 流程。
在 .gitlab-ci.yml 的开头,定义好所有阶段、以及执行每个任务之前所需要的环境变量以及准备工作,然后定义整个流程中包含的所有任务。
下面示例主要流程有测试 → 部署。
image: "instrumentisto/rsync-ssh"
variables:
PIP_CACHE_DIR: "~/.cache/pip/"
cache:
paths: - ${PIP_CACHE_DIR}
stages:
- build
- test
- deploy
build_job:
stage: build
script: - echo "build something" - echo "build_job done"
test_job:
stage: test
image: "python:3.6.5"
before_script: - pip -V - pip install -r requirement.txt -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
script: # 运行测试命令或脚本 - python tests/test_view.py
- echo "test something"
- echo "test_job done"
deploy_job:
stage: deploy
when: manual
before_script: - target_address= "服务器地址" - ssh-keyscan ${target_address} > ~/.ssh/known_hosts - chmod 644 ~/.ssh/known_hosts
script: # ssh 连接远程服务器执行相应命令 # 更新代码、重启 docker 等操作 - project_name=gitlab-ci-example - stage_srv=gamesdk@${target_address} - work_dir=/home/apps
- rsync -av -e ssh --exclude='*.git' ./ ${stage_srv}:${work_dir}/${project_name}
- ssh ${stage_srv} "docker-compose -f ${work_dir}/${project_name}/docker-compose.yml up -d --build"
- ssh ${stage_srv} "docker-compose -f ${work_dir}/${project_name}/docker-compose.yml ps"
- echo "deploy something"
- echo "deploy_job done"
only: - master
3.3 自动测试
在测试任务中,准备工作是把需要的环境和库安装上,在 before_script 中完成。
完成该准备工作后就可以在 script 在执行测试命令或执行测试脚本等。
3.4 自动部署
在部署任务中,准备工作是把需要操作的服务器的公钥指纹收集到 known_hosts 中。
接着,把最新代码同步到服务器对应目录,然后通过 ssh 在服务器上执行相应的部署操作(启动或重启 docker 服务)。
运行成功后访问相应地址的 50001 端口即可看见“Hello World!!!”。