GitLab-CI和node.js-如何启动本地服务器然后运行测试?

fan*_*fan 5 mocha.js node.js gitlab gitlab-ci gitlab-ci-runner

我已经设置了GitLab-CI,并且正在编写我的代码.gitlab-ci.yml来运行测试。我的应用程序是用node.js编写的,文件如下所示:

before_script:
  - npm install
  - node server.js

stages:
  - test

job_name:
  stage: test
  script:
    - npm run test
Run Code Online (Sandbox Code Playgroud)

我在启动服务器然后运行测试时遇到了麻烦,因为node server.js创建了一个前台进程,除非您手动执行,否则它永远不会存在。有没有一种方法可以启动服务器,然后继续运行,然后在测试完成后将其停止?

还是我实际上做错了,我的服务器应该自己开始进行测试吗?我读过的所有内容都只是说“然后在另一个终端中启动节点,然后对本地服务器运行测试”,但这在自动化CI系统中显然毫无意义吗?

Mao*_*Mao 5

或者,您可以使用nohup命令在后台启动服务器。

$ nohup node server.js &

&在行尾用于返回到提示符)

在你的例子中:

before_script:
  - npm install
  - nohup node server.js &

stages:
  - test

job_name:
  stage: test
  script:
    - npm run test 
Run Code Online (Sandbox Code Playgroud)


小智 3

我有完全相同的设置,使用 gitlab-ci docker runner。您不需要node server.js在启动测试之前启动,您可以让测试运行程序来处理它。我使用 Mocha + Chai(带有 chai-http)。您也可以使用 supertest 来执行相同的操作。

它会在每次测试之前查找可用端口,这样您就不会遇到端口冲突的情况。

它看起来是这样的:

var chai = require('chai');
var chaiHttp = require('chai-http');
// Interesting part
var app = require('../server/server');
var loginUser = require('./login.js');
var auth = {token: ''};

chai.use(chaiHttp);
chai.should();

describe('/users', function() {

  beforeEach(function(done) {
    loginUser(auth, done);
  });

  it('returns users as JSON', function(done) {
    // This is what launch the server
    chai.request(app)
    .get('/api/users')
    .set('Authorization', auth.token)
    .then(function (res) {
      res.should.have.status(200);
      res.should.be.json;
      res.body.should.be.instanceof(Array).and.have.length(1);
      res.body[0].should.have.property('username').equal('admin');
      done();
    })
    .catch(function (err) {
      return done(err);
    });
  });
});
Run Code Online (Sandbox Code Playgroud)