-
Notifications
You must be signed in to change notification settings - Fork 493
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(plugins/scripts-runner): introduce exec command to run scripts
This commit introduces a new feature that enables users to run (migration) scripts. Similar to deployment hooks, scripts are functions that may perform operations on newly deployed Smart Contracts. Therefore a script needs to export a function that has access to some dependencies: ``` // scripts/001-some-script.js module.exports = async ({contracts, web3, logger}) => { ... }; ``` Where `contracts` is a map of newly deployed Smart Contract instances, `web3` a blockchain connector instance and `logger` Embark's logger instance. Script functions can but don't have to be `async`. To execute such a script users use the newly introduced `exec` command: ``` $ embark exec development scripts/001-some-script.js ``` In the example above, `development` defines the environment in which Smart Contracts are being deployed to as well as where tracking data is stored. Alternativey, users can also provide a directory in which case Embark will try to execute every script living inside of it: ``` $ embark exec development scripts ``` Scripts can fail and therefore emit an error accordingly. When this happens, Embark will abort the script execution (in case multiple are scheduled to run) and informs the user about the original error: ``` .. 001_foo.js running.... Script '001_foo.js' failed to execute. Original error: Error: Some error ``` It's recommended for scripts to emit proper instances of `Error`. (Migration) scripts can be tracked as well but there are a couple of rules to be aware of: - Generally, tracking all scripts that have been executed by default is not a good thing because some scripts might be one-off operations. - OTOH, there might be scripts that should always be tracked by default - Therefore, we introduce a dedicated `migrations` directory in which scripts live that should be tracked by default - Any other scripts that does not live in the specified `migrations` directory will not be tracked **unless** - The new `--track` option was provided For more information see: https://notes.status.im/h8XwB7xkR7GKnfNh6OnPMQ
- Loading branch information
1 parent
0f59e0c
commit 40c3d98
Showing
22 changed files
with
927 additions
and
32 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -108,5 +108,6 @@ | |
}, | ||
"environments": { | ||
"development": "development" | ||
} | ||
} | ||
}, | ||
"defaultMigrationsDir": "migrations" | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
embark-scripts-runner | ||
========================== | ||
|
||
> Embark Scripts Runner | ||
Plugin to run migration scripts for Smart Contract Deployment | ||
|
||
Visit [embark.status.im](https://embark.status.im/) to get started with | ||
[Embark](https://github.com/embarklabs/embark). | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
{ | ||
"name": "embark-scripts-runner", | ||
"version": "5.1.0", | ||
"description": "Embark Scripts Runner", | ||
"repository": { | ||
"directory": "packages/plugins/scripts-runner", | ||
"type": "git", | ||
"url": "https://github.com/embarklabs/embark/" | ||
}, | ||
"author": "Iuri Matias <iuri.matias@gmail.com>", | ||
"license": "MIT", | ||
"bugs": "https://github.com/embarklabs/embark/issues", | ||
"keywords": [], | ||
"files": [ | ||
"dist/" | ||
], | ||
"main": "./dist/index.js", | ||
"types": "./dist/index.d.ts", | ||
"embark-collective": { | ||
"build:node": true, | ||
"typecheck": true | ||
}, | ||
"scripts": { | ||
"_build": "npm run solo -- build", | ||
"_typecheck": "npm run solo -- typecheck", | ||
"ci": "npm run qa", | ||
"clean": "npm run reset", | ||
"lint": "npm-run-all lint:*", | ||
"lint:ts": "tslint -c tslint.json \"src/**/*.ts\"", | ||
"qa": "npm-run-all lint _typecheck _build test", | ||
"reset": "npx rimraf dist embark-*.tgz package", | ||
"solo": "embark-solo", | ||
"test": "jest" | ||
}, | ||
"dependencies": { | ||
"async": "2.6.1", | ||
"@babel/runtime-corejs3": "7.7.4", | ||
"core-js-pure": "3.6.4", | ||
"embark-core": "^5.2.0-nightly.1", | ||
"embark-i18n": "^5.1.1", | ||
"embark-logger": "^5.1.2-nightly.0", | ||
"embark-utils": "^5.2.0-nightly.1", | ||
"fs-extra": "8.1.0", | ||
"web3": "1.2.4" | ||
}, | ||
"devDependencies": { | ||
"@babel/core": "7.7.4", | ||
"@types/node": "^10.5.3", | ||
"babel-jest": "24.9.0", | ||
"embark-solo": "^5.1.1-nightly.2", | ||
"embark-testing": "^5.1.0", | ||
"jest": "24.9.0", | ||
"npm-run-all": "4.1.5", | ||
"rimraf": "3.0.0", | ||
"tmp-promise": "1.1.0" | ||
}, | ||
"engines": { | ||
"node": ">=10.17.0", | ||
"npm": ">=6.11.3", | ||
"yarn": ">=1.19.1" | ||
}, | ||
"jest": { | ||
"collectCoverage": true, | ||
"testEnvironment": "node", | ||
"testMatch": [ | ||
"**/test/**/*.js" | ||
], | ||
"transform": { | ||
"\\.(js|ts)$": [ | ||
"babel-jest", | ||
{ | ||
"rootMode": "upward" | ||
} | ||
] | ||
} | ||
} | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
import path from 'path'; | ||
import { Stats } from 'fs'; | ||
|
||
enum FileType { | ||
SymbolicLink = 'symbolic link', | ||
Socket = 'socket', | ||
Unknown = 'unknown' | ||
} | ||
|
||
export class InitializationError extends Error { | ||
|
||
name = 'InitalizationError'; | ||
|
||
constructor(public innerError: Error) { | ||
super(); | ||
this.message = `Failed to initalize tracking file: Orignal Error: ${innerError}`; | ||
} | ||
} | ||
|
||
export class UnsupportedTargetError extends Error { | ||
|
||
name = 'UnsupportedTargetError'; | ||
|
||
constructor(public stats: Stats) { | ||
super(); | ||
// We can't access `this` before `super()` is called so we have to | ||
// set `this.message` after that to get a dedicated error message. | ||
this.setMessage(); | ||
} | ||
|
||
private setMessage() { | ||
let ftype = FileType.Unknown; | ||
if (this.stats.isSymbolicLink()) { | ||
ftype = FileType.SymbolicLink; | ||
} else if (this.stats.isSocket()) { | ||
ftype = FileType.Socket; | ||
} | ||
this.message = `Script execution target not supported. Expected file path or directory, got ${ftype} type.`; | ||
} | ||
} | ||
|
||
export class ScriptExecutionError extends Error { | ||
|
||
name = 'ScriptExecutionError'; | ||
|
||
constructor(public target: string, public innerError: Error) { | ||
super(); | ||
this.message = `Script '${path.basename(target)}' failed to execute. Original error: ${innerError.stack}`; | ||
} | ||
} | ||
|
||
export class ScriptTrackingError extends Error { | ||
|
||
name = 'ScriptTrackingError'; | ||
|
||
constructor(public innerError: Error) { | ||
super(); | ||
this.message = `Couldn't track script due execption. Original error: ${innerError.stack}`; | ||
} | ||
} |
Oops, something went wrong.