使用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的影响。
[image:D99EEDFD-914D-412F-82E7-24DC61342FD8-1698-000003C71E224AE4/DEBE8619-F834-4438-BA03-E4C074DCB58C.png]
在这里插入图片描述

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。
[image:E4B6FEB1-067D-4DE2-BB31-C84104B9FBBF-1698-000003F69D5F79CB/636722AF-DC4B-41E4-BE31-9688E1B0216E.png]
build 被首先执行。如果发生错误,本次 CI 立刻失败;
test 在 build 成功执行完毕后执行。如果发生错误,本次 CI 立刻失败;
deploy 在 test 成功执行完毕后执行。如果发生错误,本次 CI 失败。
如果一个job没有指定stage,默认为test stage。
[image:13825D59-C029-45F7-87F9-2A893A14FC59-1698-000003F9C6D10BAC/DBC4F637-5B67-4D2F-B130-916BF9B8BF4B.png]

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!!!”。

4.关键字参数

[image:1C80B8FC-F168-4A81-808D-0AB17B75208F-1698-00000431D91CF82A/FFE528B5-48B0-4A26-94FC-D7E48627F84F.png]

参考或引用链接

https://docs.gitlab.com/ee/README.html

https://blog.csdn.net/Choerodon/article/details/97751754

https://segmentfault.com/a/1190000011890710

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值