@cto.ai/ops-ctrl-forge v1.1.0
@cto.ai/ops-ctrl-forge
cto.ai local developer tools
Status
WIP - do not use
API
This is an ESM module.
forge(opts) => instance
Initialize a forge instance
Options:
dockerMissingRetryOptional Default:false. Each of the instance methods (init,build,run)is an async function generator. If Docker is not installed, or if it's installed but not running this will cause an instance method that relies on Docker to reject. Set this totrueto instead yield an information object withlabel:docker-not-foundordocker-not-runningalong with aretriesproperty containing total retries. In either of these cases execution will be paused untiliter.nextis explicitly called. Callingiter.next({ retry: true })in this scenario will trigger a retry and if succesful execution will continue. Callingiter.next({ retry: false })will trigger the usual error. Below is an example of this advanced use case:
const instance = forge({dockerMissingRetry: true})
const iter = instance.build(buildOptions)
for await (const info of iter) {
if (info.isDockerProblem) {
const retry = await someUserInput()
if (info.retries < 10) await iter.next({ retry }) // triggers retry if `retry` is true
else await iter.next({ retry: false }) // trigger an error
}
// do more stuff with other info objects
}instance.init()
Currently throws ERR_NOT_IMPLEMENTED error.
instance.build(opts) => Async Iterable
Create a build from an Op folder, tar buffer or tar stream (gzipped tars are also accepted). This function is an async function generator and yields info objects as the build operation progresses. These can be consumed like so:
for await (const info of instance.build(buildOptions)) {
// process info objects
}Lifecycle:
The yielded info objects represent the phases or status information of the build operation, each
has a label property describing the phase or status. The possible labels, in order, are as follows:
warning- These may occur during the manifest normalization phase. Contains:{label, code, message, isForgeWarning, isDockerProblem, retries}. TheisForgeWarningproperty is alwaystrue. Seewarnings.jsfor warning codes and messages. Only Docker related warnings will have theisDockerProblemandretriesproperties.building- Indicates that a particular selected item in the manifest is now being built. Contains{label, name, version}docker-output- These info objects contain the lines of output and status updates from docker, there can be any number of these info objects depending on the amount of docker output. Contains{type, label, output}wheretypemay bestreamfor general output orstatusfor status updates.built- Indicates that a particular selected item in the manifest has been built. Contains{label, type, name, version, isPublic, tag, run, publish}. Therunandpublishproperties contain the namespace that would be used to reference the image when running or publishing.
Options:
opRequired -string,BufferorStream. If astringit must be an absolute path to an Op folder. A Buffer must contain a tarball of an Op and a stream must be a read stream of an Op tar ball.apiRequired -string. The CTO.ai API URL. Example:https://www.stg-platform.hc.ai/api/v1registryRequired -string. The Docker hub host. Example:registry.cto.aiselectRequired -array. The names of commands, pipelines or services to build from an op manifest file. Must have at least one matching name.tokensRequired -object. A tokens object, see ops-account-ctrlteamRequired -string. The team that the Op belongs to, this will be used as part of the image build tag name.cacheOptional Default:true-boolean. Set tofalseto set the--no-cacheflag for the Docekr image build.
instance.run()
Currently throws ERR_NOT_IMPLEMENTED error.
Error Handling
Instance methods are async generator functions. Any errors therefore cause a rejection to occur, which when used in an async context (async function or ESM TLA) can be wrapped in a try catch and then handled and/or propagated. The usage pattern is as follows (using instance.build as an example but the same applies to all methods):
try {
for await (const info of instance.build(buildOptions)) {
// process info objects
}
} catch (err) {
// rethrow non-forge errors
if (!err.isForgeError) throw err
// use err.code to decide what to do with the error
}See errors.js for an error code reference.
Engines
- Node 12.4+
- Node 14.0+
Development
Test:
npm testVisual coverage report (run after test):
npm run covLint:
npm run lintAutoformat:
npm run lint -- --fixReleasing
For mainline releases:
npm version <major|minor|patch>
git push --follow-tagsFor prereleases:
npm version prerelease
git push --follow-tagsLicense
MIT