github集成自动化测试circleci

自动化测试

持续集成和持续部署是现在软件开发中必不可少的过程,任何软件都需要经过不断迭代,而每次迭代都需要进行大量的功能和单元测试,因此开发人员开发出了自动化测试框架,这样每次进行功能迭代的时候都会进行自动测试,如果没有问题就可以实现自动部署。

CircleCI

CircleCI是面向全球最佳工程团队的持续集成平台,它支持docker部署,它有自己的镜像源,支持docker-compose管理,它支持公有云部署,也支持私有云部署,你可以自己搭建集成测试环境,也可以使用它提供的服务器进行集成测试。

使用步骤

首先你需要注册一个账号,当然了,你也可以直接使用github账号进行授权登录,这样的化,你就相当于将一部分权限授权给circleci,这样你的github的仓库就可以使用它进行集成测试。

登录之后,你可以进入它的管理后台,然后你会看见你的github上创建的公共仓库,你有两种方式来进行配置你的项目。

  • 通过它提供的向导来生成配置文件
  • 自己去github的项目中创建.circleci/config.yml文件

一开始推荐你采用第一种方式,因为它会给你模板进行修改,你可以根据你的项目语言,快速选择对应的配置文件模板,然后它会自动写入到你的github项目中,然后并进行第一次集成测试。

配置说明

下面是一个简单的node的配置文件

# Use the latest 2.1 version of CircleCI pipeline process engine.
# See: https://circleci.com/docs/2.0/configuration-reference
version: 2.1

orbs:
  # The Node.js orb contains a set of prepackaged CircleCI configuration you can utilize
  # Orbs reduce the amount of configuration required for common tasks.
  # See the orb documentation here: https://circleci.com/developer/orbs/orb/circleci/node
  node: circleci/node@4.7

jobs:
  # Below is the definition of your job to build and test your app, you can rename and customize it as you want.
  build-and-test:
    # These next lines define a Docker executor: https://circleci.com/docs/2.0/executor-types/
    # You can specify an image from Dockerhub or use one of our Convenience Images from CircleCI's Developer Hub.
    # A list of available CircleCI Docker Convenience Images are available here: https://circleci.com/developer/images/image/cimg/node
    docker:
      - image: cimg/node:16.10
    # Then run your tests!
    # CircleCI will report the results back to your VCS provider.
    steps:
      # Checkout the code as the first step.
      - checkout
      # Next, the node orb's install-packages step will install the dependencies from a package.json.
      # The orb install-packages step will also automatically cache them for faster future runs.
      - node/install-packages:
          # If you are using yarn, change the line below from "npm" to "yarn"
          pkg-manager: npm
      - run:
          name: Run tests
          command: npm test

workflows:
  # Below is the definition of your workflow.
  # Inside the workflow, you provide the jobs you want to run, e.g this workflow runs the build-and-test job above.
  # CircleCI will run this workflow on every commit.
  # For more details on extending your workflow, see the configuration docs: https://circleci.com/docs/2.0/configuration-reference/#workflows
  sample:
    jobs:
      - build-and-test
      # For running simple node tests, you could optionally use the node/test job from the orb to replicate and replace the job above in fewer lines.
      # - node/test

我们简单来说明下这个文件,至于具体的每个参数,可以到官方进行手册查询。

version指的是版本号,不同版本的参数可能有不同的定义,这个需要注意 orbs 这是一个circleci提供的官方仓库,在这里你可以选择不同的版本环境,比如不同版本的jdk,不同版本的php,不同版本的node,不同版本的.net等等。 jobs这个是配置的关键,我们要执行的测试命令,环境配置都是在这里进行配置。 build-and-test这是测试配置文件名,这里我们可以进行自定义 docker这个使用来配置我们的测试环境的,一般这里可以选择node环境,或者php环境,或者golang环境,这里的版本可以在官网找到。 steps后买的是具体的操作命令,比如签出代码,环境初始化,安装依赖,进行测试。 checkout表示在测试环境中拉去github上的代码 node/install-packages这里主要指的是配置一些依赖,比如npm install,composer install等。 run指的是要执行的一些命令,每个命令都有一些参数,下面的是我从官网截取的参数。

command Y   String  Command to run via the shell
name    N   String  Title of the step to be shown in the CircleCI UI (default: full command)
shell   N   String  Shell to use for execution command (default: See Default Shell Options)
environment N   Map Additional environmental variables, locally scoped to command
background  N   Boolean Whether or not this step should run in the background (default: false)
working_directory   N   String  In which directory to run this step. Will be interpreted relative to the working_directory of the job). (default: .)
no_output_timeout   N   String  Elapsed time the command can run without output. The string is a decimal with unit suffix, such as “20m”, “1.25h”, “5s”. The default is 10 minutes and the maximum is governed by the maximum time a job is allowed to run.
when    N   String  Specify when to enable or disable the step. Takes the following values: always, on_success, on_fail (default: on_success)

后面的workflows表示工作流,可以看到一个workflows里面可以创建多个jobs.

数据库测试

对于普通的测试没有什么需要特殊说明的,需要特殊说明的是数据库测试,circleci是支持多种数据库测试的,这里我以mysql为例。

ersion: 2.0
jobs:
  build:
    working_directory: /your/workdir
    docker:
      - image: your/image_for_primary_container
        auth:
          username: mydockerhub-user
          password: $DOCKERHUB_PASSWORD  # context / project UI env-var reference
      - image: mysql:5.6.50

        environment:
          MYSQL_DATABASE: test_db
          MYSQL_USER: user
          MYSQL_PASSWORD: passw0rd
    steps:
      - checkout
      - run:
          name: install dockerize
          command: wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz && sudo tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz
          environment:
            DOCKERIZE_VERSION: v0.3.0
      - run:
          name: Wait for db
          command: dockerize -wait tcp://localhost:3306 -timeout 1m

mysql容器安装的时候,是不能进行之后的测试的,我们需要等待mysql连接成功才可以进行测试,因此

dockerize -wait tcp://localhost:3306 -timeout 1m

就是在等待mysql容器创建成功,调用这个之后,我们再进行后面的测试。

install dockerize

这个命令非常关键,否则你会发现你的mysql虽然从镜像源拉去安装成功了,但是就是无法连接成功,而加上这个容器初始化,就可以连接成功了。

总结

对于circleci的测试,其实还有很多细节需要注意,而这些细节就是平时你在使用的时候多注意文档才能避免犯错误,另外需要注意的是,一定要注意版本,不同的版本,可能命令会有不同,就是不同的mysql版本,可能对于数据库的初始化,密码的初始化都是有不同的关联的,在遇到问题的时候,第一个是先看看官方文档是否有说明,要记住,官网的搜索功能其实很强大的。