Skip to content

Commit

Permalink
feat: Add healthcheck command (#122)
Browse files Browse the repository at this point in the history
* Implement healthcheck command

* Update ci cache key

This should fix the following error in CI:

```
error computing cache key: template: cacheKey:1:47: executing "cacheKey" at <checksum "yarn.lock">: error calling checksum: open /home/circleci/cli/yarn.lock: no such file or directory
```

This is because we don't actually have a yarn lock file

* Make the linter happy

* Extend `Command`, remove `percyWillRun`.
  • Loading branch information
Robdel12 authored Apr 3, 2019
1 parent 9876a31 commit 5560d6a
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 2 deletions.
2 changes: 1 addition & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ jobs:
- checkout
- restore_cache: &restore_cache
keys:
- v1-yarn-{{checksum ".circleci/config.yml"}}-{{ checksum "yarn.lock"}}
- v1-yarn-{{checksum ".circleci/config.yml"}}-{{ checksum "package-lock.json"}}
- v1-yarn-{{checksum ".circleci/config.yml"}}
- run: .circleci/greenkeeper
- run: yarn add -D nyc@11 @oclif/nyc-config@1 mocha-junit-reporter@1
Expand Down
31 changes: 31 additions & 0 deletions src/commands/health-check.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import {Command, flags} from '@oclif/command'
import * as colors from 'colors'
import Constants from '../services/constants'
import healthCheck from '../utils/health-checker'

export default class HealthCheck extends Command {
static description = 'Determines if the Percy Agent process is currently running'
static hidden = true

static flags = {
port: flags.integer({
char: 'p',
default: Constants.PORT,
description: 'port',
}),
}

static examples = [
'$ percy healthcheck',
'$ percy healthcheck --port 6884',
]

async run() {
const {flags} = this.parse(HealthCheck)
const port = flags.port as number

await healthCheck(port, {
shouldRetry: () => false,
})
}
}
3 changes: 2 additions & 1 deletion src/utils/health-checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@ import Axios from 'axios'
import * as retryAxios from 'retry-axios'
import logger from './logger'

async function healthCheck(port: number) {
async function healthCheck(port: number, retryOptions?: object) {
const healthcheckUrl = `http://localhost:${port}/percy/healthcheck`

const retryConfig = {
retry: 5, // with exponential back off
retryDelay: 500,
shouldRetry: () => true,
...retryOptions,
}

const interceptorId = retryAxios.attach()
Expand Down
52 changes: 52 additions & 0 deletions test/commands/health-check.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import * as chai from 'chai'
import {describe} from 'mocha'
import * as nock from 'nock'
import HealthCheck from '../../src/commands/health-check'
import {captureStdErr, captureStdOut} from '../helpers/stdout'

const expect = chai.expect

describe('Health check', () => {
describe('when agent is running', () => {
beforeEach(() => {
nock(/localhost/).get('/percy/healthcheck').reply(200)
})

afterEach(() => {
nock.cleanAll()
})

it('messages that agent is ready', async () => {
const stdout = await captureStdOut(async () => HealthCheck.run([]))

expect(stdout).to.contain('[percy] percy is ready.')
})
})

describe('when agent is not running', () => {
beforeEach(() => {
nock(/localhost/).get('/percy/healthcheck').reply(500)
})

afterEach(() => {
nock.cleanAll()
})

it('messages that agent is not ready', async () => {
const errorStdout = await captureStdErr(async () => HealthCheck.run([]))

expect(errorStdout).to
.contain('[percy] Failed to establish a connection with http://localhost:5338/percy/healthcheck')
})

it('properly passes the port', async () => {
const port = '5899'
const errorStdout = await captureStdErr(async () =>
HealthCheck.run(['--port', port]),
)

expect(errorStdout).to
.contain('[percy] Failed to establish a connection with http://localhost:5899/percy/healthcheck')
})
})
})

0 comments on commit 5560d6a

Please sign in to comment.