Skip to content

Commit 09cc58c

Browse files
committed
Merge branch 'develop', prepare 0.14.0
2 parents cacb856 + 7a7aabb commit 09cc58c

File tree

9 files changed

+72
-46
lines changed

9 files changed

+72
-46
lines changed

docs/Basics.md

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
# Basics
22

3+
### Concepts
4+
5+
- **Project** - one or more deployments grouped together (e.g. started via docker-compose)
6+
- **Deployment** - one and only one deployed service
7+
38
### Commands
49

510
| Command | Description |
611
| ---------------------- | ----------- |
712
| deploy [path] | Deploy specified path |
813
| config | Generate or update project config for current path |
914
| list | List currently deployed projects |
10-
| rm [project] | Remove existing project |
11-
| log [project] | Get logs for existing project |
15+
| rm [id] | Remove existing deployment or project |
16+
| log [id] | Get logs for existing deployment or project |
1217
| login | Login into Exoframe server |
1318
| endpoint [url] | Gets or sets the endpoint of Exoframe server |
1419
| completion | Generates bash completion script |
@@ -22,16 +27,20 @@ If it doesn't exist during deployment, Exoframe will generate simple config file
2227
Config file has the following structure:
2328
```js
2429
{
25-
// project name
30+
// deployment name
2631
// defaults to folder name
27-
"name": "project-name",
32+
"name": "deployment-name",
2833
// restart policy [optional]
2934
// see docker docs for more info
3035
// defaults to "on-failure:2"
3136
"restart": "on-failure:2",
3237
// domain to be assigned to project [optional]
3338
// no domain is assigned by default
39+
// can be set to "false" to disable auto-assignment of domain
3440
"domain": "www.project.domain.com",
41+
// project name [optional]
42+
// by default assembled using deployment name and username
43+
"project": "project-name",
3544
// object of key-values for env vars [optional]
3645
// no env vars are assigned by default
3746
"env": {

package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
"cli-table": "^0.3.1",
1919
"got": "^7.1.0",
2020
"ignore": "^3.3.0",
21-
"inquirer": "^3.2.0",
22-
"js-yaml": "^3.9.0",
21+
"inquirer": "^3.2.1",
22+
"js-yaml": "^3.9.1",
2323
"jsonwebtoken": "^7.4.1",
2424
"lodash": "^4.17.4",
2525
"ora": "^1.2.0",
@@ -29,7 +29,7 @@
2929
"devDependencies": {
3030
"coveralls": "^2.13.1",
3131
"nock": "^9.0.14",
32-
"sinon": "^2.3.8",
33-
"tap": "^10.3.2"
32+
"sinon": "^2.4.1",
33+
"tap": "^10.7.1"
3434
}
3535
}

src/commands/config.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ exports.handler = async () => {
1919
let defaultConfig = {
2020
name: folderName,
2121
domain: '',
22+
project: '',
2223
restart: 'on-failure:2',
2324
env: undefined,
2425
hostname: '',
@@ -56,6 +57,13 @@ exports.handler = async () => {
5657
default: defaultConfig.domain,
5758
filter,
5859
});
60+
prompts.push({
61+
type: 'input',
62+
name: 'project',
63+
message: 'Project [optional]:',
64+
default: defaultConfig.project,
65+
filter,
66+
});
5967
prompts.push({
6068
type: 'input',
6169
name: 'env',
@@ -80,12 +88,15 @@ exports.handler = async () => {
8088
choices: ['no', 'on-failure:2', 'always'],
8189
});
8290
// get values from user
83-
const {name, domain, env, hostname, restart} = await inquirer.prompt(prompts);
91+
const {name, domain, project, env, hostname, restart} = await inquirer.prompt(prompts);
8492
// init config object
8593
const config = {name, restart};
8694
if (domain && domain.length) {
8795
config.domain = domain;
8896
}
97+
if (project && project.length) {
98+
config.project = project;
99+
}
89100
if (env && env.length) {
90101
config.env = env
91102
.split(',')

src/commands/list.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ exports.handler = async () => {
5353
const formattedServices = services.map(svc => {
5454
const name = svc.Name.slice(1);
5555
const domain = svc.Config.Labels['traefik.frontend.rule']
56-
? `http://${svc.Config.Labels['traefik.frontend.rule'].replace('Host:', '')}`
56+
? svc.Config.Labels['traefik.frontend.rule'].replace('Host:', '')
5757
: 'Not set';
5858
const aliases = svc.NetworkSettings.Networks.exoframe.Aliases
5959
? svc.NetworkSettings.Networks.exoframe.Aliases.filter(alias => !svc.Id.startsWith(alias))

src/commands/logs.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ exports.handler = ({id}) =>
1414
return;
1515
}
1616

17-
console.log(chalk.bold('Getting logs for deployment:'), id);
17+
console.log(chalk.bold('Getting logs for deployment:'), id, '\n');
1818

1919
// services request url
2020
const remoteUrl = `${userConfig.endpoint}/logs/${id}`;
@@ -46,17 +46,21 @@ exports.handler = ({id}) =>
4646
const d = buf.toString();
4747
const lines = d.split('\n');
4848
lines
49-
.map(line => line.replace(/^\u0001.+?\d/, '').replace(/\n+$/, ''))
49+
.map(line => line.replace(/^\u0001.+?(\d)/g, '$1').replace(/\n+$/, ''))
5050
.filter(line => line && line.length > 0)
5151
.map(line => {
52+
if (line.startsWith('Logs for')) {
53+
return {date: null, msg: `${chalk.bold(line)}\n`};
54+
}
55+
5256
const parts = line.split(/\dZ\s/);
5357
const date = new Date(parts[0]);
5458
const msg = parts[1];
5559
return {date, msg};
5660
})
5761
.filter(({date, msg}) => date !== undefined && msg !== undefined)
5862
.map(({date, msg}) => ({
59-
date: isFinite(date) ? `${date.toLocaleDateString()} ${date.toLocaleTimeString()}` : ' ',
63+
date: date && isFinite(date) ? `${date.toLocaleDateString()} ${date.toLocaleTimeString()}` : ' ',
6064
msg,
6165
}))
6266
.map(({date, msg}) => `${chalk.gray(`${date}`)} ${msg}`)

test/config.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ module.exports = () => {
1313
const configData = {
1414
name: 'test',
1515
domain: 'test.dev',
16+
project: 'test-project',
1617
env: 'ENV=1, OTHER=2',
1718
hostname: 'host',
1819
restart: 'no',
@@ -44,6 +45,7 @@ module.exports = () => {
4445
t.equal(cfg.name, configData.name, 'Correct name');
4546
t.equal(cfg.restart, configData.restart, 'Correct restart policy');
4647
t.equal(cfg.domain, configData.domain, 'Correct domain');
48+
t.equal(cfg.project, configData.project, 'Correct project');
4749
t.equal(cfg.hostname, configData.hostname, 'Correct hostname');
4850
t.equal(cfg.env.ENV, '1', 'Correct ENV var');
4951
t.equal(cfg.env.OTHER, '2', 'Correct OTHER var');

test/list.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,9 @@ module.exports = () => {
8080
['Deployments for test:'],
8181
[],
8282
[
83-
' ID URL Hostname Status \n' +
84-
' test http://test.host Not set Up 10 minutes \n' +
85-
' test2 Not set Not set Up 12 minutes ',
83+
' ID URL Hostname Status \n' +
84+
' test test.host Not set Up 10 minutes \n' +
85+
' test2 Not set Not set Up 12 minutes ',
8686
],
8787
[],
8888
['Other deployments:'],

test/logs.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ module.exports = () => {
1313
const date2 = '2017-05-18T15:16:40.212591019Z';
1414
const date3 = '2017-05-18T15:16:40.375554362Z';
1515
const dirtyLogs = [
16-
`\u0001\u0000\u0000\u0000\u0000\u0000\u00002${date1} yarn start v0.24.4`,
17-
`\u0001\u0000\u0000\u0000\u0000\u0000\u00000${date2} $ node index.js `,
18-
`\u0001\u0000\u0000\u0000\u0000\u0000\u00004${date3} Listening on port 80`,
16+
`\u0001\u0000\u0000\u0000\u0000\u0000\u0000g${date1} yarn start v0.24.4`,
17+
`\u0001\u0000\u0000\u0000\u0000\u0000\u0000${date2} $ node index.js `,
18+
`\u0001\u0000\u0000\u0000\u0000\u0000\u0000${date3} Listening on port 80`,
1919
'',
2020
];
2121

@@ -46,7 +46,7 @@ module.exports = () => {
4646
t.deepEqual(
4747
consoleSpy.args,
4848
[
49-
['Getting logs for deployment:', id],
49+
['Getting logs for deployment:', id, '\n'],
5050
[`${d1.toLocaleDateString()} ${d1.toLocaleTimeString()} yarn start v0.24.4`],
5151
[`${d2.toLocaleDateString()} ${d2.toLocaleTimeString()} $ node index.js `],
5252
[`${d3.toLocaleDateString()} ${d3.toLocaleTimeString()} Listening on port 80`],

yarn.lock

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,8 @@ babel-messages@^6.23.0:
130130
babel-runtime "^6.22.0"
131131

132132
babel-runtime@^6.22.0:
133-
version "6.23.0"
134-
resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b"
133+
version "6.25.0"
134+
resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.25.0.tgz#33b98eaa5d482bb01a8d1aa6b437ad2b01aec41c"
135135
dependencies:
136136
core-js "^2.4.0"
137137
regenerator-runtime "^0.10.0"
@@ -823,9 +823,9 @@ inherits@2, inherits@~2.0.3:
823823
version "2.0.3"
824824
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
825825

826-
inquirer@^3.2.0:
827-
version "3.2.0"
828-
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.2.0.tgz#45b44c2160c729d7578c54060b3eed94487bb42b"
826+
inquirer@^3.2.1:
827+
version "3.2.1"
828+
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.2.1.tgz#06ceb0f540f45ca548c17d6840959878265fa175"
829829
dependencies:
830830
ansi-escapes "^2.0.0"
831831
chalk "^2.0.0"
@@ -1067,9 +1067,9 @@ [email protected]:
10671067
argparse "^1.0.7"
10681068
esprima "^2.6.0"
10691069

1070-
js-yaml@^3.2.7, js-yaml@^3.3.1, js-yaml@^3.9.0:
1071-
version "3.9.0"
1072-
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.9.0.tgz#4ffbbf25c2ac963b8299dc74da7e3740de1c18ce"
1070+
js-yaml@^3.2.7, js-yaml@^3.3.1, js-yaml@^3.9.1:
1071+
version "3.9.1"
1072+
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.9.1.tgz#08775cebdfdd359209f0d2acd383c8f86a6904a0"
10731073
dependencies:
10741074
argparse "^1.0.7"
10751075
esprima "^4.0.0"
@@ -1269,15 +1269,15 @@ micromatch@^2.3.11:
12691269
parse-glob "^3.0.4"
12701270
regex-cache "^0.4.2"
12711271

1272-
mime-db@~1.27.0:
1273-
version "1.27.0"
1274-
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1"
1272+
mime-db@~1.29.0:
1273+
version "1.29.0"
1274+
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.29.0.tgz#48d26d235589651704ac5916ca06001914266878"
12751275

12761276
mime-types@^2.1.12, mime-types@~2.1.7:
1277-
version "2.1.15"
1278-
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed"
1277+
version "2.1.16"
1278+
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.16.tgz#2b858a52e5ecd516db897ac2be87487830698e23"
12791279
dependencies:
1280-
mime-db "~1.27.0"
1280+
mime-db "~1.29.0"
12811281

12821282
mimic-fn@^1.0.0:
12831283
version "1.1.0"
@@ -1366,7 +1366,7 @@ number-is-nan@^1.0.0:
13661366
version "1.0.1"
13671367
resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
13681368

1369-
nyc@^11.0.2-candidate.0:
1369+
nyc@^11.1.0:
13701370
version "11.1.0"
13711371
resolved "https://registry.yarnpkg.com/nyc/-/nyc-11.1.0.tgz#d6b3c5e16892a25af63138ba484676aa8a22eda7"
13721372
dependencies:
@@ -1768,8 +1768,8 @@ [email protected], samsam@^1.1.3:
17681768
resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.2.1.tgz#edd39093a3184370cb859243b2bdf255e7d8ea67"
17691769

17701770
"semver@2 || 3 || 4 || 5", semver@^5.3.0:
1771-
version "5.3.0"
1772-
resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
1771+
version "5.4.1"
1772+
resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
17731773

17741774
set-blocking@^2.0.0:
17751775
version "2.0.0"
@@ -1789,9 +1789,9 @@ signal-exit@^3.0.0, signal-exit@^3.0.1, signal-exit@^3.0.2:
17891789
version "3.0.2"
17901790
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
17911791

1792-
sinon@^2.3.8:
1793-
version "2.3.8"
1794-
resolved "https://registry.yarnpkg.com/sinon/-/sinon-2.3.8.tgz#31de06fed8fba3a671e576dd96d0a5863796f25c"
1792+
sinon@^2.4.1:
1793+
version "2.4.1"
1794+
resolved "https://registry.yarnpkg.com/sinon/-/sinon-2.4.1.tgz#021fd64b54cb77d9d2fb0d43cdedfae7629c3a36"
17951795
dependencies:
17961796
diff "^3.1.0"
17971797
formatio "1.2.0"
@@ -1966,9 +1966,9 @@ tap-parser@^5.1.0, tap-parser@^5.3.1:
19661966
optionalDependencies:
19671967
readable-stream "^2"
19681968

1969-
tap@^10.3.2:
1970-
version "10.7.0"
1971-
resolved "https://registry.yarnpkg.com/tap/-/tap-10.7.0.tgz#ecde1ebd2b86981f741ae089f1448c9f294ac548"
1969+
tap@^10.7.1:
1970+
version "10.7.1"
1971+
resolved "https://registry.yarnpkg.com/tap/-/tap-10.7.1.tgz#f2d20f38a4f6b77717521ef852bf446a7fb79e4e"
19721972
dependencies:
19731973
bind-obj-methods "^1.0.0"
19741974
bluebird "^3.3.1"
@@ -1981,7 +1981,7 @@ tap@^10.3.2:
19811981
glob "^7.0.0"
19821982
isexe "^2.0.0"
19831983
js-yaml "^3.3.1"
1984-
nyc "^11.0.2-candidate.0"
1984+
nyc "^11.1.0"
19851985
opener "^1.4.1"
19861986
os-homedir "^1.0.2"
19871987
own-or "^1.0.0"
@@ -2151,8 +2151,8 @@ which-module@^2.0.0:
21512151
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
21522152

21532153
which@^1.2.4, which@^1.2.9:
2154-
version "1.2.14"
2155-
resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5"
2154+
version "1.3.0"
2155+
resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a"
21562156
dependencies:
21572157
isexe "^2.0.0"
21582158

0 commit comments

Comments
 (0)