Compare commits
367 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7eeca992b0 | |||
| d018102014 | |||
| 838f2d6959 | |||
| 0d42e5f6eb | |||
| f96de8cdc3 | |||
| 965833916f | |||
| 81ec1391e3 | |||
| bbbca44640 | |||
| 7ba7dc54a1 | |||
| 4f98eeec2a | |||
| 419a6b9e5f | |||
| 9c040c34f5 | |||
| 50d3f2d795 | |||
| 305856b9e1 | |||
| 3683743f3c | |||
| 41237e0e5f | |||
| bce84a0e74 | |||
| 79bed919d8 | |||
| 4b202ce00e | |||
| 16ca787314 | |||
| 3a9b6f658a | |||
| 5c5dbf303f | |||
| 4c07131e51 | |||
| ba039469ff | |||
| 49f2498ecd | |||
| 1060060366 | |||
| 0fa3a579f7 | |||
| 0e4556d59e | |||
| e2e7967fba | |||
| 45b8d67abf | |||
| 0a69aa5d62 | |||
| dfbab1a1df | |||
| e58f009a24 | |||
| 2afd9cddc5 | |||
| d79c5366ef | |||
| 8e4f7ad244 | |||
| 39de3a1601 | |||
| cb3d2964d1 | |||
| 6b5390cef8 | |||
| 2736b85de3 | |||
| 82d7778f59 | |||
| 8c99cc0491 | |||
| 955e3d0dbe | |||
| 702ae8bed8 | |||
| b6f0723b75 | |||
| 8a2fb30e59 | |||
| 95b4030120 | |||
| 5c77cfbdc2 | |||
| 5ea42320a9 | |||
| d07ebfc9c6 | |||
| bbb5718184 | |||
| 0d8b54637c | |||
| e51b2e28b9 | |||
| f767140cc8 | |||
| 0d4d69f072 | |||
| a3e628c43f | |||
| a58fa135c1 | |||
| 93c7af6c91 | |||
| ad0e12bf7b | |||
| 498dd6eff6 | |||
| b3aa964739 | |||
| 03eb9d2657 | |||
| 373a838a6a | |||
| 960e3f4675 | |||
| 09bf676b58 | |||
| 76ba8e2ab9 | |||
| aaaaca2d19 | |||
| 71b27eda17 | |||
| 2d00882fd7 | |||
| ba5e69041f | |||
| d2871d601a | |||
| 9c66d88dc0 | |||
| fb4c84e1de | |||
| 57aca36f11 | |||
| 905f594af1 | |||
| b788b7f96b | |||
| 319a2dc41a | |||
| e01a998f0e | |||
| e40606d97b | |||
| 449c7b2c04 | |||
| 006782b57f | |||
| d643da29b0 | |||
| 635f92d2bc | |||
| 9a2cb56094 | |||
| 5886283002 | |||
| f886194c9c | |||
| e4efec89d9 | |||
| dbc12a593f | |||
| d7666e862b | |||
| e262d29510 | |||
| 858d97cb5c | |||
| b8a2df66fe | |||
| 1c128dd694 | |||
| 2744d0bf7f | |||
| 9eb232da39 | |||
| 52af1d5188 | |||
| 4325f21c8c | |||
| 6cd3eaceb4 | |||
| f850c79b6c | |||
| efdf789575 | |||
| 6ef6446022 | |||
| ef7d85e7c4 | |||
| 93b5d9869b | |||
| 2a0cfeffe9 | |||
| 909aafbd5f | |||
| 91288e2d74 | |||
| 25709b1f9a | |||
| 8a03d9aa94 | |||
| bbe1cf770a | |||
| ac8190282f | |||
| 446d140e32 | |||
| 726948651e | |||
| dd0a7bb782 | |||
| fca00ffcf8 | |||
| 13f6334ae5 | |||
| 7275a858d6 | |||
| 5a3befe5af | |||
| 385a93a05e | |||
| b4d444ff05 | |||
| 487bcb9a70 | |||
| aaf11b66d7 | |||
| 83d7d46896 | |||
| 693bda6a49 | |||
| bfe3e266ee | |||
| 5f33ebd8a7 | |||
| f78c80e100 | |||
| f4d8656831 | |||
| 2290081ef0 | |||
| 189d02a16f | |||
| 55aee04334 | |||
| 0e407b9b9d | |||
| 24095bbd40 | |||
| f97ee94b5a | |||
| 4cf7aea374 | |||
| 6ab5e9cb30 | |||
| 95c1145bf5 | |||
| ea04a1b788 | |||
| 3bc2499d09 | |||
| 1f5967ac45 | |||
| fd952f086b | |||
| 79500cb2c2 | |||
| 6c58864fcf | |||
| 7ea3ac182d | |||
| 8979d26005 | |||
| c8876dac88 | |||
| 9c8a257c2a | |||
| 8b77930ece | |||
| ba672d030f | |||
| 8ad7e016e7 | |||
| d843311d7b | |||
| 14ef2cfa9b | |||
| 648effcf86 | |||
| 572738e88f | |||
| 129ae93044 | |||
| e910892231 | |||
| 6d9cabf7ee | |||
| 7c7787e811 | |||
| bde26cc312 | |||
| 29e81f3ae7 | |||
| 6337b20d62 | |||
| 6dd537fe43 | |||
| 7191b172a4 | |||
| 9a4611b70f | |||
| 189dbc3654 | |||
| fc95fc96ed | |||
| 467eed57d7 | |||
| a5ca5444a0 | |||
| 17610cb834 | |||
| e1f2b5c6fe | |||
| edbbae0bd0 | |||
| 0e820bec27 | |||
| 91a3d612c6 | |||
| c696730e55 | |||
| 38d38ce246 | |||
| adfdf68c38 | |||
| d4a4d69941 | |||
| c1fed2c758 | |||
| 9918d81f59 | |||
| 59d8338f6e | |||
| a4f8bd3320 | |||
| 7c2fdb7224 | |||
| 37384aeb57 | |||
| 60efda263f | |||
| 19831037ec | |||
| a1d52af813 | |||
| 0a49ff9b03 | |||
| ca62326b46 | |||
| e1de0ee479 | |||
| 0dea101c07 | |||
| 380a49c59f | |||
| 5133651e34 | |||
| c8f26c7c48 | |||
| 3bb5912046 | |||
| d75258d9dd | |||
| b1577e7542 | |||
| d5cdeffd17 | |||
| c62ce415e9 | |||
| 99014da1e8 | |||
| 0b5dada524 | |||
| 40bddba3b5 | |||
| 6f6ee6d799 | |||
| e30cc3f5a0 | |||
| a4562d4d1b | |||
| 524b405773 | |||
| 0d19c1c68d | |||
| cff79bc3b4 | |||
| 28541a838d | |||
| c3ab527341 | |||
| 52cc249098 | |||
| 2e189b0660 | |||
| f876c7414b | |||
| 08b7585cfc | |||
| 76311fab72 | |||
| 1b73df64f5 | |||
| 701cee573b | |||
| 3dd086f711 | |||
| 67ff5d09d4 | |||
| 5cb8a79b6a | |||
| 2dcbca2362 | |||
| bd63194f4b | |||
| 2763fdef5f | |||
| bbedde01b9 | |||
| f26606f757 | |||
| 99b03aa796 | |||
| f30dd3da65 | |||
| d4decddb4b | |||
| 5c2880da1a | |||
| bfffc5b130 | |||
| 8900a13c6b | |||
| d42acf737f | |||
| 77e3b2912d | |||
| 103e470eb4 | |||
| 74c1324e55 | |||
| a1876963a8 | |||
| 5d88e25c99 | |||
| b3c47546e2 | |||
| 6316e81958 | |||
| ff10afbee4 | |||
| 9dbfa77084 | |||
| 46dbd61d89 | |||
| 713df1867a | |||
| 23886c1ed3 | |||
| 0c46b627be | |||
| 622ccd8dd9 | |||
| 0079addfc5 | |||
| 8604c63d37 | |||
| db0b38bd7b | |||
| edde87b6be | |||
| 5085d664cb | |||
| 5d468fc840 | |||
| e2ac6cdcc9 | |||
| fcd04415be | |||
| 1fd1899099 | |||
| 7df7f882d1 | |||
| 348b4d60fd | |||
| 37589fb5e5 | |||
| 3dd115fe42 | |||
| 01c88a6a6c | |||
| f5cacb7400 | |||
| 887da51d78 | |||
| 585703fc55 | |||
| ec3e296d73 | |||
| 33f234cf73 | |||
| e7ec765ed5 | |||
| 2f46197864 | |||
| da44233263 | |||
| cb2430f7b2 | |||
| 5fe9134f4a | |||
| 7681f09d38 | |||
| d55c77560a | |||
| 0e337a3574 | |||
| 94c5567b75 | |||
| 7b37506d4e | |||
| a401633b73 | |||
| 948a8e64d7 | |||
| 9e8fbac573 | |||
| 362740a55f | |||
| 3edc08b0ed | |||
| 15d7e6cbfc | |||
| 6824210da0 | |||
| 41d2d04958 | |||
| e490c6f730 | |||
| bdf4815145 | |||
| 84fdf8b139 | |||
| 545896821d | |||
| c7516458bd | |||
| c2f92e63c5 | |||
| d4116aefdb | |||
| 0f5f1f7772 | |||
| 7722187ea5 | |||
| 734a21c925 | |||
| bb36beb682 | |||
| 3417ca83ed | |||
| dea6264c34 | |||
| b6ca597ca5 | |||
| 1539d49426 | |||
| 51fbc906a0 | |||
| 0e3732cade | |||
| 4f968472c8 | |||
| 68aa8d1302 | |||
| cbfe992ffc | |||
| 6614b1c3d3 | |||
| 20fd6a8d7b | |||
| 81eb0e252e | |||
| ac804886fa | |||
| 36cce95f1d | |||
| 0e4467e324 | |||
| 912063b9a8 | |||
| a7a41523fb | |||
| 1fdc9eb159 | |||
| d6f47a630e | |||
| 13012eaec4 | |||
| 32ef4c2f65 | |||
| 2bc892cb4c | |||
| 0ab1e1ab7c | |||
| c8c17e6cba | |||
| 23dfefd813 | |||
| e180c46ffa | |||
| d86d47f42b | |||
| 38cf8d5ac3 | |||
| 13ca161a8f | |||
| 01f5d9cb68 | |||
| a69a27cfad | |||
| 0c3ab87286 | |||
| 75be6f7974 | |||
| 8a556d6f9e | |||
| d4d4b9449d | |||
| 1d49c629a4 | |||
| 5e579901d5 | |||
| 91d10f8b8f | |||
| 2018dd98bf | |||
| 47667d0d59 | |||
| 49c2e0909d | |||
| 124d7b9f0a | |||
| a38e637e8d | |||
| 6971df069a | |||
| 78e6f13adf | |||
| 4a63e8f225 | |||
| aface1fec6 | |||
| a6424d113b | |||
| d295e36bf4 | |||
| c0aba5d487 | |||
| 0d34e2bc7f | |||
| 46c9df32d8 | |||
| 55014fbdb2 | |||
| c247cc2892 | |||
| 37b3c1abc9 | |||
| 214c523306 | |||
| 1a465f336d | |||
| 11ec419700 | |||
| b9cc0556a8 | |||
| 5eb07f1ad7 | |||
| 10cc7cf581 | |||
| abe2408773 | |||
| 8890caca3d | |||
| 39bab8b43e | |||
| c590c394ba | |||
| 3a93feea26 | |||
| 3666b35ce0 | |||
| 45c91f3dc1 | |||
| 4646862fd6 | |||
| fb95bdfdc0 | |||
| dca4010f97 | |||
| 3b3a303c55 | |||
| 563414882e | |||
| 71c30e7563 | |||
| d89cc90c4b |
66
.gitea/workflows/default_nottags.yaml
Normal file
66
.gitea/workflows/default_nottags.yaml
Normal file
@@ -0,0 +1,66 @@
|
||||
name: Default (not tags)
|
||||
|
||||
on:
|
||||
push:
|
||||
tags-ignore:
|
||||
- '**'
|
||||
|
||||
env:
|
||||
IMAGE: registry.gitlab.com/hosttoday/ht-docker-node:npmci
|
||||
NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}}
|
||||
NPMCI_TOKEN_NPM2: ${{secrets.NPMCI_TOKEN_NPM2}}
|
||||
NPMCI_GIT_GITHUBTOKEN: ${{secrets.NPMCI_GIT_GITHUBTOKEN}}
|
||||
NPMCI_URL_CLOUDLY: ${{secrets.NPMCI_URL_CLOUDLY}}
|
||||
|
||||
jobs:
|
||||
|
||||
security:
|
||||
runs-on: ubuntu-latest
|
||||
continue-on-error: true
|
||||
container:
|
||||
image: ${{ env.IMAGE }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Install pnpm and npmci
|
||||
run: |
|
||||
pnpm install -g pnpm
|
||||
pnpm install -g @shipzone/npmci
|
||||
|
||||
- name: Run npm prepare
|
||||
run: npmci npm prepare
|
||||
|
||||
- name: Audit production dependencies
|
||||
run: |
|
||||
npmci command npm config set registry https://registry.npmjs.org
|
||||
npmci command pnpm audit --audit-level=high --prod
|
||||
continue-on-error: true
|
||||
|
||||
- name: Audit development dependencies
|
||||
run: |
|
||||
npmci command npm config set registry https://registry.npmjs.org
|
||||
npmci command pnpm audit --audit-level=high --dev
|
||||
continue-on-error: true
|
||||
|
||||
test:
|
||||
if: ${{ always() }}
|
||||
needs: security
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: ${{ env.IMAGE }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Test stable
|
||||
run: |
|
||||
npmci node install stable
|
||||
npmci npm install
|
||||
npmci npm test
|
||||
|
||||
- name: Test build
|
||||
run: |
|
||||
npmci node install stable
|
||||
npmci npm install
|
||||
npmci npm build
|
||||
108
.gitea/workflows/default_tags.yaml
Normal file
108
.gitea/workflows/default_tags.yaml
Normal file
@@ -0,0 +1,108 @@
|
||||
name: Default (tags)
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- '*'
|
||||
|
||||
env:
|
||||
IMAGE: registry.gitlab.com/hosttoday/ht-docker-node:npmci
|
||||
NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}}
|
||||
NPMCI_GIT_GITHUBTOKEN: ${{secrets.NPMCI_GIT_GITHUBTOKEN}}
|
||||
NPMCI_LOGIN_DOCKER_GITEA: ${{secrets.NPMCI_DOCKER_REGISTRYURL_DEFAULT}}|${{ gitea.repository_owner }}|${{ secrets.GITEA_TOKEN }}
|
||||
|
||||
jobs:
|
||||
|
||||
security:
|
||||
runs-on: ubuntu-latest
|
||||
continue-on-error: true
|
||||
container:
|
||||
image: ${{ env.IMAGE }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Install pnpm and npmci
|
||||
run: |
|
||||
pnpm install -g pnpm
|
||||
pnpm install -g @shipzone/npmci
|
||||
|
||||
- name: Run npm prepare
|
||||
run: npmci npm prepare
|
||||
|
||||
- name: Audit production dependencies
|
||||
run: |
|
||||
npmci command npm config set registry https://registry.npmjs.org
|
||||
npmci command pnpm audit --audit-level=high --prod
|
||||
continue-on-error: true
|
||||
|
||||
- name: Audit development dependencies
|
||||
run: |
|
||||
npmci command npm config set registry https://registry.npmjs.org
|
||||
npmci command pnpm audit --audit-level=high --dev
|
||||
continue-on-error: true
|
||||
|
||||
test:
|
||||
if: ${{ always() }}
|
||||
needs: security
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: ${{ env.IMAGE }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Test stable
|
||||
run: |
|
||||
npmci node install stable
|
||||
npmci npm install
|
||||
npmci npm test
|
||||
|
||||
- name: Test build
|
||||
run: |
|
||||
npmci node install stable
|
||||
npmci npm install
|
||||
npmci npm build
|
||||
|
||||
release:
|
||||
needs: test
|
||||
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: ${{ env.IMAGE }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Release
|
||||
run: |
|
||||
npmci node install stable
|
||||
npmci npm publish
|
||||
|
||||
metadata:
|
||||
needs: test
|
||||
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: ${{ env.IMAGE }}
|
||||
continue-on-error: true
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Code quality
|
||||
run: |
|
||||
npmci command npm install -g typescript
|
||||
npmci npm prepare
|
||||
npmci npm install
|
||||
|
||||
- name: Trigger
|
||||
run: npmci trigger
|
||||
|
||||
- name: Build docs and upload artifacts
|
||||
run: |
|
||||
npmci node install stable
|
||||
npmci npm install
|
||||
pnpm install -g @gitzone/tsdoc
|
||||
npmci command tsdoc
|
||||
continue-on-error: true
|
||||
19
.gitignore
vendored
19
.gitignore
vendored
@@ -1,5 +1,20 @@
|
||||
node_modules/
|
||||
.nogit/
|
||||
|
||||
# artifacts
|
||||
coverage/
|
||||
public/
|
||||
config.json
|
||||
pages/
|
||||
|
||||
# installs
|
||||
node_modules/
|
||||
|
||||
# caches
|
||||
.yarn/
|
||||
.cache/
|
||||
.rpt2_cache
|
||||
|
||||
# builds
|
||||
dist/
|
||||
dist_*/
|
||||
|
||||
# custom
|
||||
@@ -1,74 +0,0 @@
|
||||
# gitzone standard
|
||||
image: hosttoday/ht-docker-node:stable
|
||||
|
||||
cache:
|
||||
paths:
|
||||
- .yarn/
|
||||
key: "$CI_BUILD_STAGE"
|
||||
|
||||
stages:
|
||||
- test
|
||||
- release
|
||||
- trigger
|
||||
- pages
|
||||
|
||||
before_script:
|
||||
- yarn global add npmci@2.4.1
|
||||
|
||||
testLEGACY:
|
||||
stage: test
|
||||
script:
|
||||
- npmci test legacy
|
||||
coverage: /\d+.?\d+?\%\s*coverage/
|
||||
tags:
|
||||
- docker
|
||||
allow_failure: true
|
||||
|
||||
testLTS:
|
||||
stage: test
|
||||
script:
|
||||
- npmci test lts
|
||||
coverage: /\d+.?\d+?\%\s*coverage/
|
||||
tags:
|
||||
- docker
|
||||
|
||||
testSTABLE:
|
||||
stage: test
|
||||
script:
|
||||
- npmci test stable
|
||||
coverage: /\d+.?\d+?\%\s*coverage/
|
||||
tags:
|
||||
- docker
|
||||
|
||||
release:
|
||||
stage: release
|
||||
script:
|
||||
- npmci publish npm
|
||||
only:
|
||||
- tags
|
||||
tags:
|
||||
- docker
|
||||
|
||||
trigger:
|
||||
stage: trigger
|
||||
script:
|
||||
- npmci trigger
|
||||
only:
|
||||
- tags
|
||||
tags:
|
||||
- docker
|
||||
|
||||
pages:
|
||||
image: hosttoday/ht-docker-node:npmci
|
||||
stage: pages
|
||||
script:
|
||||
- npmci command yarn global add npmpage
|
||||
- npmci command npmpage
|
||||
tags:
|
||||
- docker
|
||||
only:
|
||||
- tags
|
||||
artifacts:
|
||||
expire_in: 1 week
|
||||
paths:
|
||||
- public
|
||||
@@ -1,5 +0,0 @@
|
||||
pages/
|
||||
coverage/
|
||||
test/
|
||||
node_modules/
|
||||
config.json
|
||||
11
.vscode/launch.json
vendored
Normal file
11
.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"command": "npm test",
|
||||
"name": "Run npm test",
|
||||
"request": "launch",
|
||||
"type": "node-terminal"
|
||||
}
|
||||
]
|
||||
}
|
||||
26
.vscode/settings.json
vendored
Normal file
26
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"json.schemas": [
|
||||
{
|
||||
"fileMatch": ["/npmextra.json"],
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"npmci": {
|
||||
"type": "object",
|
||||
"description": "settings for npmci"
|
||||
},
|
||||
"gitzone": {
|
||||
"type": "object",
|
||||
"description": "settings for gitzone",
|
||||
"properties": {
|
||||
"projectType": {
|
||||
"type": "string",
|
||||
"enum": ["website", "element", "service", "npm", "wcc"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
4
cli.child.ts
Normal file
4
cli.child.ts
Normal file
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env node
|
||||
process.env.CLI_CALL = 'true';
|
||||
import * as cliTool from './ts/index.js';
|
||||
cliTool.runCli();
|
||||
4
cli.js
Normal file
4
cli.js
Normal file
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env node
|
||||
process.env.CLI_CALL = 'true';
|
||||
const cliTool = await import('./dist_ts/index.js');
|
||||
cliTool.runCli();
|
||||
5
cli.ts.js
Normal file
5
cli.ts.js
Normal file
@@ -0,0 +1,5 @@
|
||||
#!/usr/bin/env node
|
||||
process.env.CLI_CALL = 'true';
|
||||
|
||||
import * as tsrun from '@gitzone/tsrun';
|
||||
tsrun.runPath('./cli.child.js', import.meta.url);
|
||||
3
dist/cli.js
vendored
3
dist/cli.js
vendored
@@ -1,3 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
process.env.CLI_CALL = 'true'
|
||||
var index = require("../dist/index.js");
|
||||
1
dist/index.d.ts
vendored
1
dist/index.d.ts
vendored
@@ -1 +0,0 @@
|
||||
import './npmci.cli';
|
||||
4
dist/index.js
vendored
4
dist/index.js
vendored
@@ -1,4 +0,0 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
require("./npmci.cli");
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHVCQUFvQiJ9
|
||||
4
dist/mod_clean/index.d.ts
vendored
4
dist/mod_clean/index.d.ts
vendored
@@ -1,4 +0,0 @@
|
||||
/**
|
||||
* cleans npmci config files
|
||||
*/
|
||||
export declare let clean: () => Promise<void>;
|
||||
20
dist/mod_clean/index.js
vendored
20
dist/mod_clean/index.js
vendored
@@ -1,20 +0,0 @@
|
||||
"use strict";
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const plugins = require("./mod.plugins");
|
||||
const paths = require("../npmci.paths");
|
||||
/**
|
||||
* cleans npmci config files
|
||||
*/
|
||||
exports.clean = () => __awaiter(this, void 0, void 0, function* () {
|
||||
plugins.smartfile.fs.removeSync(paths.NpmciPackageConfig);
|
||||
return;
|
||||
});
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfY2xlYW4vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBLHlDQUF3QztBQUN4Qyx3Q0FBdUM7QUFFdkM7O0dBRUc7QUFDUSxRQUFBLEtBQUssR0FBRztJQUNqQixPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUE7SUFDekQsTUFBTSxDQUFBO0FBQ1IsQ0FBQyxDQUFBLENBQUEifQ==
|
||||
1
dist/mod_clean/mod.plugins.d.ts
vendored
1
dist/mod_clean/mod.plugins.d.ts
vendored
@@ -1 +0,0 @@
|
||||
export * from '../npmci.plugins';
|
||||
7
dist/mod_clean/mod.plugins.js
vendored
7
dist/mod_clean/mod.plugins.js
vendored
@@ -1,7 +0,0 @@
|
||||
"use strict";
|
||||
function __export(m) {
|
||||
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
|
||||
}
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
__export(require("../npmci.plugins"));
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kLnBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfY2xlYW4vbW9kLnBsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxzQ0FBZ0MifQ==
|
||||
6
dist/mod_cloudflare/index.d.ts
vendored
6
dist/mod_cloudflare/index.d.ts
vendored
@@ -1,6 +0,0 @@
|
||||
/**
|
||||
* handle cli input
|
||||
* @param argvArg
|
||||
*/
|
||||
export declare let handleCli: (argvArg: any) => Promise<void>;
|
||||
export declare let purge: (argvArg: any) => Promise<void>;
|
||||
36
dist/mod_cloudflare/index.js
vendored
36
dist/mod_cloudflare/index.js
vendored
@@ -1,36 +0,0 @@
|
||||
"use strict";
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const plugins = require("./mod.plugins");
|
||||
let npmciCflare = new plugins.cflare.CflareAccount();
|
||||
/**
|
||||
* handle cli input
|
||||
* @param argvArg
|
||||
*/
|
||||
exports.handleCli = (argvArg) => __awaiter(this, void 0, void 0, function* () {
|
||||
if (argvArg._.length >= 2) {
|
||||
let action = argvArg._[1];
|
||||
switch (action) {
|
||||
default:
|
||||
plugins.beautylog.error(`>>npmci node ...<< action >>${action}<< not supported`);
|
||||
}
|
||||
}
|
||||
else {
|
||||
plugins.beautylog.log(`>>npmci node ...<< cli arguments invalid... Please read the documentation.`);
|
||||
}
|
||||
});
|
||||
exports.purge = (argvArg) => __awaiter(this, void 0, void 0, function* () {
|
||||
npmciCflare.auth({
|
||||
email: '',
|
||||
key: ''
|
||||
});
|
||||
npmciCflare.purgeZone(argvArg._[1]);
|
||||
});
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfY2xvdWRmbGFyZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUEseUNBQXdDO0FBRXhDLElBQUksV0FBVyxHQUFHLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQTtBQUVwRDs7O0dBR0c7QUFDUSxRQUFBLFNBQVMsR0FBRyxDQUFPLE9BQU87SUFDbkMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixJQUFJLE1BQU0sR0FBVyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2pDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDZjtnQkFDRSxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsTUFBTSxrQkFBa0IsQ0FBQyxDQUFBO1FBQ3BGLENBQUM7SUFDSCxDQUFDO0lBQUMsSUFBSSxDQUFDLENBQUM7UUFDTixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyw0RUFBNEUsQ0FBQyxDQUFBO0lBQ3JHLENBQUM7QUFDSCxDQUFDLENBQUEsQ0FBQTtBQUVVLFFBQUEsS0FBSyxHQUFHLENBQU8sT0FBTztJQUMvQixXQUFXLENBQUMsSUFBSSxDQUFDO1FBQ2YsS0FBSyxFQUFFLEVBQUU7UUFDVCxHQUFHLEVBQUUsRUFBRTtLQUNSLENBQUMsQ0FBQTtJQUNGLFdBQVcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ3JDLENBQUMsQ0FBQSxDQUFBIn0=
|
||||
3
dist/mod_cloudflare/mod.plugins.d.ts
vendored
3
dist/mod_cloudflare/mod.plugins.d.ts
vendored
@@ -1,3 +0,0 @@
|
||||
export * from '../npmci.plugins';
|
||||
import * as cflare from 'cflare';
|
||||
export { cflare };
|
||||
9
dist/mod_cloudflare/mod.plugins.js
vendored
9
dist/mod_cloudflare/mod.plugins.js
vendored
@@ -1,9 +0,0 @@
|
||||
"use strict";
|
||||
function __export(m) {
|
||||
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
|
||||
}
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
__export(require("../npmci.plugins"));
|
||||
const cflare = require("cflare");
|
||||
exports.cflare = cflare;
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kLnBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfY2xvdWRmbGFyZS9tb2QucGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHNDQUFnQztBQUVoQyxpQ0FBZ0M7QUFHNUIsd0JBQU0ifQ==
|
||||
1
dist/mod_command/index.d.ts
vendored
1
dist/mod_command/index.d.ts
vendored
@@ -1 +0,0 @@
|
||||
export declare let command: () => Promise<void>;
|
||||
24
dist/mod_command/index.js
vendored
24
dist/mod_command/index.js
vendored
@@ -1,24 +0,0 @@
|
||||
"use strict";
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const npmci_bash_1 = require("../npmci.bash");
|
||||
exports.command = () => __awaiter(this, void 0, void 0, function* () {
|
||||
let wrappedCommand = '';
|
||||
let argvArray = process.argv;
|
||||
for (let i = 3; i < argvArray.length; i++) {
|
||||
wrappedCommand = wrappedCommand + argvArray[i];
|
||||
if (i + 1 !== argvArray.length) {
|
||||
wrappedCommand = wrappedCommand + ' ';
|
||||
}
|
||||
}
|
||||
yield npmci_bash_1.bash(wrappedCommand);
|
||||
return;
|
||||
});
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfY29tbWFuZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQ0EsOENBQW9DO0FBRXpCLFFBQUEsT0FBTyxHQUFHO0lBQ25CLElBQUksY0FBYyxHQUFXLEVBQUUsQ0FBQTtJQUMvQixJQUFJLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFBO0lBQzVCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzFDLGNBQWMsR0FBRyxjQUFjLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzlDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFBQyxjQUFjLEdBQUcsY0FBYyxHQUFHLEdBQUcsQ0FBQTtRQUFDLENBQUM7SUFDM0UsQ0FBQztJQUNELE1BQU0saUJBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQTtJQUMxQixNQUFNLENBQUE7QUFDUixDQUFDLENBQUEsQ0FBQSJ9
|
||||
1
dist/mod_command/mod.plugins.d.ts
vendored
1
dist/mod_command/mod.plugins.d.ts
vendored
@@ -1 +0,0 @@
|
||||
export * from '../npmci.plugins';
|
||||
7
dist/mod_command/mod.plugins.js
vendored
7
dist/mod_command/mod.plugins.js
vendored
@@ -1,7 +0,0 @@
|
||||
"use strict";
|
||||
function __export(m) {
|
||||
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
|
||||
}
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
__export(require("../npmci.plugins"));
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kLnBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfY29tbWFuZC9tb2QucGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHNDQUFnQyJ9
|
||||
111
dist/mod_docker/index.d.ts
vendored
111
dist/mod_docker/index.d.ts
vendored
@@ -1,111 +0,0 @@
|
||||
/// <reference types="node" />
|
||||
export declare let modArgvArg: any;
|
||||
/**
|
||||
* handle cli input
|
||||
* @param argvArg
|
||||
*/
|
||||
export declare let handleCli: (argvArg: any) => Promise<void>;
|
||||
/**
|
||||
* logs in docker
|
||||
*/
|
||||
export declare let prepare: () => Promise<void>;
|
||||
/**
|
||||
* builds a cwd of Dockerfiles by triggering a promisechain
|
||||
*/
|
||||
export declare let build: () => Promise<void>;
|
||||
export declare let push: () => Promise<void>;
|
||||
export declare let pull: () => Promise<Dockerfile[]>;
|
||||
export declare let test: () => Promise<Dockerfile[]>;
|
||||
/**
|
||||
* creates instance of class Dockerfile for all Dockerfiles in cwd
|
||||
* @returns Promise<Dockerfile[]>
|
||||
*/
|
||||
export declare let readDockerfiles: () => Promise<Dockerfile[]>;
|
||||
/**
|
||||
* sorts Dockerfiles into a dependency chain
|
||||
* @param sortableArrayArg an array of instances of class Dockerfile
|
||||
* @returns Promise<Dockerfile[]>
|
||||
*/
|
||||
export declare let sortDockerfiles: (sortableArrayArg: Dockerfile[]) => Promise<Dockerfile[]>;
|
||||
/**
|
||||
* maps local Dockerfiles dependencies to the correspoding Dockerfile class instances
|
||||
*/
|
||||
export declare let mapDockerfiles: (sortedArray: Dockerfile[]) => Promise<Dockerfile[]>;
|
||||
/**
|
||||
* builds the correspoding real docker image for each Dockerfile class instance
|
||||
*/
|
||||
export declare let buildDockerfiles: (sortedArrayArg: Dockerfile[]) => Promise<Dockerfile[]>;
|
||||
/**
|
||||
* pushes the real Dockerfile images to a Docker registry
|
||||
*/
|
||||
export declare let pushDockerfiles: (sortedArrayArg: Dockerfile[]) => Promise<Dockerfile[]>;
|
||||
/**
|
||||
* pulls corresponding real Docker images for instances of Dockerfile from a registry.
|
||||
* This is needed if building, testing, and publishing of Docker images is carried out in seperate CI stages.
|
||||
*/
|
||||
export declare let pullDockerfileImages: (sortableArrayArg: Dockerfile[], registryArg?: string) => Promise<Dockerfile[]>;
|
||||
/**
|
||||
* tests all Dockerfiles in by calling class Dockerfile.test();
|
||||
* @param sortedArrayArg Dockerfile[] that contains all Dockerfiles in cwd
|
||||
*/
|
||||
export declare let testDockerfiles: (sortedArrayArg: Dockerfile[]) => Promise<Dockerfile[]>;
|
||||
/**
|
||||
* class Dockerfile represents a Dockerfile on disk in npmci
|
||||
*/
|
||||
export declare class Dockerfile {
|
||||
filePath: string;
|
||||
repo: string;
|
||||
version: string;
|
||||
cleanTag: string;
|
||||
buildTag: string;
|
||||
gitlabTestTag: string;
|
||||
gitlabReleaseTag: string;
|
||||
releaseTag: string;
|
||||
containerName: string;
|
||||
content: string;
|
||||
baseImage: string;
|
||||
localBaseImageDependent: boolean;
|
||||
localBaseDockerfile: Dockerfile;
|
||||
constructor(options: {
|
||||
filePath?: string;
|
||||
fileContents?: string | Buffer;
|
||||
read?: boolean;
|
||||
});
|
||||
/**
|
||||
* builds the Dockerfile
|
||||
*/
|
||||
build(): Promise<void>;
|
||||
/**
|
||||
* pushes the Dockerfile to a registry
|
||||
*/
|
||||
push(stageArg: any): Promise<void>;
|
||||
/**
|
||||
* pulls the Dockerfile from a registry
|
||||
*/
|
||||
pull(registryArg: string): Promise<void>;
|
||||
/**
|
||||
* tests the Dockerfile;
|
||||
*/
|
||||
test(): Promise<void>;
|
||||
/**
|
||||
* gets the id of a Dockerfile
|
||||
*/
|
||||
getId(): Promise<string>;
|
||||
}
|
||||
/**
|
||||
* returns a version for a docker file
|
||||
* @execution SYNC
|
||||
*/
|
||||
export declare let dockerFileVersion: (dockerfileNameArg: string) => string;
|
||||
/**
|
||||
* returns the docker base image for a Dockerfile
|
||||
*/
|
||||
export declare let dockerBaseImage: (dockerfileContentArg: string) => string;
|
||||
/**
|
||||
* returns the docker tag
|
||||
*/
|
||||
export declare let getDockerTagString: (registryArg: string, repoArg: string, versionArg: string, suffixArg?: string) => string;
|
||||
/**
|
||||
*
|
||||
*/
|
||||
export declare let cleanTagsArrayFunction: (dockerfileArrayArg: Dockerfile[], trackingArrayArg: Dockerfile[]) => string[];
|
||||
358
dist/mod_docker/index.js
vendored
358
dist/mod_docker/index.js
vendored
File diff suppressed because one or more lines are too long
1
dist/mod_docker/mod.plugins.d.ts
vendored
1
dist/mod_docker/mod.plugins.d.ts
vendored
@@ -1 +0,0 @@
|
||||
export * from '../npmci.plugins';
|
||||
7
dist/mod_docker/mod.plugins.js
vendored
7
dist/mod_docker/mod.plugins.js
vendored
@@ -1,7 +0,0 @@
|
||||
"use strict";
|
||||
function __export(m) {
|
||||
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
|
||||
}
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
__export(require("../npmci.plugins"));
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kLnBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfZG9ja2VyL21vZC5wbHVnaW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsc0NBQWdDIn0=
|
||||
10
dist/mod_node/index.d.ts
vendored
10
dist/mod_node/index.d.ts
vendored
@@ -1,10 +0,0 @@
|
||||
/**
|
||||
* handle cli input
|
||||
* @param argvArg
|
||||
*/
|
||||
export declare let handleCli: (argvArg: any) => Promise<void>;
|
||||
/**
|
||||
* Install a specific version of node
|
||||
* @param versionArg
|
||||
*/
|
||||
export declare let install: (versionArg: any) => Promise<void>;
|
||||
85
dist/mod_node/index.js
vendored
85
dist/mod_node/index.js
vendored
@@ -1,85 +0,0 @@
|
||||
"use strict";
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const plugins = require("../npmci.plugins");
|
||||
const npmciConfig = require("../npmci.config");
|
||||
const npmci_bash_1 = require("../npmci.bash");
|
||||
/**
|
||||
* handle cli input
|
||||
* @param argvArg
|
||||
*/
|
||||
exports.handleCli = (argvArg) => __awaiter(this, void 0, void 0, function* () {
|
||||
if (argvArg._.length >= 3) {
|
||||
let action = argvArg._[1];
|
||||
switch (action) {
|
||||
case 'install':
|
||||
yield exports.install(argvArg._[2]);
|
||||
break;
|
||||
default:
|
||||
plugins.beautylog.error(`>>npmci node ...<< action >>${action}<< not supported`);
|
||||
}
|
||||
}
|
||||
else {
|
||||
plugins.beautylog.error(`>>npmci node ...<< cli arguments invalid... Please read the documentation.`);
|
||||
}
|
||||
});
|
||||
/**
|
||||
* Install a specific version of node
|
||||
* @param versionArg
|
||||
*/
|
||||
exports.install = (versionArg) => __awaiter(this, void 0, void 0, function* () {
|
||||
plugins.beautylog.log(`now installing node version ${versionArg}`);
|
||||
let version;
|
||||
if (versionArg === 'stable') {
|
||||
version = 'stable';
|
||||
}
|
||||
else if (versionArg === 'lts') {
|
||||
version = '6';
|
||||
}
|
||||
else if (versionArg === 'legacy') {
|
||||
version = '6';
|
||||
}
|
||||
else {
|
||||
version = versionArg;
|
||||
}
|
||||
if (yield npmci_bash_1.nvmAvailable.promise) {
|
||||
yield npmci_bash_1.bash(`nvm install ${version} && nvm alias default ${version}`);
|
||||
plugins.beautylog.success(`Node version ${version} successfully installed!`);
|
||||
}
|
||||
else {
|
||||
plugins.beautylog.warn('Nvm not in path so staying at installed node version!');
|
||||
}
|
||||
yield npmci_bash_1.bash('node -v');
|
||||
yield npmci_bash_1.bash('npm -v');
|
||||
// lets look for further config
|
||||
yield npmciConfig.getConfig()
|
||||
.then((configArg) => __awaiter(this, void 0, void 0, function* () {
|
||||
plugins.beautylog.log('Now checking for needed global npm tools...');
|
||||
for (let npmTool of configArg.globalNpmTools) {
|
||||
plugins.beautylog.info(`Checking for global "${npmTool}"`);
|
||||
let whichOutput = yield npmci_bash_1.bashNoError(`which ${npmTool}`);
|
||||
let toolAvailable = !((/not\sfound/.test(whichOutput)) || whichOutput === '');
|
||||
if (toolAvailable) {
|
||||
plugins.beautylog.log(`Tool ${npmTool} is available`);
|
||||
}
|
||||
else {
|
||||
plugins.beautylog.info(`globally installing ${npmTool} from npm`);
|
||||
if (yield npmci_bash_1.yarnAvailable.promise) {
|
||||
yield npmci_bash_1.bash(`yarn global add ${npmTool}`);
|
||||
}
|
||||
else {
|
||||
yield npmci_bash_1.bash(`npm install ${npmTool} -q -g`);
|
||||
}
|
||||
}
|
||||
}
|
||||
plugins.beautylog.success('all global npm tools specified in npmextra.json are now available!');
|
||||
}));
|
||||
});
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2Rfbm9kZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUEsNENBQTJDO0FBQzNDLCtDQUE4QztBQUM5Qyw4Q0FLc0I7QUFFdEI7OztHQUdHO0FBQ1EsUUFBQSxTQUFTLEdBQUcsQ0FBTyxPQUFPO0lBQ25DLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsSUFBSSxNQUFNLEdBQVcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNqQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ2YsS0FBSyxTQUFTO2dCQUNaLE1BQU0sZUFBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDM0IsS0FBSyxDQUFBO1lBQ1A7Z0JBQ0UsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsK0JBQStCLE1BQU0sa0JBQWtCLENBQUMsQ0FBQTtRQUNwRixDQUFDO0lBQ0gsQ0FBQztJQUFDLElBQUksQ0FBQyxDQUFDO1FBQ04sT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsNEVBQTRFLENBQUMsQ0FBQTtJQUN2RyxDQUFDO0FBRUgsQ0FBQyxDQUFBLENBQUE7QUFFRDs7O0dBR0c7QUFDUSxRQUFBLE9BQU8sR0FBRyxDQUFPLFVBQVU7SUFDcEMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsK0JBQStCLFVBQVUsRUFBRSxDQUFDLENBQUE7SUFDbEUsSUFBSSxPQUFlLENBQUE7SUFDbkIsRUFBRSxDQUFDLENBQUMsVUFBVSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDNUIsT0FBTyxHQUFHLFFBQVEsQ0FBQTtJQUNwQixDQUFDO0lBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sR0FBRyxHQUFHLENBQUE7SUFDZixDQUFDO0lBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE9BQU8sR0FBRyxHQUFHLENBQUE7SUFDZixDQUFDO0lBQUMsSUFBSSxDQUFDLENBQUM7UUFDTixPQUFPLEdBQUcsVUFBVSxDQUFBO0lBQ3RCLENBQUM7SUFDRCxFQUFFLENBQUMsQ0FBQyxNQUFNLHlCQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUMvQixNQUFNLGlCQUFJLENBQUMsZUFBZSxPQUFPLHlCQUF5QixPQUFPLEVBQUUsQ0FBQyxDQUFBO1FBQ3BFLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGdCQUFnQixPQUFPLDBCQUEwQixDQUFDLENBQUE7SUFDOUUsQ0FBQztJQUFDLElBQUksQ0FBQyxDQUFDO1FBQ04sT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsdURBQXVELENBQUMsQ0FBQTtJQUNqRixDQUFDO0lBQ0QsTUFBTSxpQkFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ3JCLE1BQU0saUJBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUNwQiwrQkFBK0I7SUFDL0IsTUFBTSxXQUFXLENBQUMsU0FBUyxFQUFFO1NBQzFCLElBQUksQ0FBQyxDQUFNLFNBQVM7UUFDbkIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsNkNBQTZDLENBQUMsQ0FBQTtRQUNwRSxHQUFHLENBQUMsQ0FBQyxJQUFJLE9BQU8sSUFBSSxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztZQUM3QyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsT0FBTyxHQUFHLENBQUMsQ0FBQTtZQUMxRCxJQUFJLFdBQVcsR0FBVyxNQUFNLHdCQUFXLENBQUMsU0FBUyxPQUFPLEVBQUUsQ0FBQyxDQUFBO1lBQy9ELElBQUksYUFBYSxHQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxXQUFXLEtBQUssRUFBRSxDQUFDLENBQUE7WUFDdEYsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDbEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxPQUFPLGVBQWUsQ0FBQyxDQUFBO1lBQ3ZELENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDTixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsT0FBTyxXQUFXLENBQUMsQ0FBQTtnQkFDakUsRUFBRSxDQUFDLENBQUMsTUFBTSwwQkFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBQ2hDLE1BQU0saUJBQUksQ0FBQyxtQkFBbUIsT0FBTyxFQUFFLENBQUMsQ0FBQTtnQkFDMUMsQ0FBQztnQkFBQyxJQUFJLENBQUMsQ0FBQztvQkFDTixNQUFNLGlCQUFJLENBQUMsZUFBZSxPQUFPLFFBQVEsQ0FBQyxDQUFBO2dCQUM1QyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxvRUFBb0UsQ0FBQyxDQUFBO0lBQ2pHLENBQUMsQ0FBQSxDQUFDLENBQUE7QUFDTixDQUFDLENBQUEsQ0FBQSJ9
|
||||
6
dist/mod_npm/index.d.ts
vendored
6
dist/mod_npm/index.d.ts
vendored
@@ -1,6 +0,0 @@
|
||||
/**
|
||||
* handle cli input
|
||||
* @param argvArg
|
||||
*/
|
||||
export declare let handleCli: (argvArg: any) => Promise<void>;
|
||||
export declare let test: () => Promise<void>;
|
||||
68
dist/mod_npm/index.js
vendored
68
dist/mod_npm/index.js
vendored
@@ -1,68 +0,0 @@
|
||||
"use strict";
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const plugins = require("./mod.plugins");
|
||||
const npmci_bash_1 = require("../npmci.bash");
|
||||
/**
|
||||
* handle cli input
|
||||
* @param argvArg
|
||||
*/
|
||||
exports.handleCli = (argvArg) => __awaiter(this, void 0, void 0, function* () {
|
||||
if (argvArg._.length >= 2) {
|
||||
let action = argvArg._[1];
|
||||
switch (action) {
|
||||
case 'install':
|
||||
yield install();
|
||||
break;
|
||||
case 'prepare':
|
||||
yield prepare();
|
||||
break;
|
||||
case 'test':
|
||||
yield exports.test();
|
||||
break;
|
||||
default:
|
||||
plugins.beautylog.error(`>>npmci node ...<< action >>${action}<< not supported`);
|
||||
}
|
||||
}
|
||||
else {
|
||||
plugins.beautylog.log(`>>npmci node ...<< cli arguments invalid... Please read the documentation.`);
|
||||
}
|
||||
});
|
||||
/**
|
||||
* authenticates npm with token from env var
|
||||
*/
|
||||
let prepare = () => __awaiter(this, void 0, void 0, function* () {
|
||||
let npmrcPrefix = '//registry.npmjs.org/:_authToken=';
|
||||
let npmToken = process.env.NPMCI_TOKEN_NPM;
|
||||
let npmrcFileString = npmrcPrefix + npmToken;
|
||||
if (npmToken) {
|
||||
plugins.beautylog.info('found access token');
|
||||
}
|
||||
else {
|
||||
plugins.beautylog.error('no access token found! Exiting!');
|
||||
process.exit(1);
|
||||
}
|
||||
plugins.smartfile.memory.toFsSync(npmrcFileString, '/root/.npmrc');
|
||||
return;
|
||||
});
|
||||
let install = () => __awaiter(this, void 0, void 0, function* () {
|
||||
plugins.beautylog.info('now installing dependencies:');
|
||||
if (yield npmci_bash_1.yarnAvailable.promise) {
|
||||
yield npmci_bash_1.bash('yarn install');
|
||||
}
|
||||
else {
|
||||
yield npmci_bash_1.bash('npm install');
|
||||
}
|
||||
});
|
||||
exports.test = () => __awaiter(this, void 0, void 0, function* () {
|
||||
plugins.beautylog.info('now starting tests:');
|
||||
yield npmci_bash_1.bash('yarn test');
|
||||
});
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfbnBtL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSx5Q0FBd0M7QUFFeEMsOENBS3NCO0FBRXRCOzs7R0FHRztBQUNRLFFBQUEsU0FBUyxHQUFHLENBQU8sT0FBTztJQUNuQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLElBQUksTUFBTSxHQUFXLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDakMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNmLEtBQUssU0FBUztnQkFDWixNQUFNLE9BQU8sRUFBRSxDQUFBO2dCQUNmLEtBQUssQ0FBQTtZQUNQLEtBQUssU0FBUztnQkFDWixNQUFNLE9BQU8sRUFBRSxDQUFBO2dCQUNmLEtBQUssQ0FBQTtZQUNQLEtBQUssTUFBTTtnQkFDVCxNQUFNLFlBQUksRUFBRSxDQUFBO2dCQUNaLEtBQUssQ0FBQTtZQUNQO2dCQUNFLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLCtCQUErQixNQUFNLGtCQUFrQixDQUFDLENBQUE7UUFDcEYsQ0FBQztJQUNILENBQUM7SUFBQyxJQUFJLENBQUMsQ0FBQztRQUNOLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLDRFQUE0RSxDQUFDLENBQUE7SUFDckcsQ0FBQztBQUNILENBQUMsQ0FBQSxDQUFBO0FBRUQ7O0dBRUc7QUFDSCxJQUFJLE9BQU8sR0FBRztJQUNaLElBQUksV0FBVyxHQUFXLG1DQUFtQyxDQUFBO0lBQzdELElBQUksUUFBUSxHQUFXLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFBO0lBQ2xELElBQUksZUFBZSxHQUFXLFdBQVcsR0FBRyxRQUFRLENBQUE7SUFDcEQsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNiLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUE7SUFDOUMsQ0FBQztJQUFDLElBQUksQ0FBQyxDQUFDO1FBQ04sT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQTtRQUMxRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2pCLENBQUM7SUFDRCxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLGNBQWMsQ0FBQyxDQUFBO0lBQ2xFLE1BQU0sQ0FBQTtBQUNSLENBQUMsQ0FBQSxDQUFBO0FBRUQsSUFBSSxPQUFPLEdBQUc7SUFDWixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFBO0lBQ3RELEVBQUUsQ0FBQyxDQUFDLE1BQU0sMEJBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLE1BQU0saUJBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQTtJQUM1QixDQUFDO0lBQUMsSUFBSSxDQUFDLENBQUM7UUFDTixNQUFNLGlCQUFJLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDM0IsQ0FBQztBQUNILENBQUMsQ0FBQSxDQUFBO0FBRVUsUUFBQSxJQUFJLEdBQUc7SUFDaEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQTtJQUM3QyxNQUFNLGlCQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7QUFDekIsQ0FBQyxDQUFBLENBQUEifQ==
|
||||
1
dist/mod_npm/mod.plugins.d.ts
vendored
1
dist/mod_npm/mod.plugins.d.ts
vendored
@@ -1 +0,0 @@
|
||||
export * from '../npmci.plugins';
|
||||
7
dist/mod_npm/mod.plugins.js
vendored
7
dist/mod_npm/mod.plugins.js
vendored
@@ -1,7 +0,0 @@
|
||||
"use strict";
|
||||
function __export(m) {
|
||||
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
|
||||
}
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
__export(require("../npmci.plugins"));
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kLnBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfbnBtL21vZC5wbHVnaW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsc0NBQWdDIn0=
|
||||
5
dist/mod_ssh/index.d.ts
vendored
5
dist/mod_ssh/index.d.ts
vendored
@@ -1,5 +0,0 @@
|
||||
export declare let handleCli: (argvArg: any) => Promise<void>;
|
||||
/**
|
||||
* checks for ENV vars in form of NPMCI_SSHKEY_* and deploys any found ones
|
||||
*/
|
||||
export declare let prepare: () => Promise<void>;
|
||||
66
dist/mod_ssh/index.js
vendored
66
dist/mod_ssh/index.js
vendored
@@ -1,66 +0,0 @@
|
||||
"use strict";
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const plugins = require("./mod.plugins");
|
||||
let sshInstance;
|
||||
exports.handleCli = (argvArg) => __awaiter(this, void 0, void 0, function* () {
|
||||
if (argvArg._.length >= 2) {
|
||||
let action = argvArg._[1];
|
||||
switch (action) {
|
||||
case 'prepare':
|
||||
yield exports.prepare();
|
||||
break;
|
||||
default:
|
||||
plugins.beautylog.error(`action >>${action}<< not supported`);
|
||||
}
|
||||
}
|
||||
});
|
||||
/**
|
||||
* checks if not undefined
|
||||
*/
|
||||
let notUndefined = (stringArg) => {
|
||||
return (stringArg && stringArg !== 'undefined' && stringArg !== '##');
|
||||
};
|
||||
/**
|
||||
* checks for ENV vars in form of NPMCI_SSHKEY_* and deploys any found ones
|
||||
*/
|
||||
exports.prepare = () => __awaiter(this, void 0, void 0, function* () {
|
||||
sshInstance = new plugins.smartssh.SshInstance(); // init ssh instance
|
||||
plugins.smartparam.forEachMinimatch(process.env, 'NPMCI_SSHKEY_*', evaluateSshEnv);
|
||||
if (!process.env.NPMTS_TEST) {
|
||||
sshInstance.writeToDisk();
|
||||
}
|
||||
else {
|
||||
plugins.beautylog.log('In test mode, so not storing SSH keys to disk!');
|
||||
}
|
||||
});
|
||||
/**
|
||||
* gets called for each found SSH ENV Var and deploys it
|
||||
*/
|
||||
let evaluateSshEnv = (sshkeyEnvVarArg) => __awaiter(this, void 0, void 0, function* () {
|
||||
let sshEnvArray = sshkeyEnvVarArg.split('|');
|
||||
let sshKey = new plugins.smartssh.SshKey();
|
||||
plugins.beautylog.info('Found SSH identity for ' + sshEnvArray[1]);
|
||||
if (notUndefined(sshEnvArray[0])) {
|
||||
plugins.beautylog.log('---> host defined!');
|
||||
sshKey.host = sshEnvArray[0];
|
||||
}
|
||||
if (notUndefined(sshEnvArray[1])) {
|
||||
plugins.beautylog.log('---> privKey defined!');
|
||||
sshKey.privKeyBase64 = sshEnvArray[1];
|
||||
}
|
||||
if (notUndefined(sshEnvArray[2])) {
|
||||
plugins.beautylog.log('---> pubKey defined!');
|
||||
sshKey.pubKeyBase64 = sshEnvArray[2];
|
||||
}
|
||||
sshInstance.addKey(sshKey);
|
||||
return;
|
||||
});
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2Rfc3NoL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSx5Q0FBd0M7QUFDeEMsSUFBSSxXQUF5QyxDQUFBO0FBRWxDLFFBQUEsU0FBUyxHQUFHLENBQU8sT0FBTztJQUNuQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLElBQUksTUFBTSxHQUFXLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDakMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNmLEtBQUssU0FBUztnQkFDWixNQUFNLGVBQU8sRUFBRSxDQUFBO2dCQUNmLEtBQUssQ0FBQTtZQUNQO2dCQUNFLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFlBQVksTUFBTSxrQkFBa0IsQ0FBQyxDQUFBO1FBQ2pFLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQyxDQUFBLENBQUE7QUFFRDs7R0FFRztBQUNILElBQUksWUFBWSxHQUFHLENBQUMsU0FBaUI7SUFDbkMsTUFBTSxDQUFDLENBQUMsU0FBUyxJQUFJLFNBQVMsS0FBSyxXQUFXLElBQUksU0FBUyxLQUFLLElBQUksQ0FBQyxDQUFBO0FBQ3ZFLENBQUMsQ0FBQTtBQUVEOztHQUVHO0FBQ1EsUUFBQSxPQUFPLEdBQUc7SUFDbkIsV0FBVyxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQSxDQUFDLG9CQUFvQjtJQUNyRSxPQUFPLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLENBQUE7SUFDbEYsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDNUIsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQzNCLENBQUM7SUFBQyxJQUFJLENBQUMsQ0FBQztRQUNOLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGdEQUFnRCxDQUFDLENBQUE7SUFDekUsQ0FBQztBQUNILENBQUMsQ0FBQSxDQUFBO0FBRUQ7O0dBRUc7QUFDSCxJQUFJLGNBQWMsR0FBRyxDQUFPLGVBQXVCO0lBQ2pELElBQUksV0FBVyxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDNUMsSUFBSSxNQUFNLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFBO0lBQzFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLHlCQUF5QixHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2xFLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtRQUMzQyxNQUFNLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUM5QixDQUFDO0lBQ0QsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO1FBQzlDLE1BQU0sQ0FBQyxhQUFhLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3ZDLENBQUM7SUFDRCxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUE7UUFDN0MsTUFBTSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDdEMsQ0FBQztJQUVELFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDMUIsTUFBTSxDQUFBO0FBQ1IsQ0FBQyxDQUFBLENBQUEifQ==
|
||||
1
dist/mod_ssh/mod.plugins.d.ts
vendored
1
dist/mod_ssh/mod.plugins.d.ts
vendored
@@ -1 +0,0 @@
|
||||
export * from '../npmci.plugins';
|
||||
7
dist/mod_ssh/mod.plugins.js
vendored
7
dist/mod_ssh/mod.plugins.js
vendored
@@ -1,7 +0,0 @@
|
||||
"use strict";
|
||||
function __export(m) {
|
||||
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
|
||||
}
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
__export(require("../npmci.plugins"));
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kLnBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2Rfc3NoL21vZC5wbHVnaW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsc0NBQWdDIn0=
|
||||
1
dist/mod_trigger/index.d.ts
vendored
1
dist/mod_trigger/index.d.ts
vendored
@@ -1 +0,0 @@
|
||||
export declare let trigger: () => Promise<void>;
|
||||
35
dist/mod_trigger/index.js
vendored
35
dist/mod_trigger/index.js
vendored
@@ -1,35 +0,0 @@
|
||||
"use strict";
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const plugins = require("./mod.plugins");
|
||||
let triggerValueRegex = /^([a-zA-Z0-9\.]*)\|([a-zA-Z0-9\.]*)\|([a-zA-Z0-9\.]*)\|([a-zA-Z0-9\.]*)\|?([a-zA-Z0-9\.\-\/]*)/;
|
||||
exports.trigger = () => __awaiter(this, void 0, void 0, function* () {
|
||||
plugins.beautylog.info('now running triggers');
|
||||
plugins.smartparam.forEachMinimatch(process.env, 'NPMCI_TRIGGER_*', evaluateTrigger);
|
||||
});
|
||||
let evaluateTrigger = (triggerEnvVarArg) => __awaiter(this, void 0, void 0, function* () {
|
||||
let triggerRegexResultArray = triggerValueRegex.exec(triggerEnvVarArg);
|
||||
let regexDomain = triggerRegexResultArray[1];
|
||||
let regexProjectId = triggerRegexResultArray[2];
|
||||
let regexProjectTriggerToken = triggerRegexResultArray[3];
|
||||
let regexRefName = triggerRegexResultArray[4];
|
||||
let regexTriggerName;
|
||||
if (triggerRegexResultArray.length === 6) {
|
||||
regexTriggerName = triggerRegexResultArray[5];
|
||||
}
|
||||
else {
|
||||
regexTriggerName = 'Unnamed Trigger';
|
||||
}
|
||||
plugins.beautylog.info('Found Trigger!');
|
||||
plugins.beautylog.log('triggering build for ref ' + regexRefName + ' of ' + regexTriggerName);
|
||||
plugins.request.post('https://gitlab.com/api/v3/projects/' + regexProjectId + '/trigger/builds', { form: { token: regexProjectTriggerToken, ref: regexRefName }
|
||||
});
|
||||
});
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfdHJpZ2dlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUEseUNBQXdDO0FBR3hDLElBQUksaUJBQWlCLEdBQUcsZ0dBQWdHLENBQUE7QUFFN0csUUFBQSxPQUFPLEdBQUc7SUFDbkIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtJQUM5QyxPQUFPLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLENBQUE7QUFDdEYsQ0FBQyxDQUFBLENBQUE7QUFFRCxJQUFJLGVBQWUsR0FBRyxDQUFPLGdCQUFnQjtJQUMzQyxJQUFJLHVCQUF1QixHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO0lBQ3RFLElBQUksV0FBVyxHQUFHLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzVDLElBQUksY0FBYyxHQUFHLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQy9DLElBQUksd0JBQXdCLEdBQUcsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDekQsSUFBSSxZQUFZLEdBQUcsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDN0MsSUFBSSxnQkFBZ0IsQ0FBQTtJQUNwQixFQUFFLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QyxnQkFBZ0IsR0FBRyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUMvQyxDQUFDO0lBQUMsSUFBSSxDQUFDLENBQUM7UUFDTixnQkFBZ0IsR0FBRyxpQkFBaUIsQ0FBQTtJQUN0QyxDQUFDO0lBQ0QsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUN4QyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsR0FBRyxZQUFZLEdBQUcsTUFBTSxHQUFHLGdCQUFnQixDQUFDLENBQUE7SUFDN0YsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2xCLHFDQUFxQyxHQUFHLGNBQWMsR0FBRyxpQkFBaUIsRUFDMUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRTtLQUMvRCxDQUFDLENBQUE7QUFDSixDQUFDLENBQUEsQ0FBQSJ9
|
||||
1
dist/mod_trigger/mod.plugins.d.ts
vendored
1
dist/mod_trigger/mod.plugins.d.ts
vendored
@@ -1 +0,0 @@
|
||||
export * from '../npmci.plugins';
|
||||
7
dist/mod_trigger/mod.plugins.js
vendored
7
dist/mod_trigger/mod.plugins.js
vendored
@@ -1,7 +0,0 @@
|
||||
"use strict";
|
||||
function __export(m) {
|
||||
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
|
||||
}
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
__export(require("../npmci.plugins"));
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kLnBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfdHJpZ2dlci9tb2QucGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHNDQUFnQyJ9
|
||||
16
dist/npmci.bash.d.ts
vendored
16
dist/npmci.bash.d.ts
vendored
@@ -1,16 +0,0 @@
|
||||
import * as plugins from './npmci.plugins';
|
||||
/**
|
||||
* wether nvm is available or not
|
||||
*/
|
||||
export declare let nvmAvailable: plugins.q.Deferred<boolean>;
|
||||
export declare let yarnAvailable: plugins.q.Deferred<boolean>;
|
||||
/**
|
||||
* bash() allows using bash with nvm in path
|
||||
* @param commandArg - The command to execute
|
||||
* @param retryArg - The retryArg: 0 to any positive number will retry, -1 will always succeed, -2 will return undefined
|
||||
*/
|
||||
export declare let bash: (commandArg: string, retryArg?: number) => Promise<string>;
|
||||
/**
|
||||
* bashNoError allows executing stuff without throwing an error
|
||||
*/
|
||||
export declare let bashNoError: (commandArg: string) => Promise<string>;
|
||||
106
dist/npmci.bash.js
vendored
106
dist/npmci.bash.js
vendored
@@ -1,106 +0,0 @@
|
||||
"use strict";
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const plugins = require("./npmci.plugins");
|
||||
const paths = require("./npmci.paths");
|
||||
const smartq = require("smartq");
|
||||
/**
|
||||
* wether nvm is available or not
|
||||
*/
|
||||
exports.nvmAvailable = smartq.defer();
|
||||
exports.yarnAvailable = smartq.defer();
|
||||
/**
|
||||
* the smartshell instance for npmci
|
||||
*/
|
||||
let npmciSmartshell = new plugins.smartshell.Smartshell({
|
||||
executor: 'bash',
|
||||
sourceFilePaths: []
|
||||
});
|
||||
/**
|
||||
* check for tools.
|
||||
*/
|
||||
let checkToolsAvailable = () => __awaiter(this, void 0, void 0, function* () {
|
||||
// check for nvm
|
||||
if (!process.env.NPMTS_TEST) {
|
||||
if ((yield plugins.smartshell.execSilent(`bash -c "source /usr/local/nvm/nvm.sh"`)).exitCode === 0) {
|
||||
npmciSmartshell.addSourceFiles([`/usr/local/nvm/nvm.sh`]);
|
||||
exports.nvmAvailable.resolve(true);
|
||||
}
|
||||
else if ((yield plugins.smartshell.execSilent(`bash -c "source ~/.nvm/nvm.sh"`)).exitCode === 0) {
|
||||
npmciSmartshell.addSourceFiles([`~/.nvm/nvm.sh`]);
|
||||
exports.nvmAvailable.resolve(true);
|
||||
}
|
||||
else {
|
||||
exports.nvmAvailable.resolve(false);
|
||||
}
|
||||
// check for yarn
|
||||
yield plugins.smartshell.which('yarn').then(() => __awaiter(this, void 0, void 0, function* () {
|
||||
yield plugins.smartshell.exec(`yarn config set cache-folder ${plugins.path.join(paths.cwd, '.yarn')}`);
|
||||
exports.yarnAvailable.resolve(true);
|
||||
}), () => { exports.yarnAvailable.resolve(false); });
|
||||
}
|
||||
else {
|
||||
exports.nvmAvailable.resolve(true);
|
||||
exports.yarnAvailable.resolve(true);
|
||||
}
|
||||
});
|
||||
checkToolsAvailable();
|
||||
/**
|
||||
* bash() allows using bash with nvm in path
|
||||
* @param commandArg - The command to execute
|
||||
* @param retryArg - The retryArg: 0 to any positive number will retry, -1 will always succeed, -2 will return undefined
|
||||
*/
|
||||
exports.bash = (commandArg, retryArg = 2) => __awaiter(this, void 0, void 0, function* () {
|
||||
yield exports.nvmAvailable.promise; // make sure nvm check has run
|
||||
let execResult;
|
||||
// determine if we fail
|
||||
let failOnError = true;
|
||||
if (retryArg === -1) {
|
||||
failOnError = false;
|
||||
retryArg = 0;
|
||||
}
|
||||
if (!process.env.NPMTS_TEST) {
|
||||
for (let i = 0; i <= retryArg; i++) {
|
||||
if (process.env.DEBUG_NPMCI === 'true') {
|
||||
console.log(commandArg);
|
||||
}
|
||||
execResult = yield npmciSmartshell.exec(commandArg);
|
||||
// determine how bash reacts to error and success
|
||||
if (execResult.exitCode !== 0 && i === retryArg) {
|
||||
if (failOnError) {
|
||||
plugins.beautylog.error('something went wrong and retries are exhausted');
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
else if (execResult.exitCode === 0) {
|
||||
i = retryArg + 1; // retry +1 breaks for loop, if everything works out ok retrials are not wanted
|
||||
}
|
||||
else {
|
||||
plugins.beautylog.warn('Something went wrong! Exit Code: ' + execResult.exitCode.toString());
|
||||
plugins.beautylog.info('Retry ' + (i + 1).toString() + ' of ' + retryArg.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
plugins.beautylog.log('ShellExec would be: ' + commandArg);
|
||||
execResult = {
|
||||
exitCode: 0,
|
||||
stdout: 'testOutput'
|
||||
};
|
||||
}
|
||||
return execResult.stdout;
|
||||
});
|
||||
/**
|
||||
* bashNoError allows executing stuff without throwing an error
|
||||
*/
|
||||
exports.bashNoError = (commandArg) => __awaiter(this, void 0, void 0, function* () {
|
||||
return yield exports.bash(commandArg, -1);
|
||||
});
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtY2kuYmFzaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL25wbWNpLmJhc2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBLDJDQUEwQztBQUMxQyx1Q0FBc0M7QUFFdEMsaUNBQWdDO0FBRWhDOztHQUVHO0FBQ1EsUUFBQSxZQUFZLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBVyxDQUFBO0FBQ3RDLFFBQUEsYUFBYSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQVcsQ0FBQTtBQUNsRDs7R0FFRztBQUNILElBQUksZUFBZSxHQUFHLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7SUFDdEQsUUFBUSxFQUFFLE1BQU07SUFDaEIsZUFBZSxFQUFFLEVBQUU7Q0FDcEIsQ0FBQyxDQUFBO0FBRUY7O0dBRUc7QUFDSCxJQUFJLG1CQUFtQixHQUFHO0lBQ3hCLGdCQUFnQjtJQUNoQixFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUM1QixFQUFFLENBQUMsQ0FDRCxDQUFDLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsd0NBQXdDLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxDQUMvRixDQUFDLENBQUMsQ0FBQztZQUNELGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBRSx1QkFBdUIsQ0FBRSxDQUFDLENBQUE7WUFDM0Qsb0JBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDNUIsQ0FBQztRQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FDUixDQUFDLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxDQUN2RixDQUFDLENBQUMsQ0FBQztZQUNELGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBRSxlQUFlLENBQUUsQ0FBQyxDQUFBO1lBQ25ELG9CQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzVCLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLG9CQUFZLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzdCLENBQUM7UUFFRCxpQkFBaUI7UUFDakIsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQ3pDO1lBQ0UsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDdEcscUJBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDN0IsQ0FBQyxDQUFBLEVBQ0QsUUFBUSxxQkFBYSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FDdkMsQ0FBQTtJQUNILENBQUM7SUFBQyxJQUFJLENBQUMsQ0FBQztRQUNOLG9CQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzFCLHFCQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzdCLENBQUM7QUFDSCxDQUFDLENBQUEsQ0FBQTtBQUNELG1CQUFtQixFQUFFLENBQUE7QUFFckI7Ozs7R0FJRztBQUNRLFFBQUEsSUFBSSxHQUFHLENBQU8sVUFBa0IsRUFBRSxXQUFtQixDQUFDO0lBQy9ELE1BQU0sb0JBQVksQ0FBQyxPQUFPLENBQUEsQ0FBQyw4QkFBOEI7SUFDekQsSUFBSSxVQUEwQyxDQUFBO0lBRTlDLHVCQUF1QjtJQUN2QixJQUFJLFdBQVcsR0FBWSxJQUFJLENBQUE7SUFDL0IsRUFBRSxDQUFDLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixXQUFXLEdBQUcsS0FBSyxDQUFBO1FBQ25CLFFBQVEsR0FBRyxDQUFDLENBQUE7SUFDZCxDQUFDO0lBRUQsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDNUIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNuQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQ3pCLENBQUM7WUFDRCxVQUFVLEdBQUcsTUFBTSxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBRW5ELGlEQUFpRDtZQUNqRCxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDaEQsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztvQkFDaEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQTtvQkFDekUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDakIsQ0FBQztZQUNILENBQUM7WUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyQyxDQUFDLEdBQUcsUUFBUSxHQUFHLENBQUMsQ0FBQSxDQUFDLCtFQUErRTtZQUNsRyxDQUFDO1lBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ04sT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsbUNBQW1DLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO2dCQUM1RixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEdBQUcsTUFBTSxHQUFHLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO1lBQ3RGLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUFDLElBQUksQ0FBQyxDQUFDO1FBQ04sT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLEdBQUcsVUFBVSxDQUFDLENBQUE7UUFDMUQsVUFBVSxHQUFHO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxNQUFNLEVBQUUsWUFBWTtTQUNyQixDQUFBO0lBQ0gsQ0FBQztJQUNELE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFBO0FBQzFCLENBQUMsQ0FBQSxDQUFBO0FBRUQ7O0dBRUc7QUFDUSxRQUFBLFdBQVcsR0FBRyxDQUFPLFVBQWtCO0lBQ2hELE1BQU0sQ0FBQyxNQUFNLFlBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNuQyxDQUFDLENBQUEsQ0FBQSJ9
|
||||
0
dist/npmci.cli.d.ts
vendored
0
dist/npmci.cli.d.ts
vendored
97
dist/npmci.cli.js
vendored
97
dist/npmci.cli.js
vendored
@@ -1,97 +0,0 @@
|
||||
"use strict";
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const plugins = require("./npmci.plugins");
|
||||
const paths = require("./npmci.paths");
|
||||
let npmciInfo = new plugins.projectinfo.ProjectinfoNpm(paths.NpmciPackageRoot);
|
||||
plugins.beautylog.log('npmci version: ' + npmciInfo.version);
|
||||
const NpmciEnv = require("./npmci.env");
|
||||
const npmciMods = require("./npmci.mods");
|
||||
let smartcli = new plugins.smartcli.Smartcli();
|
||||
smartcli.addVersion(npmciInfo.version);
|
||||
// clean
|
||||
smartcli.addCommand('clean')
|
||||
.then((argv) => __awaiter(this, void 0, void 0, function* () {
|
||||
let modClean = yield npmciMods.modClean.load();
|
||||
yield modClean.clean();
|
||||
yield NpmciEnv.configStore();
|
||||
})).catch(err => {
|
||||
console.log(err);
|
||||
process.exit(1);
|
||||
});
|
||||
// cloudflare
|
||||
smartcli.addCommand('cloudflare')
|
||||
.then((argvArg) => __awaiter(this, void 0, void 0, function* () {
|
||||
let modPurge = yield npmciMods.modCloudflare.load();
|
||||
yield modPurge.handleCli(argvArg);
|
||||
yield NpmciEnv.configStore();
|
||||
})).catch(err => {
|
||||
console.log(err);
|
||||
});
|
||||
// command
|
||||
smartcli.addCommand('command')
|
||||
.then((argv) => __awaiter(this, void 0, void 0, function* () {
|
||||
let modCommand = yield npmciMods.modCommand.load();
|
||||
yield modCommand.command();
|
||||
yield NpmciEnv.configStore();
|
||||
})).catch(err => {
|
||||
console.log(err);
|
||||
process.exit(1);
|
||||
});
|
||||
// build
|
||||
smartcli.addCommand('docker')
|
||||
.then((argvArg) => __awaiter(this, void 0, void 0, function* () {
|
||||
let modDocker = yield npmciMods.modDocker.load();
|
||||
yield modDocker.handleCli(argvArg);
|
||||
NpmciEnv.configStore();
|
||||
})).catch(err => {
|
||||
console.log(err);
|
||||
process.exit(1);
|
||||
});
|
||||
// node
|
||||
smartcli.addCommand('node')
|
||||
.then((argvArg) => __awaiter(this, void 0, void 0, function* () {
|
||||
let modNode = yield npmciMods.modNode.load();
|
||||
yield modNode.handleCli(argvArg);
|
||||
yield NpmciEnv.configStore();
|
||||
})).catch(err => {
|
||||
console.log(err);
|
||||
});
|
||||
// npm
|
||||
smartcli.addCommand('npm')
|
||||
.then((argvArg) => __awaiter(this, void 0, void 0, function* () {
|
||||
let modNpm = yield npmciMods.modNpm.load();
|
||||
yield modNpm.handleCli(argvArg);
|
||||
yield NpmciEnv.configStore();
|
||||
})).catch(err => {
|
||||
console.log(err);
|
||||
});
|
||||
// trigger
|
||||
smartcli.addCommand('ssh')
|
||||
.then((argvArg) => __awaiter(this, void 0, void 0, function* () {
|
||||
let modSsh = yield npmciMods.modSsh.load();
|
||||
yield modSsh.handleCli(argvArg);
|
||||
yield NpmciEnv.configStore();
|
||||
})).catch(err => {
|
||||
console.log(err);
|
||||
process.exit(1);
|
||||
});
|
||||
// trigger
|
||||
smartcli.addCommand('trigger')
|
||||
.then((argv) => __awaiter(this, void 0, void 0, function* () {
|
||||
let modTrigger = yield npmciMods.modTrigger.load();
|
||||
yield modTrigger.trigger();
|
||||
yield NpmciEnv.configStore();
|
||||
})).catch(err => {
|
||||
console.log(err);
|
||||
process.exit(1);
|
||||
});
|
||||
smartcli.startParse();
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtY2kuY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvbnBtY2kuY2xpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSwyQ0FBMEM7QUFDMUMsdUNBQXNDO0FBQ3RDLElBQUksU0FBUyxHQUFHLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUE7QUFDOUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBRTVELHdDQUF1QztBQUV2QywwQ0FBeUM7QUFFekMsSUFBSSxRQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFBO0FBQzlDLFFBQVEsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBRXRDLFFBQVE7QUFDUixRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztLQUN6QixJQUFJLENBQUMsQ0FBTyxJQUFJO0lBQ2YsSUFBSSxRQUFRLEdBQUcsTUFBTSxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFBO0lBQzlDLE1BQU0sUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQ3RCLE1BQU0sUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFBO0FBQzlCLENBQUMsQ0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUc7SUFDVixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ2hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDakIsQ0FBQyxDQUFDLENBQUE7QUFFSixhQUFhO0FBQ2IsUUFBUSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUM7S0FDaEMsSUFBSSxDQUFDLENBQU8sT0FBTztJQUNsQixJQUFJLFFBQVEsR0FBRyxNQUFNLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDbkQsTUFBTSxRQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ2pDLE1BQU0sUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFBO0FBQzlCLENBQUMsQ0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUc7SUFDVixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ2xCLENBQUMsQ0FBQyxDQUFBO0FBRUYsVUFBVTtBQUNWLFFBQVEsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDO0tBQzNCLElBQUksQ0FBQyxDQUFPLElBQUk7SUFDZixJQUFJLFVBQVUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDbEQsTUFBTSxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDMUIsTUFBTSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUE7QUFDOUIsQ0FBQyxDQUFBLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRztJQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDaEIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNqQixDQUFDLENBQUMsQ0FBQTtBQUVKLFFBQVE7QUFDUixRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztLQUMxQixJQUFJLENBQUMsQ0FBTSxPQUFPO0lBQ2pCLElBQUksU0FBUyxHQUFHLE1BQU0sU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUNoRCxNQUFNLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDbEMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFBO0FBQ3hCLENBQUMsQ0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUc7SUFDVixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ2hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDakIsQ0FBQyxDQUFDLENBQUE7QUFFSixPQUFPO0FBQ1AsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7S0FDeEIsSUFBSSxDQUFDLENBQU8sT0FBTztJQUNsQixJQUFJLE9BQU8sR0FBRyxNQUFNLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDNUMsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ2hDLE1BQU0sUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFBO0FBQzlCLENBQUMsQ0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUc7SUFDVixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ2xCLENBQUMsQ0FBQyxDQUFBO0FBRUosTUFBTTtBQUNOLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO0tBQ3ZCLElBQUksQ0FBQyxDQUFPLE9BQU87SUFDbEIsSUFBSSxNQUFNLEdBQUcsTUFBTSxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFBO0lBQzFDLE1BQU0sTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUMvQixNQUFNLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtBQUM5QixDQUFDLENBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHO0lBQ1YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUNsQixDQUFDLENBQUMsQ0FBQTtBQUVKLFVBQVU7QUFDVixRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztLQUN2QixJQUFJLENBQUMsQ0FBTyxPQUFPO0lBQ2xCLElBQUksTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUMxQyxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDL0IsTUFBTSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUE7QUFDOUIsQ0FBQyxDQUFBLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRztJQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDaEIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNqQixDQUFDLENBQUMsQ0FBQTtBQUVKLFVBQVU7QUFDVixRQUFRLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztLQUMzQixJQUFJLENBQUMsQ0FBTyxJQUFJO0lBQ2YsSUFBSSxVQUFVLEdBQUcsTUFBTSxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFBO0lBQ2xELE1BQU0sVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBQzFCLE1BQU0sUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFBO0FBQzlCLENBQUMsQ0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUc7SUFDVixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ2hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDakIsQ0FBQyxDQUFDLENBQUE7QUFFSixRQUFRLENBQUMsVUFBVSxFQUFFLENBQUEifQ==
|
||||
4
dist/npmci.config.d.ts
vendored
4
dist/npmci.config.d.ts
vendored
@@ -1,4 +0,0 @@
|
||||
export interface INpmciOptions {
|
||||
globalNpmTools: string[];
|
||||
}
|
||||
export declare let getConfig: () => Promise<INpmciOptions>;
|
||||
21
dist/npmci.config.js
vendored
21
dist/npmci.config.js
vendored
@@ -1,21 +0,0 @@
|
||||
"use strict";
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const plugins = require("./npmci.plugins");
|
||||
const paths = require("./npmci.paths");
|
||||
exports.getConfig = () => __awaiter(this, void 0, void 0, function* () {
|
||||
let npmciNpmextra = new plugins.npmextra.Npmextra(paths.cwd);
|
||||
let defaultConfig = {
|
||||
globalNpmTools: []
|
||||
};
|
||||
let npmciConfig = npmciNpmextra.dataFor('npmci', defaultConfig);
|
||||
return npmciConfig;
|
||||
});
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtY2kuY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvbnBtY2kuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFFQSwyQ0FBMEM7QUFDMUMsdUNBQXNDO0FBTTNCLFFBQUEsU0FBUyxHQUFHO0lBQ3JCLElBQUksYUFBYSxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQzVELElBQUksYUFBYSxHQUFrQjtRQUNqQyxjQUFjLEVBQUUsRUFBRTtLQUNuQixDQUFBO0lBQ0QsSUFBSSxXQUFXLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBZ0IsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFBO0lBQzlFLE1BQU0sQ0FBQyxXQUFXLENBQUE7QUFDcEIsQ0FBQyxDQUFBLENBQUEifQ==
|
||||
27
dist/npmci.env.d.ts
vendored
27
dist/npmci.env.d.ts
vendored
@@ -1,27 +0,0 @@
|
||||
import { GitRepo } from 'smartstring';
|
||||
import { Dockerfile } from './mod_docker/index';
|
||||
/**
|
||||
* a info instance about the git respoitory at cwd :)
|
||||
*/
|
||||
export declare let repo: GitRepo;
|
||||
/**
|
||||
* the build stage
|
||||
*/
|
||||
export declare let buildStage: string;
|
||||
export declare let dockerRegistry: string;
|
||||
export declare let setDockerRegistry: (dockerRegistryArg: string) => void;
|
||||
export declare let dockerFilesBuilt: Dockerfile[];
|
||||
export declare let dockerFiles: Dockerfile[];
|
||||
/**
|
||||
* the config
|
||||
*/
|
||||
export declare let config: {
|
||||
dockerRegistry: any;
|
||||
dockerFilesBuilt: Dockerfile[];
|
||||
dockerFiles: Dockerfile[];
|
||||
project: any;
|
||||
};
|
||||
/**
|
||||
* the configuration store
|
||||
*/
|
||||
export declare let configStore: () => Promise<void>;
|
||||
69
dist/npmci.env.js
vendored
69
dist/npmci.env.js
vendored
@@ -1,69 +0,0 @@
|
||||
"use strict";
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const plugins = require("./npmci.plugins");
|
||||
const paths = require("./npmci.paths");
|
||||
const smartstring_1 = require("smartstring");
|
||||
if (process.env.CI_REPOSITORY_URL) {
|
||||
exports.repo = new smartstring_1.GitRepo(process.env.CI_REPOSITORY_URL);
|
||||
}
|
||||
/**
|
||||
* the build stage
|
||||
*/
|
||||
exports.buildStage = process.env.CI_BUILD_STAGE;
|
||||
exports.setDockerRegistry = (dockerRegistryArg) => {
|
||||
exports.dockerRegistry = dockerRegistryArg;
|
||||
};
|
||||
exports.dockerFilesBuilt = [];
|
||||
exports.dockerFiles = [];
|
||||
/**
|
||||
* the config
|
||||
*/
|
||||
exports.config = {
|
||||
dockerRegistry: undefined,
|
||||
dockerFilesBuilt: exports.dockerFilesBuilt,
|
||||
dockerFiles: exports.dockerFiles,
|
||||
project: undefined
|
||||
};
|
||||
/**
|
||||
* the configuration store
|
||||
*/
|
||||
exports.configStore = () => __awaiter(this, void 0, void 0, function* () {
|
||||
exports.config.dockerRegistry = exports.dockerRegistry;
|
||||
plugins.smartfile.memory.toFsSync(JSON.stringify(exports.config), paths.NpmciPackageConfig);
|
||||
});
|
||||
/**
|
||||
* load the config in case a previous run has stored it
|
||||
*/
|
||||
let configLoad = () => {
|
||||
// internal config to transfer information in between npmci shell calls
|
||||
try {
|
||||
plugins.lodash.assign(exports.config, plugins.smartfile.fs.toObjectSync(paths.NpmciPackageConfig, 'json'));
|
||||
}
|
||||
catch (err) {
|
||||
exports.configStore();
|
||||
plugins.beautylog.log('config initialized!');
|
||||
}
|
||||
// project config
|
||||
try {
|
||||
if (!exports.config.project) {
|
||||
exports.config.project = plugins.smartfile.fs.toObjectSync(paths.NpmciProjectDir, 'npmci.json');
|
||||
plugins.beautylog.ok('project config found!');
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
exports.config.project = {};
|
||||
plugins.beautylog.log('no project config found, so proceeding with default behaviour!');
|
||||
}
|
||||
exports.config.dockerRegistry ? exports.dockerRegistry = exports.config.dockerRegistry : void (0);
|
||||
exports.config.dockerFilesBuilt ? exports.dockerFilesBuilt = exports.config.dockerFilesBuilt : void (0);
|
||||
};
|
||||
configLoad();
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtY2kuZW52LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvbnBtY2kuZW52LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSwyQ0FBMEM7QUFDMUMsdUNBQXNDO0FBQ3RDLDZDQUFxQztBQU9yQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztJQUNsQyxZQUFJLEdBQUcsSUFBSSxxQkFBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtBQUNuRCxDQUFDO0FBRUQ7O0dBRUc7QUFDUSxRQUFBLFVBQVUsR0FBVyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQTtBQUkvQyxRQUFBLGlCQUFpQixHQUFHLENBQUMsaUJBQXlCO0lBQ3ZELHNCQUFjLEdBQUcsaUJBQWlCLENBQUE7QUFDcEMsQ0FBQyxDQUFBO0FBQ1UsUUFBQSxnQkFBZ0IsR0FBaUIsRUFBRSxDQUFBO0FBQ25DLFFBQUEsV0FBVyxHQUFpQixFQUFFLENBQUE7QUFFekM7O0dBRUc7QUFDUSxRQUFBLE1BQU0sR0FBRztJQUNsQixjQUFjLEVBQUUsU0FBUztJQUN6QixnQkFBZ0IsRUFBRSx3QkFBZ0I7SUFDbEMsV0FBVyxFQUFFLG1CQUFXO0lBQ3hCLE9BQU8sRUFBRSxTQUFTO0NBQ25CLENBQUE7QUFFRDs7R0FFRztBQUNRLFFBQUEsV0FBVyxHQUFHO0lBQ3ZCLGNBQU0sQ0FBQyxjQUFjLEdBQUcsc0JBQWMsQ0FBQTtJQUN0QyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBTSxDQUFDLEVBQ3RCLEtBQUssQ0FBQyxrQkFBa0IsQ0FDekIsQ0FBQTtBQUNILENBQUMsQ0FBQSxDQUFBO0FBRUQ7O0dBRUc7QUFDSCxJQUFJLFVBQVUsR0FBRztJQUNmLHVFQUF1RTtJQUN2RSxJQUFJLENBQUM7UUFDSCxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFNLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFBO0lBQ3BHLENBQUM7SUFBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2IsbUJBQVcsRUFBRSxDQUFBO1FBQ2IsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQTtJQUM5QyxDQUFDO0lBRUQsaUJBQWlCO0lBQ2pCLElBQUksQ0FBQztRQUNILEVBQUUsQ0FBQyxDQUFDLENBQUMsY0FBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDcEIsY0FBTSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxZQUFZLENBQUMsQ0FBQTtZQUN2RixPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO1FBQy9DLENBQUM7SUFDSCxDQUFDO0lBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNiLGNBQU0sQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFBO1FBQ25CLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGdFQUFnRSxDQUFDLENBQUE7SUFDekYsQ0FBQztJQUVELGNBQU0sQ0FBQyxjQUFjLEdBQUcsc0JBQWMsR0FBRyxjQUFNLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN6RSxjQUFNLENBQUMsZ0JBQWdCLEdBQUcsd0JBQWdCLEdBQUcsY0FBTSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNqRixDQUFDLENBQUE7QUFDRCxVQUFVLEVBQUUsQ0FBQSJ9
|
||||
17
dist/npmci.mods.d.ts
vendored
17
dist/npmci.mods.d.ts
vendored
@@ -1,17 +0,0 @@
|
||||
import * as _modClean from './mod_clean/index';
|
||||
import * as _modCloudflare from './mod_cloudflare/index';
|
||||
import * as _modCommand from './mod_command/index';
|
||||
import * as _modDocker from './mod_docker/index';
|
||||
import * as _modNpm from './mod_npm/index';
|
||||
import * as _modNode from './mod_node/index';
|
||||
import * as _modSsh from './mod_ssh/index';
|
||||
import * as _modTrigger from './mod_trigger/index';
|
||||
import { LazyModule } from 'smartsystem';
|
||||
export declare let modClean: LazyModule<typeof _modClean>;
|
||||
export declare let modCloudflare: LazyModule<typeof _modCloudflare>;
|
||||
export declare let modCommand: LazyModule<typeof _modCommand>;
|
||||
export declare let modDocker: LazyModule<typeof _modDocker>;
|
||||
export declare let modNode: LazyModule<typeof _modNode>;
|
||||
export declare let modNpm: LazyModule<typeof _modNpm>;
|
||||
export declare let modSsh: LazyModule<typeof _modSsh>;
|
||||
export declare let modTrigger: LazyModule<typeof _modTrigger>;
|
||||
12
dist/npmci.mods.js
vendored
12
dist/npmci.mods.js
vendored
@@ -1,12 +0,0 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const smartsystem_1 = require("smartsystem");
|
||||
exports.modClean = new smartsystem_1.LazyModule('./mod_clean/index', __dirname);
|
||||
exports.modCloudflare = new smartsystem_1.LazyModule('./mod_cloudflare/index', __dirname);
|
||||
exports.modCommand = new smartsystem_1.LazyModule('./mod_command/index', __dirname);
|
||||
exports.modDocker = new smartsystem_1.LazyModule('./mod_docker/index', __dirname);
|
||||
exports.modNode = new smartsystem_1.LazyModule('./mod_node/index', __dirname);
|
||||
exports.modNpm = new smartsystem_1.LazyModule('./mod_npm/index', __dirname);
|
||||
exports.modSsh = new smartsystem_1.LazyModule('./mod_ssh/index', __dirname);
|
||||
exports.modTrigger = new smartsystem_1.LazyModule('./mod_trigger/index', __dirname);
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtY2kubW9kcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL25wbWNpLm1vZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFTQSw2Q0FBd0M7QUFFN0IsUUFBQSxRQUFRLEdBQUcsSUFBSSx3QkFBVSxDQUFtQixtQkFBbUIsRUFBRSxTQUFTLENBQUMsQ0FBQTtBQUMzRSxRQUFBLGFBQWEsR0FBRyxJQUFJLHdCQUFVLENBQXdCLHdCQUF3QixFQUFFLFNBQVMsQ0FBQyxDQUFBO0FBQzFGLFFBQUEsVUFBVSxHQUFHLElBQUksd0JBQVUsQ0FBcUIscUJBQXFCLEVBQUUsU0FBUyxDQUFDLENBQUE7QUFDakYsUUFBQSxTQUFTLEdBQUcsSUFBSSx3QkFBVSxDQUFvQixvQkFBb0IsRUFBRSxTQUFTLENBQUMsQ0FBQTtBQUM5RSxRQUFBLE9BQU8sR0FBRyxJQUFJLHdCQUFVLENBQWtCLGtCQUFrQixFQUFFLFNBQVMsQ0FBQyxDQUFBO0FBQ3hFLFFBQUEsTUFBTSxHQUFHLElBQUksd0JBQVUsQ0FBaUIsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLENBQUE7QUFDckUsUUFBQSxNQUFNLEdBQUcsSUFBSSx3QkFBVSxDQUFpQixpQkFBaUIsRUFBRSxTQUFTLENBQUMsQ0FBQTtBQUNyRSxRQUFBLFVBQVUsR0FBRyxJQUFJLHdCQUFVLENBQXFCLHFCQUFxQixFQUFFLFNBQVMsQ0FBQyxDQUFBIn0=
|
||||
2
dist/npmci.monitor.d.ts
vendored
2
dist/npmci.monitor.d.ts
vendored
@@ -1,2 +0,0 @@
|
||||
import { Smartmonitor } from 'smartmonitor';
|
||||
export declare let npmciMonitor: Smartmonitor;
|
||||
18
dist/npmci.monitor.js
vendored
18
dist/npmci.monitor.js
vendored
@@ -1,18 +0,0 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const plugins = require("./npmci.plugins");
|
||||
const smartmonitor_1 = require("smartmonitor");
|
||||
exports.npmciMonitor = new smartmonitor_1.Smartmonitor();
|
||||
let monitorEnvString = process.env.NPMCI_MONITOR;
|
||||
if (monitorEnvString) {
|
||||
let npmciMonitorKeys = monitorEnvString.split('|');
|
||||
exports.npmciMonitor.addInstrumental({
|
||||
apiKey: process.env.NPMCI_MONITOR
|
||||
});
|
||||
plugins.beautylog.info('Monitoring activated');
|
||||
}
|
||||
else {
|
||||
plugins.beautylog.warn('Monitoring could not be enabled due to missing API-KEY');
|
||||
}
|
||||
exports.npmciMonitor.increment('lossless-ci.builds', 1);
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtY2kubW9uaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL25wbWNpLm1vbml0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwyQ0FBMEM7QUFHMUMsK0NBQTJDO0FBRWhDLFFBQUEsWUFBWSxHQUFHLElBQUksMkJBQVksRUFBRSxDQUFBO0FBRTVDLElBQUksZ0JBQWdCLEdBQVcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUE7QUFFeEQsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLElBQUksZ0JBQWdCLEdBQWEsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQzVELG9CQUFZLENBQUMsZUFBZSxDQUFDO1FBQzNCLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWE7S0FDbEMsQ0FBQyxDQUFBO0lBQ0YsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtBQUNoRCxDQUFDO0FBQUMsSUFBSSxDQUFDLENBQUM7SUFDTixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyx3REFBd0QsQ0FBQyxDQUFBO0FBQ2xGLENBQUM7QUFFRCxvQkFBWSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUMsQ0FBQSJ9
|
||||
5
dist/npmci.paths.d.ts
vendored
5
dist/npmci.paths.d.ts
vendored
@@ -1,5 +0,0 @@
|
||||
export declare let cwd: string;
|
||||
export declare let NpmciPackageRoot: string;
|
||||
export declare let NpmciPackageConfig: string;
|
||||
export declare let NpmciProjectDir: string;
|
||||
export declare let NpmciTestDir: string;
|
||||
9
dist/npmci.paths.js
vendored
9
dist/npmci.paths.js
vendored
@@ -1,9 +0,0 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const plugins = require("./npmci.plugins");
|
||||
exports.cwd = process.cwd();
|
||||
exports.NpmciPackageRoot = plugins.path.join(__dirname, '../');
|
||||
exports.NpmciPackageConfig = plugins.path.join(exports.NpmciPackageRoot, './config.json');
|
||||
exports.NpmciProjectDir = exports.cwd;
|
||||
exports.NpmciTestDir = plugins.path.join(exports.cwd, './test');
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtY2kucGF0aHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9ucG1jaS5wYXRocy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDJDQUEwQztBQUUvQixRQUFBLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUE7QUFFbkIsUUFBQSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUMsS0FBSyxDQUFDLENBQUE7QUFDckQsUUFBQSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBZ0IsRUFBQyxlQUFlLENBQUMsQ0FBQTtBQUN4RSxRQUFBLGVBQWUsR0FBRyxXQUFHLENBQUE7QUFDckIsUUFBQSxZQUFZLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBRyxFQUFDLFFBQVEsQ0FBQyxDQUFBIn0=
|
||||
22
dist/npmci.plugins.d.ts
vendored
22
dist/npmci.plugins.d.ts
vendored
@@ -1,22 +0,0 @@
|
||||
export import beautylog = require('beautylog');
|
||||
export declare let gulp: any;
|
||||
export import gulpFunction = require('gulp-function');
|
||||
export import lodash = require('lodash');
|
||||
export import npmextra = require('npmextra');
|
||||
export import path = require('path');
|
||||
export import projectinfo = require('projectinfo');
|
||||
export import q = require('smartq');
|
||||
export declare let request: any;
|
||||
export import smartcli = require('smartcli');
|
||||
export import smartdelay = require('smartdelay');
|
||||
export import smartfile = require('smartfile');
|
||||
export import shelljs = require('shelljs');
|
||||
export import smartmonitor = require('smartmonitor');
|
||||
export import smartparam = require('smartparam');
|
||||
export import smartq = require('smartq');
|
||||
export import smartshell = require('smartshell');
|
||||
export import smartsocket = require('smartsocket');
|
||||
export import smartsystem = require('smartsystem');
|
||||
export import smartssh = require('smartssh');
|
||||
export import smartstring = require('smartstring');
|
||||
export import through2 = require('through2');
|
||||
25
dist/npmci.plugins.js
vendored
25
dist/npmci.plugins.js
vendored
@@ -1,25 +0,0 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.beautylog = require("beautylog");
|
||||
exports.gulp = require('gulp');
|
||||
exports.gulpFunction = require("gulp-function");
|
||||
exports.lodash = require("lodash");
|
||||
exports.npmextra = require("npmextra");
|
||||
exports.path = require("path");
|
||||
exports.projectinfo = require("projectinfo");
|
||||
exports.q = require("smartq");
|
||||
exports.request = require('request');
|
||||
exports.smartcli = require("smartcli");
|
||||
exports.smartdelay = require("smartdelay");
|
||||
exports.smartfile = require("smartfile");
|
||||
exports.shelljs = require("shelljs");
|
||||
exports.smartmonitor = require("smartmonitor");
|
||||
exports.smartparam = require("smartparam");
|
||||
exports.smartq = require("smartq");
|
||||
exports.smartshell = require("smartshell");
|
||||
exports.smartsocket = require("smartsocket");
|
||||
exports.smartsystem = require("smartsystem");
|
||||
exports.smartssh = require("smartssh");
|
||||
exports.smartstring = require("smartstring");
|
||||
exports.through2 = require("through2");
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtY2kucGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL25wbWNpLnBsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx5Q0FBOEM7QUFDbkMsUUFBQSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQ2pDLGdEQUFxRDtBQUNyRCxtQ0FBd0M7QUFDeEMsdUNBQTRDO0FBQzVDLCtCQUFvQztBQUNwQyw2Q0FBa0Q7QUFDbEQsOEJBQW1DO0FBQ3hCLFFBQUEsT0FBTyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUN2Qyx1Q0FBNEM7QUFDNUMsMkNBQWdEO0FBQ2hELHlDQUE4QztBQUM5QyxxQ0FBMEM7QUFDMUMsK0NBQW9EO0FBQ3BELDJDQUFnRDtBQUNoRCxtQ0FBd0M7QUFDeEMsMkNBQWdEO0FBQ2hELDZDQUFrRDtBQUNsRCw2Q0FBa0Q7QUFDbEQsdUNBQTRDO0FBQzVDLDZDQUFrRDtBQUNsRCx1Q0FBNEMifQ==
|
||||
@@ -1,99 +0,0 @@
|
||||
# npmci
|
||||
node and docker in gitlab ci on steroids
|
||||
|
||||
## Availabililty
|
||||
[](https://www.npmjs.com/package/npmci)
|
||||
[](https://GitLab.com/gitzone/npmci)
|
||||
[](https://github.com/gitzone/npmci)
|
||||
[](https://gitzone.gitlab.io/npmci/)
|
||||
|
||||
## Status for master
|
||||
[](https://GitLab.com/gitzone/npmci/commits/master)
|
||||
[](https://GitLab.com/gitzone/npmci/commits/master)
|
||||
[](https://www.npmjs.com/package/npmci)
|
||||
[](https://david-dm.org/gitzonetools/npmci)
|
||||
[](https://www.bithound.io/github/gitzonetools/npmci/master/dependencies/npm)
|
||||
[](https://www.bithound.io/github/gitzonetools/npmci)
|
||||
[](https://nodejs.org/dist/latest-v6.x/docs/api/)
|
||||
[](https://nodejs.org/dist/latest-v6.x/docs/api/)
|
||||
[](http://standardjs.com/)
|
||||
|
||||
## Usage
|
||||
Use TypeScript for best in class instellisense.
|
||||
|
||||
npmci is designed to work in docker CI environments. The following docker images come with npmci presinstalled:
|
||||
|
||||
Docker Hub:
|
||||
|
||||
* [hosttoday/ht-docker-node:npmci](https://hub.docker.com/r/hosttoday/ht-docker-node/)
|
||||
has LTS node version and npmci preinstalled.
|
||||
* [hosttoday/ht-docker-dbase](https://hub.docker.com/r/hosttoday/ht-docker-dbase/)
|
||||
based on docker:git, can be used to build docker images in conjunction with docker:dind
|
||||
|
||||
npmci can be called from commandline:
|
||||
```shell
|
||||
# Install any node version:
|
||||
npmci install lts # will install latest LTS node version and update PATH for node and npm versions
|
||||
npmci install stable # will install latest stable node version and update PATH for node and npm
|
||||
npmci install legacy # will install latest legacy node version and update PATH for node and npm
|
||||
npmci install x.x.x # will install any specific node version.
|
||||
|
||||
# Install any node version, install dependencies and run test in cwd:
|
||||
npmci test lts # will install latest lts node version and run "npm install" and "npm test".
|
||||
npmci test stable # will install latest stable node version and run "npm install" and "npm test".
|
||||
npmci test legacy # will install latest legacy node version and run "npm install" and "npm test".
|
||||
npmci test x.x.x # will install any specific node version and run "npm install" and "npm test".
|
||||
npmci test docker # will test any build image with tests defined in ./npmci/dockertest_1.sh to ./npmci/dockertest_100.sh
|
||||
## npmci test docker will look at all Dockerfiles and look for according tags on GitLab container registry
|
||||
|
||||
|
||||
# prepare tools
|
||||
npmci prepare npm # will look for $NPMCI_TOKEN_NPM env var and create .npmrc, so npm is authenticated
|
||||
npmci prepare docker # will look for $NPMCI_LOGIN_DOCKER in form username|password and authenticate docker
|
||||
npmci prepare docker-gitlab # will authenticate docker for gitlab container registry
|
||||
|
||||
# build containers
|
||||
npmci build docker # will build containers
|
||||
## all Dockerfiles named Dockerfile* are picked up.
|
||||
## specify tags like this Dockerfile_[tag]
|
||||
## uploads all built images as [username]/[reponame]:[tag]_test to GitLab
|
||||
## then test in next step with "npmci test docker"
|
||||
|
||||
# publish npm module
|
||||
npmci publish npm # will look vor $NPMCI_TOKEN_NPM env var and push any module in cwd to npm
|
||||
npmci publish docker
|
||||
|
||||
# trigger webhooks
|
||||
npmci trigger # will look for NPMCI_TRIGGER_1 to NPMCI_TRIGGER_100 in form domain|id|token|ref|name
|
||||
```
|
||||
|
||||
## Configuration
|
||||
npmci supports the use of npmextra.
|
||||
|
||||
To configure npmci create a `npmextra.json` file at the root of your project
|
||||
|
||||
```json
|
||||
{
|
||||
"npmci": {
|
||||
"globalNpmTools": [
|
||||
"npm-check-updates",
|
||||
"protractor",
|
||||
"npmts",
|
||||
"gitzone"
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Available options**
|
||||
|
||||
setting | example | description
|
||||
--- | --- | ---
|
||||
globalNpmTools | "globalNpmTools": ["gitbook"] | Will look for the specified package names locally and (if not yet present) install them from npm.
|
||||
|
||||
For further information read the linked docs at the top of this README.
|
||||
|
||||
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
|
||||
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
|
||||
|
||||
[](https://push.rocks)
|
||||
19
docs/ssh.md
19
docs/ssh.md
@@ -1,19 +0,0 @@
|
||||
# SSH
|
||||
npmci allows easy usage of ssh:
|
||||
|
||||
## Add the SSH KEY to the environment
|
||||
|
||||
To make npmci aware of any SSH KEY add it to the environment in the following format
|
||||
```
|
||||
# Key
|
||||
NPMCI_SSHKEY_[A_NAME_FROM_YOU]
|
||||
# Value:
|
||||
[targeted host]|[privatekey as base64]|***
|
||||
```
|
||||
|
||||
## Use npmci cli tool in your ci script
|
||||
```
|
||||
npmci prepare ssh
|
||||
npmci command git remote add heroku ssh://git@heroku.com/[you project name].git
|
||||
npmci command git push heroku master
|
||||
```
|
||||
@@ -1,16 +1,22 @@
|
||||
{
|
||||
"npmts":{
|
||||
"mode":"default",
|
||||
"coverageTreshold": "70",
|
||||
"cli": true
|
||||
},
|
||||
"npmci": {
|
||||
"globalNpmTools": [
|
||||
"npmts"
|
||||
]
|
||||
"npmGlobalTools": [],
|
||||
"npmAccessLevel": "public",
|
||||
"npmRegistryUrl": "registry.npmjs.org"
|
||||
},
|
||||
"npmdocker":{
|
||||
"baseImage":"hosttoday/ht-docker-node:npmci",
|
||||
"npmdocker": {
|
||||
"baseImage": "hosttoday/ht-docker-node:npmci",
|
||||
"command": "npmci test stable"
|
||||
},
|
||||
"gitzone": {
|
||||
"projectType": "npm",
|
||||
"module": {
|
||||
"githost": "gitlab.com",
|
||||
"gitscope": "ship.zone",
|
||||
"gitrepo": "npmci",
|
||||
"description": "node and docker in gitlab ci on steroids",
|
||||
"npmPackagename": "@ship.zone/npmci",
|
||||
"license": "MIT"
|
||||
}
|
||||
}
|
||||
}
|
||||
92
package.json
92
package.json
@@ -1,15 +1,19 @@
|
||||
{
|
||||
"name": "npmci",
|
||||
"version": "3.0.0",
|
||||
"name": "@ship.zone/npmci",
|
||||
"version": "4.1.28",
|
||||
"private": false,
|
||||
"description": "node and docker in gitlab ci on steroids",
|
||||
"main": "dist/index.js",
|
||||
"typings": "dist/index.d.ts",
|
||||
"main": "dist_ts/index.js",
|
||||
"typings": "dist_ts/index.d.ts",
|
||||
"type": "module",
|
||||
"bin": {
|
||||
"npmci": "dist/cli.js"
|
||||
"npmci": "cli.js"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "(rm -f config.json) && (npmts) && (npm run testVersion)",
|
||||
"testVersion": "(cd test/assets/ && node ../../dist/cli.js -v)"
|
||||
"test": "tstest test/",
|
||||
"build": "tsbuild --allowimplicitany && (npm run testVersion)",
|
||||
"testVersion": "(cd test/assets/ && node ../../cli.js -v)",
|
||||
"buildDocs": "tsdoc"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -22,34 +26,52 @@
|
||||
},
|
||||
"homepage": "https://gitlab.com/gitzone/npmci#README",
|
||||
"devDependencies": {
|
||||
"tapbundle": "^1.1.1"
|
||||
"@gitzone/tsbuild": "^2.1.66",
|
||||
"@gitzone/tsrun": "^1.2.44",
|
||||
"@gitzone/tstest": "^1.0.77",
|
||||
"@push.rocks/tapbundle": "^5.0.15",
|
||||
"@types/node": "^20.5.4"
|
||||
},
|
||||
"dependencies": {
|
||||
"@types/lodash": "^4.14.74",
|
||||
"@types/node": "^8.0.25",
|
||||
"@types/shelljs": "^0.7.4",
|
||||
"@types/through2": "^2.0.33",
|
||||
"beautylog": "^6.1.10",
|
||||
"cflare": "^1.0.5",
|
||||
"gulp": "^3.9.1",
|
||||
"gulp-function": "^2.2.9",
|
||||
"lodash": "^4.17.4",
|
||||
"npmextra": "^2.0.9",
|
||||
"projectinfo": "^3.0.2",
|
||||
"request": "^2.81.0",
|
||||
"shelljs": "^0.7.8",
|
||||
"smartcli": "^2.0.7",
|
||||
"smartdelay": "^1.0.3",
|
||||
"smartfile": "^4.2.20",
|
||||
"smartmonitor": "^1.0.3",
|
||||
"smartparam": "^1.0.1",
|
||||
"smartq": "^1.1.6",
|
||||
"smartshell": "^1.0.13",
|
||||
"smartsocket": "^1.1.10",
|
||||
"smartssh": "^1.2.2",
|
||||
"smartstring": "^2.0.24",
|
||||
"smartsystem": "^2.0.2",
|
||||
"through2": "^2.0.3",
|
||||
"typings-global": "^1.0.20"
|
||||
}
|
||||
"@api.global/typedrequest": "^3.0.1",
|
||||
"@push.rocks/lik": "^6.0.5",
|
||||
"@push.rocks/npmextra": "^4.0.0",
|
||||
"@push.rocks/projectinfo": "^5.0.2",
|
||||
"@push.rocks/qenv": "^6.0.2",
|
||||
"@push.rocks/smartanalytics": "^2.0.15",
|
||||
"@push.rocks/smartcli": "^4.0.8",
|
||||
"@push.rocks/smartdelay": "^3.0.5",
|
||||
"@push.rocks/smartenv": "^5.0.5",
|
||||
"@push.rocks/smartfile": "^10.0.30",
|
||||
"@push.rocks/smartgit": "^3.0.1",
|
||||
"@push.rocks/smartlog": "^3.0.3",
|
||||
"@push.rocks/smartlog-destination-local": "^9.0.0",
|
||||
"@push.rocks/smartobject": "^1.0.12",
|
||||
"@push.rocks/smartpath": "^5.0.11",
|
||||
"@push.rocks/smartpromise": "^4.0.2",
|
||||
"@push.rocks/smartrequest": "^2.0.18",
|
||||
"@push.rocks/smartshell": "^3.0.3",
|
||||
"@push.rocks/smartsocket": "^2.0.22",
|
||||
"@push.rocks/smartssh": "^2.0.1",
|
||||
"@push.rocks/smartstring": "^4.0.8",
|
||||
"@servezone/interfaces": "^1.0.3",
|
||||
"@tsclass/tsclass": "^4.0.42",
|
||||
"@types/through2": "^2.0.38",
|
||||
"through2": "^4.0.2"
|
||||
},
|
||||
"files": [
|
||||
"ts/**/*",
|
||||
"ts_web/**/*",
|
||||
"dist/**/*",
|
||||
"dist_*/**/*",
|
||||
"dist_ts/**/*",
|
||||
"dist_ts_web/**/*",
|
||||
"assets/**/*",
|
||||
"cli.js",
|
||||
"npmextra.json",
|
||||
"readme.md"
|
||||
],
|
||||
"browserslist": [
|
||||
"last 1 chrome versions"
|
||||
]
|
||||
}
|
||||
|
||||
5855
pnpm-lock.yaml
generated
Normal file
5855
pnpm-lock.yaml
generated
Normal file
File diff suppressed because it is too large
Load Diff
117
readme.md
117
readme.md
@@ -1,29 +1,110 @@
|
||||
# npmci
|
||||
# @shipzone/npmci
|
||||
node and docker in gitlab ci on steroids
|
||||
|
||||
## Availabililty
|
||||
[](https://www.npmjs.com/package/npmci)
|
||||
[](https://GitLab.com/gitzone/npmci)
|
||||
[](https://github.com/gitzone/npmci)
|
||||
[](https://gitzone.gitlab.io/npmci/)
|
||||
## Availabililty and Links
|
||||
* [npmjs.org (npm package)](https://www.npmjs.com/package/@shipzone/npmci)
|
||||
* [gitlab.com (source)](https://gitlab.com/shipzone/npmci)
|
||||
* [github.com (source mirror)](https://github.com/shipzone/npmci)
|
||||
* [docs (typedoc)](https://shipzone.gitlab.io/npmci/)
|
||||
|
||||
## Status for master
|
||||
[](https://GitLab.com/gitzone/npmci/commits/master)
|
||||
[](https://GitLab.com/gitzone/npmci/commits/master)
|
||||
[](https://www.npmjs.com/package/npmci)
|
||||
[](https://david-dm.org/gitzonetools/npmci)
|
||||
[](https://www.bithound.io/github/gitzonetools/npmci/master/dependencies/npm)
|
||||
[](https://www.bithound.io/github/gitzonetools/npmci)
|
||||
[](https://nodejs.org/dist/latest-v6.x/docs/api/)
|
||||
[](https://nodejs.org/dist/latest-v6.x/docs/api/)
|
||||
[](http://standardjs.com/)
|
||||
|
||||
Status Category | Status Badge
|
||||
-- | --
|
||||
GitLab Pipelines | [](https://lossless.cloud)
|
||||
GitLab Pipline Test Coverage | [](https://lossless.cloud)
|
||||
npm | [](https://lossless.cloud)
|
||||
Snyk | [](https://lossless.cloud)
|
||||
TypeScript Support | [](https://lossless.cloud)
|
||||
node Support | [](https://nodejs.org/dist/latest-v10.x/docs/api/)
|
||||
Code Style | [](https://lossless.cloud)
|
||||
PackagePhobia (total standalone install weight) | [](https://lossless.cloud)
|
||||
PackagePhobia (package size on registry) | [](https://lossless.cloud)
|
||||
BundlePhobia (total size when bundled) | [](https://lossless.cloud)
|
||||
|
||||
## Usage
|
||||
|
||||
Use TypeScript for best in class instellisense.
|
||||
|
||||
npmci is designed to work in docker CI environments. The following docker images come with npmci presinstalled:
|
||||
|
||||
Docker Hub:
|
||||
|
||||
- [hosttoday/ht-docker-node:npmci](https://hub.docker.com/r/hosttoday/ht-docker-node/)
|
||||
has LTS node version and npmci preinstalled.
|
||||
- [hosttoday/ht-docker-dbase](https://hub.docker.com/r/hosttoday/ht-docker-dbase/)
|
||||
based on docker:git, can be used to build docker images in conjunction with docker:dind
|
||||
|
||||
npmci can be called from commandline and handle a lot of tasks durug ci:
|
||||
|
||||
```shell
|
||||
# Handle node versions
|
||||
npmci node install stable # will install latest stable node version and update PATH for node and npm
|
||||
npmci node install lts # will install latest LTS node version and update PATH for node and npm versions
|
||||
npmci node install legacy # will install latest legacy node version and update PATH for node and npm
|
||||
npmci node install x.x.x # will install any specific node version.
|
||||
|
||||
# Handle npm and yarn tasks
|
||||
npmcu npm login # logs in npm using the auth key provided at env var "NPMCI_TOKEN_NPM"
|
||||
npmci npm install # installs dependencies using npm or yarn dependending on availablity
|
||||
npmci npm test # tests the package
|
||||
npmci npm publish # builds a package and publishes it
|
||||
|
||||
# handle docker tasks
|
||||
npmci docker prepare
|
||||
## npmci test docker will look at all Dockerfiles and look for according tags on GitLab container registry
|
||||
|
||||
|
||||
# prepare tools
|
||||
npmci prepare npm # will look for $NPMCI_TOKEN_NPM env var and create .npmrc, so npm is authenticated
|
||||
npmci prepare docker # will look for $NPMCI_LOGIN_DOCKER in form username|password and authenticate docker
|
||||
npmci prepare docker-gitlab # will authenticate docker for gitlab container registry
|
||||
|
||||
# build containers
|
||||
npmci docker build # will build containers
|
||||
## all Dockerfiles named Dockerfile* are picked up.
|
||||
## specify tags like this Dockerfile_[tag]
|
||||
## uploads all built images as [username]/[reponame]:[tag]_test to GitLab
|
||||
## then test in next step with "npmci test docker"
|
||||
|
||||
# publish npm module
|
||||
npmci publish npm # will look vor $NPMCI_TOKEN_NPM env var and push any module in cwd to npm
|
||||
npmci publish docker
|
||||
|
||||
# trigger webhooks
|
||||
npmci trigger # will look for NPMCI_TRIGGER_1 to NPMCI_TRIGGER_100 in form domain|id|token|ref|name
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
npmci supports the use of npmextra.
|
||||
|
||||
To configure npmci create a `npmextra.json` file at the root of your project
|
||||
|
||||
```json
|
||||
{
|
||||
"npmci": {
|
||||
"globalNpmTools": ["npm-check-updates", "protractor", "npmts", "gitzone"]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Available options**
|
||||
|
||||
| setting | example | description |
|
||||
| -------------- | ----------------------------- | ------------------------------------------------------------------------------------------------- |
|
||||
| globalNpmTools | "globalNpmTools": ["gitbook"] | Will look for the specified package names locally and (if not yet present) install them from npm. |
|
||||
|
||||
For further information read the linked docs at the top of this README.
|
||||
|
||||
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
|
||||
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
|
||||
Use TypeScript for best in class instellisense.
|
||||
|
||||
[](https://push.rocks)
|
||||
## Contribution
|
||||
|
||||
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
|
||||
|
||||
For further information read the linked docs at the top of this readme.
|
||||
|
||||
## Legal
|
||||
> MIT licensed | **©** [Task Venture Capital GmbH](https://task.vc)
|
||||
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
|
||||
|
||||
33
test/assets/package.json
Normal file
33
test/assets/package.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"name": "sandbox-npmts",
|
||||
"version": "1.0.1",
|
||||
"description": "a cool test repo for npmts",
|
||||
"main": "dist/index.js",
|
||||
"typings": "dist/index.d.ts",
|
||||
"directories": {
|
||||
"test": "test"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "(npmts)",
|
||||
"testDev": "node ../../pushrocks/npmts/dist/index.js"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+ssh://git@gitlab.com/sandboxzone/sandbox-npmts.git"
|
||||
},
|
||||
"author": "Lossless GmbH",
|
||||
"license": "MIT",
|
||||
"bugs": {
|
||||
"url": "https://gitlab.com/sandboxzone/sandbox-npmts/issues"
|
||||
},
|
||||
"homepage": "https://gitlab.com/sandboxzone/sandbox-npmts#README",
|
||||
"dependencies": {
|
||||
"smartchai": "^1.0.3",
|
||||
"smartci": "^1.0.2",
|
||||
"smartq": "^1.1.6"
|
||||
},
|
||||
"devDependencies": {
|
||||
"qenv": "^1.1.7",
|
||||
"tapbundle": "^1.1.1"
|
||||
}
|
||||
}
|
||||
26
test/test.cloudly.ts
Normal file
26
test/test.cloudly.ts
Normal file
@@ -0,0 +1,26 @@
|
||||
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
|
||||
import { tap, expect } from '@push.rocks/tapbundle';
|
||||
|
||||
import * as cloudlyConnectorMod from '../ts/connector.cloudly/cloudlyconnector.js';
|
||||
|
||||
tap.test('should be able to announce a container to cloudly', async () => {
|
||||
const cloudlyConnector = new cloudlyConnectorMod.CloudlyConnector(null);
|
||||
await cloudlyConnector.announceDockerContainer(
|
||||
{
|
||||
registryUrl: 'registry.losssless.com',
|
||||
tag: 'testcontainer',
|
||||
version: 'x.x.x',
|
||||
labels: [],
|
||||
},
|
||||
'cloudly.lossless.one'
|
||||
);
|
||||
});
|
||||
|
||||
tap.test('should close the program despite socket timeout', async (toolsArg) => {
|
||||
// TODO: remove when unreffed timeouts in webrequest have been solved.
|
||||
toolsArg.delayFor(0).then(() => {
|
||||
process.exit();
|
||||
});
|
||||
});
|
||||
|
||||
tap.start();
|
||||
201
test/test.ts
201
test/test.ts
@@ -1,136 +1,139 @@
|
||||
import { tap, expect } from 'tapbundle'
|
||||
import * as path from 'path'
|
||||
import { tap, expect } from '@push.rocks/tapbundle';
|
||||
import * as path from 'path';
|
||||
import * as smartpath from '@push.rocks/smartpath';
|
||||
|
||||
process.env.NPMTS_TEST = 'true';
|
||||
process.env.NPMCI_URL_CLOUDLY = 'localhost';
|
||||
|
||||
// set up environment
|
||||
process.env.CI_REPOSITORY_URL = 'https://yyyyyy:xxxxxxxx@gitlab.com/mygroup/myrepo.git'
|
||||
process.env.NPMCI_SSHKEY_1 = 'hostString|somePrivKey|##'
|
||||
process.env.NPMTS_TEST = 'true'
|
||||
process.cwd = () => {
|
||||
return path.join(__dirname, 'assets/')
|
||||
}
|
||||
process.env.CI_REPOSITORY_URL = 'https://yyyyyy:xxxxxxxx@gitlab.com/mygroup/myrepo.git';
|
||||
process.env.CI_BUILD_TOKEN = 'kjlkjfiudofiufs';
|
||||
|
||||
// require NPMCI files
|
||||
import '../ts/index'
|
||||
import npmciModDocker = require('../ts/mod_docker/index')
|
||||
import npmciModNpm = require('../ts/mod_npm/index')
|
||||
import npmciModNode = require('../ts/mod_node/index')
|
||||
import npmciModSsh = require('../ts/mod_ssh/index')
|
||||
import npmciEnv = require('../ts/npmci.env')
|
||||
// Docker
|
||||
process.env.NPMCI_LOGIN_DOCKER = 'docker.io|someuser|somepass';
|
||||
|
||||
// SSH env
|
||||
process.env.NPMCI_SSHKEY_1 = 'hostString|somePrivKey|##';
|
||||
|
||||
process.cwd = () => {
|
||||
return path.join(smartpath.get.dirnameFromImportMetaUrl(import.meta.url), 'assets/');
|
||||
};
|
||||
|
||||
let npmci: typeof import('../ts/index.js');
|
||||
|
||||
type TNpmciTypes = typeof import('../ts/index.js');
|
||||
|
||||
tap.preTask('should import npmci', async () => {
|
||||
npmci = await import('../ts/index.js');
|
||||
});
|
||||
|
||||
// ======
|
||||
// Docker
|
||||
// ======
|
||||
|
||||
let dockerfile1: npmciModDocker.Dockerfile
|
||||
let dockerfile2: npmciModDocker.Dockerfile
|
||||
let sortableArray: npmciModDocker.Dockerfile[]
|
||||
let dockerfile1: npmci.Dockerfile;
|
||||
let dockerfile2: npmci.Dockerfile;
|
||||
let sortableArray: npmci.Dockerfile[];
|
||||
|
||||
tap.test('should return valid Dockerfiles', async () => {
|
||||
dockerfile1 = new npmciModDocker.Dockerfile({ filePath: './Dockerfile', read: true })
|
||||
dockerfile2 = new npmciModDocker.Dockerfile({ filePath: './Dockerfile_sometag1', read: true })
|
||||
expect(dockerfile1.version).to.equal('latest')
|
||||
return expect(dockerfile2.version).to.equal('sometag1')
|
||||
})
|
||||
const npmciInstance = new npmci.Npmci();
|
||||
await npmciInstance.start();
|
||||
await npmciInstance.start();
|
||||
dockerfile1 = new npmci.Dockerfile(npmciInstance.dockerManager, {
|
||||
filePath: './Dockerfile',
|
||||
read: true,
|
||||
});
|
||||
dockerfile2 = new npmci.Dockerfile(npmciInstance.dockerManager, {
|
||||
filePath: './Dockerfile_sometag1',
|
||||
read: true,
|
||||
});
|
||||
expect(dockerfile1.version).toEqual('latest');
|
||||
return expect(dockerfile2.version).toEqual('sometag1');
|
||||
});
|
||||
|
||||
tap.test('should read a directory of Dockerfiles', async () => {
|
||||
return npmciModDocker.readDockerfiles()
|
||||
.then(async (readDockerfilesArrayArg: npmciModDocker.Dockerfile[]) => {
|
||||
sortableArray = readDockerfilesArrayArg
|
||||
return expect(readDockerfilesArrayArg[1].version).to.equal('sometag1')
|
||||
})
|
||||
})
|
||||
const npmciInstance = new npmci.Npmci();
|
||||
await npmciInstance.start();
|
||||
return npmci.Dockerfile.readDockerfiles(npmciInstance.dockerManager).then(
|
||||
async (readDockerfilesArrayArg: npmci.Dockerfile[]) => {
|
||||
sortableArray = readDockerfilesArrayArg;
|
||||
return expect(readDockerfilesArrayArg[1].version).toEqual('sometag1');
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
tap.test('should sort an array of Dockerfiles', async () => {
|
||||
return npmciModDocker.sortDockerfiles(sortableArray)
|
||||
.then(async (sortedArrayArg: npmciModDocker.Dockerfile[]) => {
|
||||
console.log(sortedArrayArg)
|
||||
})
|
||||
})
|
||||
return npmci.Dockerfile.sortDockerfiles(sortableArray).then(
|
||||
async (sortedArrayArg: npmci.Dockerfile[]) => {
|
||||
console.log(sortedArrayArg);
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
tap.test('should build all Dockerfiles', async () => {
|
||||
return npmciModDocker.handleCli({
|
||||
_: [
|
||||
'docker',
|
||||
'build'
|
||||
]
|
||||
})
|
||||
})
|
||||
const npmciInstance = new npmci.Npmci();
|
||||
await npmciInstance.start();
|
||||
return npmciInstance.dockerManager.handleCli({
|
||||
_: ['docker', 'build'],
|
||||
});
|
||||
});
|
||||
|
||||
tap.test('should test all Dockerfiles', async () => {
|
||||
return await npmciModDocker.handleCli({
|
||||
_: [
|
||||
'docker',
|
||||
'test'
|
||||
]
|
||||
})
|
||||
})
|
||||
const npmciInstance = new npmci.Npmci();
|
||||
await npmciInstance.start();
|
||||
return npmciInstance.dockerManager.handleCli({
|
||||
_: ['docker', 'test'],
|
||||
});
|
||||
});
|
||||
|
||||
tap.test('should test dockerfiles', async () => {
|
||||
return await npmciModDocker.handleCli({
|
||||
_: [
|
||||
'docker',
|
||||
'test'
|
||||
]
|
||||
})
|
||||
})
|
||||
const npmciInstance = new npmci.Npmci();
|
||||
await npmciInstance.start();
|
||||
return npmciInstance.dockerManager.handleCli({
|
||||
_: ['docker', 'test'],
|
||||
});
|
||||
});
|
||||
|
||||
tap.test('should prepare docker daemon', async () => {
|
||||
return await npmciModDocker.handleCli({
|
||||
_: [
|
||||
'docker',
|
||||
'prepare'
|
||||
]
|
||||
})
|
||||
})
|
||||
tap.test('should login docker daemon', async () => {
|
||||
const npmciInstance = new npmci.Npmci();
|
||||
await npmciInstance.start();
|
||||
return npmciInstance.dockerManager.handleCli({
|
||||
_: ['docker', 'login'],
|
||||
});
|
||||
});
|
||||
|
||||
// ===
|
||||
// SSH
|
||||
// ===
|
||||
tap.test('should prepare SSH keys', async () => {
|
||||
const npmciModSsh = await import('../ts/mod_ssh/index.js');
|
||||
return await npmciModSsh.handleCli({
|
||||
_: [
|
||||
'ssh',
|
||||
'prepare'
|
||||
]
|
||||
})
|
||||
})
|
||||
_: ['ssh', 'prepare'],
|
||||
});
|
||||
});
|
||||
|
||||
// ====
|
||||
// node
|
||||
// ====
|
||||
tap.test('should install a certain version of node', async () => {
|
||||
await npmciModNode.handleCli({
|
||||
_: [
|
||||
'node',
|
||||
'install',
|
||||
'stable'
|
||||
]
|
||||
})
|
||||
await npmciModNode.handleCli({
|
||||
_: [
|
||||
'node',
|
||||
'install',
|
||||
'lts'
|
||||
]
|
||||
})
|
||||
await npmciModNode.handleCli({
|
||||
_: [
|
||||
'node',
|
||||
'install',
|
||||
'legacy'
|
||||
]
|
||||
})
|
||||
})
|
||||
const npmciInstance = new npmci.Npmci();
|
||||
await npmciInstance.start();
|
||||
await npmciInstance.nodejsManager.handleCli({
|
||||
_: ['node', 'install', 'stable'],
|
||||
});
|
||||
await npmciInstance.nodejsManager.handleCli({
|
||||
_: ['node', 'install', 'lts'],
|
||||
});
|
||||
await npmciInstance.nodejsManager.handleCli({
|
||||
_: ['node', 'install', 'legacy'],
|
||||
});
|
||||
});
|
||||
|
||||
// make sure test ends all right
|
||||
tap.test('reset paths', async () => {
|
||||
process.cwd = () => {
|
||||
return path.join(__dirname, '../')
|
||||
}
|
||||
})
|
||||
return path.join(__dirname, '../');
|
||||
};
|
||||
});
|
||||
|
||||
tap.test('', async () => {
|
||||
await npmciEnv.configStore()
|
||||
})
|
||||
|
||||
tap.start()
|
||||
tap.start();
|
||||
|
||||
8
ts/00_commitinfo_data.ts
Normal file
8
ts/00_commitinfo_data.ts
Normal file
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* autocreated commitinfo by @pushrocks/commitinfo
|
||||
*/
|
||||
export const commitinfo = {
|
||||
name: '@ship.zone/npmci',
|
||||
version: '4.1.28',
|
||||
description: 'node and docker in gitlab ci on steroids'
|
||||
}
|
||||
39
ts/connector.cloudly/cloudlyconnector.ts
Normal file
39
ts/connector.cloudly/cloudlyconnector.ts
Normal file
@@ -0,0 +1,39 @@
|
||||
import * as plugins from '../npmci.plugins.js';
|
||||
|
||||
import { Npmci } from '../npmci.classes.npmci.js';
|
||||
import { logger } from '../npmci.logging.js';
|
||||
|
||||
/**
|
||||
* connects to cloudly
|
||||
*/
|
||||
export class CloudlyConnector {
|
||||
public npmciRef: Npmci;
|
||||
|
||||
constructor(npmciRefArg: Npmci) {
|
||||
this.npmciRef = npmciRefArg;
|
||||
}
|
||||
|
||||
public async announceDockerContainer(
|
||||
optionsArg: plugins.tsclass.container.IContainer,
|
||||
testCloudlyUrlArg?: string
|
||||
) {
|
||||
const cloudlyUrl = testCloudlyUrlArg || this.npmciRef.npmciConfig.getConfig().urlCloudly;
|
||||
if (!cloudlyUrl) {
|
||||
logger.log(
|
||||
'warn',
|
||||
'no cloudly url provided. Thus we cannot announce the newly built Dockerimage!'
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const typedrequest =
|
||||
new plugins.typedrequest.TypedRequest<plugins.servezoneInterfaces.requests.IRequest_InformAboutNewContainerImage>(
|
||||
`https://${cloudlyUrl}/typedrequest`,
|
||||
'servezonestandard_InformAboutNewContainerVersion'
|
||||
);
|
||||
|
||||
const response = await typedrequest.fire({
|
||||
containerImageInfo: optionsArg,
|
||||
});
|
||||
}
|
||||
}
|
||||
10
ts/index.ts
10
ts/index.ts
@@ -1,2 +1,10 @@
|
||||
import './npmci.cli'
|
||||
import { Npmci } from './npmci.classes.npmci.js';
|
||||
import { Dockerfile } from './manager.docker/mod.classes.dockerfile.js';
|
||||
|
||||
export const npmciInstance = new Npmci();
|
||||
|
||||
export { Dockerfile, Npmci };
|
||||
|
||||
export const runCli = async () => {
|
||||
await npmciInstance.start();
|
||||
};
|
||||
|
||||
67
ts/manager.cloudron/index.ts
Normal file
67
ts/manager.cloudron/index.ts
Normal file
@@ -0,0 +1,67 @@
|
||||
import { logger } from '../npmci.logging.js';
|
||||
import * as plugins from './mod.plugins.js';
|
||||
import * as paths from '../npmci.paths.js';
|
||||
import { bash } from '../npmci.bash.js';
|
||||
import { Npmci } from '../npmci.classes.npmci.js';
|
||||
|
||||
export class NpmciCloudronManager {
|
||||
public npmciRef: Npmci;
|
||||
|
||||
constructor(npmciArg: Npmci) {
|
||||
this.npmciRef = npmciArg;
|
||||
}
|
||||
|
||||
/**
|
||||
* handle cli input
|
||||
* @param argvArg
|
||||
*/
|
||||
public handleCli = async (argvArg: any) => {
|
||||
if (argvArg._.length >= 2) {
|
||||
const action: string = argvArg._[1];
|
||||
switch (action) {
|
||||
case 'deploy':
|
||||
await this.deploy();
|
||||
break;
|
||||
default:
|
||||
logger.log('error', `>>npmci cloudron ...<< action >>${action}<< not supported`);
|
||||
}
|
||||
} else {
|
||||
logger.log(
|
||||
'info',
|
||||
`>>npmci cloudron ...<< cli arguments invalid... Please read the documentation.`
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Replaces the version string in CloudronManifest file
|
||||
* @param versionArg
|
||||
*/
|
||||
public deploy = async () => {
|
||||
logger.log('info', 'now deploying to cloudron...');
|
||||
logger.log('info', 'installing cloudron cli...');
|
||||
await bash(`pnpm install -g cloudron`);
|
||||
logger.log('ok', 'cloudron cli installed');
|
||||
|
||||
// lets set the version in the CloudronManifest file
|
||||
await this.prepareCloudronManifest(this.npmciRef.npmciConfig.getConfig().projectInfo.npm.version);
|
||||
logger.log('ok', 'CloudronManifest prepared');
|
||||
|
||||
// lets figure out the docker image tag
|
||||
const dockerImageTag = await this.npmciRef.npmciConfig.kvStorage.readKey('latestPushedDockerTag');
|
||||
const appName = this.npmciRef.npmciConfig.getConfig().cloudronAppName;
|
||||
|
||||
const cloudronEnvVar = process.env.NPMCI_LOGIN_CLOUDRON;
|
||||
const cloudronServer = cloudronEnvVar.split('|')[0];
|
||||
const cloudronToken = cloudronEnvVar.split('|')[1];
|
||||
await bash(`cloudron update --server ${cloudronServer} --token ${cloudronToken} --image ${dockerImageTag} --app ${appName}`);
|
||||
};
|
||||
|
||||
private prepareCloudronManifest = async (versionArg: string) => {
|
||||
const manifestPath = plugins.path.join(paths.cwd, 'CloudronManifest.json');
|
||||
let manifestFile = plugins.smartfile.fs.toStringSync(manifestPath);
|
||||
manifestFile = manifestFile.replace(/##version##/g, versionArg);
|
||||
plugins.smartfile.memory.toFsSync(manifestFile, manifestPath);
|
||||
logger.log('info', 'Version replaced in CloudronManifest file');
|
||||
}
|
||||
}
|
||||
1
ts/manager.cloudron/mod.plugins.ts
Normal file
1
ts/manager.cloudron/mod.plugins.ts
Normal file
@@ -0,0 +1 @@
|
||||
export * from '../npmci.plugins.js';
|
||||
190
ts/manager.docker/index.ts
Normal file
190
ts/manager.docker/index.ts
Normal file
@@ -0,0 +1,190 @@
|
||||
import { logger } from '../npmci.logging.js';
|
||||
import * as plugins from './mod.plugins.js';
|
||||
import * as paths from '../npmci.paths.js';
|
||||
import { bash } from '../npmci.bash.js';
|
||||
|
||||
// classes
|
||||
import { Npmci } from '../npmci.classes.npmci.js';
|
||||
import { Dockerfile } from './mod.classes.dockerfile.js';
|
||||
import { DockerRegistry } from './mod.classes.dockerregistry.js';
|
||||
import { RegistryStorage } from './mod.classes.registrystorage.js';
|
||||
|
||||
export class NpmciDockerManager {
|
||||
public npmciRef: Npmci;
|
||||
public npmciRegistryStorage = new RegistryStorage();
|
||||
|
||||
constructor(npmciArg: Npmci) {
|
||||
this.npmciRef = npmciArg;
|
||||
}
|
||||
|
||||
/**
|
||||
* handle cli input
|
||||
* @param argvArg
|
||||
*/
|
||||
public handleCli = async (argvArg: any) => {
|
||||
if (argvArg._.length >= 2) {
|
||||
const action: string = argvArg._[1];
|
||||
switch (action) {
|
||||
case 'build':
|
||||
await this.build();
|
||||
break;
|
||||
case 'login':
|
||||
case 'prepare':
|
||||
await this.login();
|
||||
break;
|
||||
case 'test':
|
||||
await this.test();
|
||||
break;
|
||||
case 'push':
|
||||
await this.push(argvArg);
|
||||
break;
|
||||
case 'pull':
|
||||
await this.pull(argvArg);
|
||||
break;
|
||||
default:
|
||||
logger.log('error', `>>npmci docker ...<< action >>${action}<< not supported`);
|
||||
}
|
||||
} else {
|
||||
logger.log(
|
||||
'info',
|
||||
`>>npmci docker ...<< cli arguments invalid... Please read the documentation.`
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* builds a cwd of Dockerfiles by triggering a promisechain
|
||||
*/
|
||||
public build = async () => {
|
||||
await this.prepare();
|
||||
logger.log('info', 'now building Dockerfiles...');
|
||||
await Dockerfile.readDockerfiles(this)
|
||||
.then(Dockerfile.sortDockerfiles)
|
||||
.then(Dockerfile.mapDockerfiles)
|
||||
.then(Dockerfile.buildDockerfiles);
|
||||
};
|
||||
|
||||
/**
|
||||
* login to the DockerRegistries
|
||||
*/
|
||||
public login = async () => {
|
||||
await this.prepare();
|
||||
await this.npmciRegistryStorage.loginAll();
|
||||
};
|
||||
|
||||
/**
|
||||
* logs in docker
|
||||
*/
|
||||
public prepare = async () => {
|
||||
// Always login to GitLab Registry
|
||||
if (process.env.GITLAB_CI) {
|
||||
console.log('gitlab ci detected');
|
||||
if (!process.env.CI_JOB_TOKEN || process.env.CI_JOB_TOKEN === '') {
|
||||
logger.log('error', 'Running in Gitlab CI, but no registry token specified by gitlab!');
|
||||
process.exit(1);
|
||||
}
|
||||
this.npmciRegistryStorage.addRegistry(
|
||||
new DockerRegistry({
|
||||
registryUrl: 'registry.gitlab.com',
|
||||
username: 'gitlab-ci-token',
|
||||
password: process.env.CI_JOB_TOKEN,
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
// handle registries
|
||||
await plugins.smartobject.forEachMinimatch(
|
||||
process.env,
|
||||
'NPMCI_LOGIN_DOCKER*',
|
||||
async (envString: string) => {
|
||||
this.npmciRegistryStorage.addRegistry(DockerRegistry.fromEnvString(envString));
|
||||
}
|
||||
);
|
||||
return;
|
||||
};
|
||||
|
||||
/**
|
||||
* pushes an image towards a registry
|
||||
* @param argvArg
|
||||
*/
|
||||
public push = async (argvArg: any) => {
|
||||
await this.prepare();
|
||||
let dockerRegistryUrls: string[] = [];
|
||||
|
||||
// lets parse the input of cli and npmextra
|
||||
if (argvArg._.length >= 3 && argvArg._[2] !== 'npmextra') {
|
||||
dockerRegistryUrls.push(argvArg._[2]);
|
||||
} else {
|
||||
if (this.npmciRef.npmciConfig.getConfig().dockerRegistries.length === 0) {
|
||||
logger.log(
|
||||
'warn',
|
||||
`There are no docker registries listed in npmextra.json! This is strange!`
|
||||
);
|
||||
}
|
||||
dockerRegistryUrls = dockerRegistryUrls.concat(
|
||||
this.npmciRef.npmciConfig.getConfig().dockerRegistries
|
||||
);
|
||||
}
|
||||
|
||||
// lets determine the suffix
|
||||
let suffix = null;
|
||||
if (argvArg._.length >= 4) {
|
||||
suffix = argvArg._[3];
|
||||
}
|
||||
|
||||
// lets push to the registries
|
||||
for (const dockerRegistryUrl of dockerRegistryUrls) {
|
||||
const dockerfileArray = await Dockerfile.readDockerfiles(this)
|
||||
.then(Dockerfile.sortDockerfiles)
|
||||
.then(Dockerfile.mapDockerfiles);
|
||||
const dockerRegistryToPushTo = await this.npmciRegistryStorage.getRegistryByUrl(
|
||||
dockerRegistryUrl
|
||||
);
|
||||
if (!dockerRegistryToPushTo) {
|
||||
logger.log(
|
||||
'error',
|
||||
`Cannot push to registry ${dockerRegistryUrl}, because it was not found in the authenticated registry list.`
|
||||
);
|
||||
process.exit(1);
|
||||
}
|
||||
for (const dockerfile of dockerfileArray) {
|
||||
await dockerfile.push(dockerRegistryToPushTo, suffix);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* pulls an image
|
||||
*/
|
||||
public pull = async (argvArg: any) => {
|
||||
await this.prepare();
|
||||
const registryUrlArg = argvArg._[2];
|
||||
let suffix = null;
|
||||
if (argvArg._.length >= 4) {
|
||||
suffix = argvArg._[3];
|
||||
}
|
||||
const localDockerRegistry = await this.npmciRegistryStorage.getRegistryByUrl(registryUrlArg);
|
||||
const dockerfileArray = await Dockerfile.readDockerfiles(this)
|
||||
.then(Dockerfile.sortDockerfiles)
|
||||
.then(Dockerfile.mapDockerfiles);
|
||||
for (const dockerfile of dockerfileArray) {
|
||||
await dockerfile.pull(localDockerRegistry, suffix);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* tests docker files
|
||||
*/
|
||||
public test = async () => {
|
||||
await this.prepare();
|
||||
return await Dockerfile.readDockerfiles(this).then(Dockerfile.testDockerfiles);
|
||||
};
|
||||
|
||||
/**
|
||||
* can be used to get the Dockerfiles in the directory
|
||||
*/
|
||||
getDockerfiles = async () => {
|
||||
const dockerfiles = await Dockerfile.readDockerfiles(this);
|
||||
return dockerfiles;
|
||||
}
|
||||
}
|
||||
336
ts/manager.docker/mod.classes.dockerfile.ts
Normal file
336
ts/manager.docker/mod.classes.dockerfile.ts
Normal file
@@ -0,0 +1,336 @@
|
||||
import * as plugins from './mod.plugins.js';
|
||||
import * as paths from '../npmci.paths.js';
|
||||
|
||||
import { logger } from '../npmci.logging.js';
|
||||
import { bash } from '../npmci.bash.js';
|
||||
|
||||
import { DockerRegistry } from './mod.classes.dockerregistry.js';
|
||||
import * as helpers from './mod.helpers.js';
|
||||
import { NpmciDockerManager } from './index.js';
|
||||
import { Npmci } from '../npmci.classes.npmci.js';
|
||||
|
||||
/**
|
||||
* class Dockerfile represents a Dockerfile on disk in npmci
|
||||
*/
|
||||
export class Dockerfile {
|
||||
// STATIC
|
||||
|
||||
/**
|
||||
* creates instance of class Dockerfile for all Dockerfiles in cwd
|
||||
* @returns Promise<Dockerfile[]>
|
||||
*/
|
||||
public static async readDockerfiles(
|
||||
npmciDockerManagerRefArg: NpmciDockerManager
|
||||
): Promise<Dockerfile[]> {
|
||||
const fileTree = await plugins.smartfile.fs.listFileTree(paths.cwd, 'Dockerfile*');
|
||||
|
||||
// create the Dockerfile array
|
||||
const readDockerfilesArray: Dockerfile[] = [];
|
||||
logger.log('info', `found ${fileTree.length} Dockerfiles:`);
|
||||
console.log(fileTree);
|
||||
for (const dockerfilePath of fileTree) {
|
||||
const myDockerfile = new Dockerfile(npmciDockerManagerRefArg, {
|
||||
filePath: dockerfilePath,
|
||||
read: true,
|
||||
});
|
||||
readDockerfilesArray.push(myDockerfile);
|
||||
}
|
||||
|
||||
return readDockerfilesArray;
|
||||
}
|
||||
|
||||
/**
|
||||
* sorts Dockerfiles into a dependency chain
|
||||
* @param sortableArrayArg an array of instances of class Dockerfile
|
||||
* @returns Promise<Dockerfile[]>
|
||||
*/
|
||||
public static async sortDockerfiles(sortableArrayArg: Dockerfile[]): Promise<Dockerfile[]> {
|
||||
const done = plugins.smartpromise.defer<Dockerfile[]>();
|
||||
logger.log('info', 'sorting Dockerfiles:');
|
||||
const sortedArray: Dockerfile[] = [];
|
||||
const cleanTagsOriginal = Dockerfile.cleanTagsArrayFunction(sortableArrayArg, sortedArray);
|
||||
let sorterFunctionCounter: number = 0;
|
||||
const sorterFunction = () => {
|
||||
sortableArrayArg.forEach((dockerfileArg) => {
|
||||
const cleanTags = Dockerfile.cleanTagsArrayFunction(sortableArrayArg, sortedArray);
|
||||
if (
|
||||
cleanTags.indexOf(dockerfileArg.baseImage) === -1 &&
|
||||
sortedArray.indexOf(dockerfileArg) === -1
|
||||
) {
|
||||
sortedArray.push(dockerfileArg);
|
||||
}
|
||||
if (cleanTagsOriginal.indexOf(dockerfileArg.baseImage) !== -1) {
|
||||
dockerfileArg.localBaseImageDependent = true;
|
||||
}
|
||||
});
|
||||
if (sortableArrayArg.length === sortedArray.length) {
|
||||
let counter = 1;
|
||||
for (const dockerfile of sortedArray) {
|
||||
logger.log('info', `tag ${counter}: -> ${dockerfile.cleanTag}`);
|
||||
counter++;
|
||||
}
|
||||
done.resolve(sortedArray);
|
||||
} else if (sorterFunctionCounter < 10) {
|
||||
sorterFunctionCounter++;
|
||||
sorterFunction();
|
||||
}
|
||||
};
|
||||
sorterFunction();
|
||||
return done.promise;
|
||||
}
|
||||
|
||||
/**
|
||||
* maps local Dockerfiles dependencies to the correspoding Dockerfile class instances
|
||||
*/
|
||||
public static async mapDockerfiles(sortedDockerfileArray: Dockerfile[]): Promise<Dockerfile[]> {
|
||||
sortedDockerfileArray.forEach((dockerfileArg) => {
|
||||
if (dockerfileArg.localBaseImageDependent) {
|
||||
sortedDockerfileArray.forEach((dockfile2: Dockerfile) => {
|
||||
if (dockfile2.cleanTag === dockerfileArg.baseImage) {
|
||||
dockerfileArg.localBaseDockerfile = dockfile2;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
return sortedDockerfileArray;
|
||||
}
|
||||
|
||||
/**
|
||||
* builds the correspoding real docker image for each Dockerfile class instance
|
||||
*/
|
||||
public static async buildDockerfiles(sortedArrayArg: Dockerfile[]) {
|
||||
for (const dockerfileArg of sortedArrayArg) {
|
||||
await dockerfileArg.build();
|
||||
}
|
||||
return sortedArrayArg;
|
||||
}
|
||||
|
||||
/**
|
||||
* tests all Dockerfiles in by calling class Dockerfile.test();
|
||||
* @param sortedArrayArg Dockerfile[] that contains all Dockerfiles in cwd
|
||||
*/
|
||||
public static async testDockerfiles(sortedArrayArg: Dockerfile[]) {
|
||||
for (const dockerfileArg of sortedArrayArg) {
|
||||
await dockerfileArg.test();
|
||||
}
|
||||
return sortedArrayArg;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns a version for a docker file
|
||||
* @execution SYNC
|
||||
*/
|
||||
public static dockerFileVersion(dockerfileInstanceArg: Dockerfile, dockerfileNameArg: string): string {
|
||||
let versionString: string;
|
||||
const versionRegex = /Dockerfile_([^:_]*)$/;
|
||||
const regexResultArray = versionRegex.exec(dockerfileNameArg);
|
||||
if (regexResultArray && regexResultArray.length === 2) {
|
||||
versionString = regexResultArray[1];
|
||||
} else {
|
||||
versionString = 'latest';
|
||||
}
|
||||
versionString = versionString.replace(
|
||||
'##version##',
|
||||
dockerfileInstanceArg.npmciDockerManagerRef.npmciRef.npmciConfig.getConfig().projectInfo.npm.version
|
||||
);
|
||||
return versionString;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns the docker base image for a Dockerfile
|
||||
*/
|
||||
public static dockerBaseImage(dockerfileContentArg: string): string {
|
||||
const baseImageRegex = /FROM\s([a-zA-z0-9\/\-\:]*)\n?/;
|
||||
const regexResultArray = baseImageRegex.exec(dockerfileContentArg);
|
||||
return regexResultArray[1];
|
||||
}
|
||||
|
||||
/**
|
||||
* returns the docker tag
|
||||
*/
|
||||
public static getDockerTagString(
|
||||
npmciDockerManagerRef: NpmciDockerManager,
|
||||
registryArg: string,
|
||||
repoArg: string,
|
||||
versionArg: string,
|
||||
suffixArg?: string
|
||||
): string {
|
||||
// determine wether the repo should be mapped accordingly to the registry
|
||||
const mappedRepo =
|
||||
npmciDockerManagerRef.npmciRef.npmciConfig.getConfig().dockerRegistryRepoMap[registryArg];
|
||||
const repo = (() => {
|
||||
if (mappedRepo) {
|
||||
return mappedRepo;
|
||||
} else {
|
||||
return repoArg;
|
||||
}
|
||||
})();
|
||||
|
||||
// determine wether the version contais a suffix
|
||||
let version = versionArg;
|
||||
if (suffixArg) {
|
||||
version = versionArg + '_' + suffixArg;
|
||||
}
|
||||
|
||||
const tagString = `${registryArg}/${repo}:${version}`;
|
||||
return tagString;
|
||||
}
|
||||
|
||||
public static async getDockerBuildArgs(
|
||||
npmciDockerManagerRef: NpmciDockerManager
|
||||
): Promise<string> {
|
||||
logger.log('info', 'checking for env vars to be supplied to the docker build');
|
||||
let buildArgsString: string = '';
|
||||
for (const dockerArgKey of Object.keys(
|
||||
npmciDockerManagerRef.npmciRef.npmciConfig.getConfig().dockerBuildargEnvMap
|
||||
)) {
|
||||
const dockerArgOuterEnvVar =
|
||||
npmciDockerManagerRef.npmciRef.npmciConfig.getConfig().dockerBuildargEnvMap[dockerArgKey];
|
||||
logger.log(
|
||||
'note',
|
||||
`docker ARG "${dockerArgKey}" maps to outer env var "${dockerArgOuterEnvVar}"`
|
||||
);
|
||||
const targetValue = process.env[dockerArgOuterEnvVar];
|
||||
buildArgsString = `${buildArgsString} --build-arg ${dockerArgKey}="${targetValue}"`;
|
||||
}
|
||||
return buildArgsString;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static cleanTagsArrayFunction(
|
||||
dockerfileArrayArg: Dockerfile[],
|
||||
trackingArrayArg: Dockerfile[]
|
||||
): string[] {
|
||||
const cleanTagsArray: string[] = [];
|
||||
dockerfileArrayArg.forEach((dockerfileArg) => {
|
||||
if (trackingArrayArg.indexOf(dockerfileArg) === -1) {
|
||||
cleanTagsArray.push(dockerfileArg.cleanTag);
|
||||
}
|
||||
});
|
||||
return cleanTagsArray;
|
||||
}
|
||||
|
||||
// INSTANCE
|
||||
public npmciDockerManagerRef: NpmciDockerManager;
|
||||
|
||||
public filePath: string;
|
||||
public repo: string;
|
||||
public version: string;
|
||||
public cleanTag: string;
|
||||
public buildTag: string;
|
||||
public pushTag: string;
|
||||
public containerName: string;
|
||||
public content: string;
|
||||
public baseImage: string;
|
||||
public localBaseImageDependent: boolean;
|
||||
public localBaseDockerfile: Dockerfile;
|
||||
|
||||
constructor(
|
||||
dockerManagerRefArg: NpmciDockerManager,
|
||||
options: { filePath?: string; fileContents?: string | Buffer; read?: boolean }
|
||||
) {
|
||||
this.npmciDockerManagerRef = dockerManagerRefArg;
|
||||
this.filePath = options.filePath;
|
||||
this.repo =
|
||||
this.npmciDockerManagerRef.npmciRef.npmciEnv.repo.user +
|
||||
'/' +
|
||||
this.npmciDockerManagerRef.npmciRef.npmciEnv.repo.repo;
|
||||
this.version = Dockerfile.dockerFileVersion(this, plugins.path.parse(options.filePath).base);
|
||||
this.cleanTag = this.repo + ':' + this.version;
|
||||
this.buildTag = this.cleanTag;
|
||||
|
||||
this.containerName = 'dockerfile-' + this.version;
|
||||
if (options.filePath && options.read) {
|
||||
this.content = plugins.smartfile.fs.toStringSync(plugins.path.resolve(options.filePath));
|
||||
}
|
||||
this.baseImage = Dockerfile.dockerBaseImage(this.content);
|
||||
this.localBaseImageDependent = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* builds the Dockerfile
|
||||
*/
|
||||
public async build() {
|
||||
logger.log('info', 'now building Dockerfile for ' + this.cleanTag);
|
||||
const buildArgsString = await Dockerfile.getDockerBuildArgs(this.npmciDockerManagerRef);
|
||||
const buildCommand = `docker build --label="version=${
|
||||
this.npmciDockerManagerRef.npmciRef.npmciConfig.getConfig().projectInfo.npm.version
|
||||
}" -t ${this.buildTag} -f ${this.filePath} ${buildArgsString} .`;
|
||||
await bash(buildCommand);
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* pushes the Dockerfile to a registry
|
||||
*/
|
||||
public async push(dockerRegistryArg: DockerRegistry, versionSuffix: string = null) {
|
||||
this.pushTag = Dockerfile.getDockerTagString(
|
||||
this.npmciDockerManagerRef,
|
||||
dockerRegistryArg.registryUrl,
|
||||
this.repo,
|
||||
this.version,
|
||||
versionSuffix
|
||||
);
|
||||
await bash(`docker tag ${this.buildTag} ${this.pushTag}`);
|
||||
await bash(`docker push ${this.pushTag}`);
|
||||
const imageDigest = (
|
||||
await bash(`docker inspect --format="{{index .RepoDigests 0}}" ${this.pushTag}`)
|
||||
).split('@')[1];
|
||||
console.log(`The image ${this.pushTag} has digest ${imageDigest}`);
|
||||
await this.npmciDockerManagerRef.npmciRef.cloudlyConnector.announceDockerContainer({
|
||||
registryUrl: this.pushTag,
|
||||
tag: this.buildTag,
|
||||
labels: [],
|
||||
version: this.npmciDockerManagerRef.npmciRef.npmciConfig.getConfig().projectInfo.npm.version,
|
||||
});
|
||||
await this.npmciDockerManagerRef.npmciRef.npmciConfig.kvStorage.writeKey('latestPushedDockerTag', this.pushTag)
|
||||
}
|
||||
|
||||
/**
|
||||
* pulls the Dockerfile from a registry
|
||||
*/
|
||||
public async pull(registryArg: DockerRegistry, versionSuffixArg: string = null) {
|
||||
const pullTag = Dockerfile.getDockerTagString(
|
||||
this.npmciDockerManagerRef,
|
||||
registryArg.registryUrl,
|
||||
this.repo,
|
||||
this.version,
|
||||
versionSuffixArg
|
||||
);
|
||||
await bash(`docker pull ${pullTag}`);
|
||||
await bash(`docker tag ${pullTag} ${this.buildTag}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* tests the Dockerfile;
|
||||
*/
|
||||
public async test() {
|
||||
const testFile: string = plugins.path.join(paths.NpmciTestDir, 'test_' + this.version + '.sh');
|
||||
const testFileExists: boolean = plugins.smartfile.fs.fileExistsSync(testFile);
|
||||
if (testFileExists) {
|
||||
// run tests
|
||||
await bash(
|
||||
`docker run --name npmci_test_container --entrypoint="bash" ${this.buildTag} -c "mkdir /npmci_test"`
|
||||
);
|
||||
await bash(`docker cp ${testFile} npmci_test_container:/npmci_test/test.sh`);
|
||||
await bash(`docker commit npmci_test_container npmci_test_image`);
|
||||
await bash(`docker run --entrypoint="bash" npmci_test_image -x /npmci_test/test.sh`);
|
||||
await bash(`docker rm npmci_test_container`);
|
||||
await bash(`docker rmi --force npmci_test_image`);
|
||||
} else {
|
||||
logger.log('warn', 'skipping tests for ' + this.cleanTag + ' because no testfile was found!');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* gets the id of a Dockerfile
|
||||
*/
|
||||
public async getId() {
|
||||
const containerId = await bash(
|
||||
'docker inspect --type=image --format="{{.Id}}" ' + this.buildTag
|
||||
);
|
||||
return containerId;
|
||||
}
|
||||
}
|
||||
48
ts/manager.docker/mod.classes.dockerregistry.ts
Normal file
48
ts/manager.docker/mod.classes.dockerregistry.ts
Normal file
@@ -0,0 +1,48 @@
|
||||
import { logger } from '../npmci.logging.js';
|
||||
import * as plugins from './mod.plugins.js';
|
||||
import { bash } from '../npmci.bash.js';
|
||||
|
||||
export interface IDockerRegistryConstructorOptions {
|
||||
registryUrl: string;
|
||||
username: string;
|
||||
password: string;
|
||||
}
|
||||
|
||||
export class DockerRegistry {
|
||||
public registryUrl: string;
|
||||
public username: string;
|
||||
public password: string;
|
||||
constructor(optionsArg: IDockerRegistryConstructorOptions) {
|
||||
this.registryUrl = optionsArg.registryUrl;
|
||||
this.username = optionsArg.username;
|
||||
this.password = optionsArg.password;
|
||||
logger.log('info', `created DockerRegistry for ${this.registryUrl}`);
|
||||
}
|
||||
|
||||
public static fromEnvString(envString: string): DockerRegistry {
|
||||
const dockerRegexResultArray = envString.split('|');
|
||||
if (dockerRegexResultArray.length !== 3) {
|
||||
logger.log('error', 'malformed docker env var...');
|
||||
process.exit(1);
|
||||
return;
|
||||
}
|
||||
const registryUrl = dockerRegexResultArray[0].replace('https://', '').replace('http://', '');
|
||||
const username = dockerRegexResultArray[1];
|
||||
const password = dockerRegexResultArray[2];
|
||||
return new DockerRegistry({
|
||||
registryUrl: registryUrl,
|
||||
username: username,
|
||||
password: password,
|
||||
});
|
||||
}
|
||||
|
||||
public async login() {
|
||||
if (this.registryUrl === 'docker.io') {
|
||||
await bash(`docker login -u ${this.username} -p ${this.password}`);
|
||||
logger.log('info', 'Logged in to standard docker hub');
|
||||
} else {
|
||||
await bash(`docker login -u ${this.username} -p ${this.password} ${this.registryUrl}`);
|
||||
}
|
||||
logger.log('ok', `docker authenticated for ${this.registryUrl}!`);
|
||||
}
|
||||
}
|
||||
28
ts/manager.docker/mod.classes.registrystorage.ts
Normal file
28
ts/manager.docker/mod.classes.registrystorage.ts
Normal file
@@ -0,0 +1,28 @@
|
||||
import { logger } from '../npmci.logging.js';
|
||||
import * as plugins from './mod.plugins.js';
|
||||
|
||||
import { DockerRegistry } from './mod.classes.dockerregistry.js';
|
||||
|
||||
export class RegistryStorage {
|
||||
objectMap = new plugins.lik.ObjectMap<DockerRegistry>();
|
||||
constructor() {
|
||||
// Nothing here
|
||||
}
|
||||
|
||||
addRegistry(registryArg: DockerRegistry) {
|
||||
this.objectMap.add(registryArg);
|
||||
}
|
||||
|
||||
getRegistryByUrl(registryUrlArg: string) {
|
||||
return this.objectMap.findSync((registryArg) => {
|
||||
return registryArg.registryUrl === registryUrlArg;
|
||||
});
|
||||
}
|
||||
|
||||
async loginAll() {
|
||||
await this.objectMap.forEach(async (registryArg) => {
|
||||
await registryArg.login();
|
||||
});
|
||||
logger.log('success', 'logged in successfully into all available DockerRegistries!');
|
||||
}
|
||||
}
|
||||
5
ts/manager.docker/mod.helpers.ts
Normal file
5
ts/manager.docker/mod.helpers.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
import { logger } from '../npmci.logging.js';
|
||||
import * as plugins from './mod.plugins.js';
|
||||
import * as paths from '../npmci.paths.js';
|
||||
|
||||
import { Dockerfile } from './mod.classes.dockerfile.js';
|
||||
1
ts/manager.docker/mod.plugins.ts
Normal file
1
ts/manager.docker/mod.plugins.ts
Normal file
@@ -0,0 +1 @@
|
||||
export * from '../npmci.plugins.js';
|
||||
71
ts/manager.git/index.ts
Normal file
71
ts/manager.git/index.ts
Normal file
@@ -0,0 +1,71 @@
|
||||
import { logger } from '../npmci.logging.js';
|
||||
import * as plugins from './mod.plugins.js';
|
||||
import { bash, bashNoError } from '../npmci.bash.js';
|
||||
import { Npmci } from '../npmci.classes.npmci.js';
|
||||
|
||||
export class NpmciGitManager {
|
||||
public npmciRef: Npmci;
|
||||
|
||||
constructor(npmciRefArg: Npmci) {
|
||||
this.npmciRef = npmciRefArg;
|
||||
}
|
||||
|
||||
/**
|
||||
* handle cli input
|
||||
* @param argvArg
|
||||
*/
|
||||
public handleCli = async (argvArg: any) => {
|
||||
if (argvArg._.length >= 2) {
|
||||
const action: string = argvArg._[1];
|
||||
switch (action) {
|
||||
case 'mirror':
|
||||
await this.mirror();
|
||||
break;
|
||||
default:
|
||||
logger.log('error', `npmci git -> action >>${action}<< not supported!`);
|
||||
}
|
||||
} else {
|
||||
logger.log('info', `npmci git -> cli arguments invalid! Please read the documentation.`);
|
||||
}
|
||||
};
|
||||
|
||||
public mirror = async () => {
|
||||
const githubToken = process.env.NPMCI_GIT_GITHUBTOKEN;
|
||||
const githubUser = process.env.NPMCI_GIT_GITHUBGROUP || this.npmciRef.npmciEnv.repo.user;
|
||||
const githubRepo = process.env.NPMCI_GIT_GITHUB || this.npmciRef.npmciEnv.repo.repo;
|
||||
if (
|
||||
this.npmciRef.npmciConfig.getConfig().projectInfo.npm.packageJson.private === true ||
|
||||
this.npmciRef.npmciConfig.getConfig().npmAccessLevel === 'private'
|
||||
) {
|
||||
logger.log(
|
||||
'warn',
|
||||
`refusing to mirror due to private property use a private mirror location instead`
|
||||
);
|
||||
return;
|
||||
}
|
||||
if (githubToken) {
|
||||
logger.log('info', 'found github token.');
|
||||
logger.log('info', 'attempting the mirror the repository to GitHub');
|
||||
|
||||
// remove old mirrors
|
||||
await bashNoError('git remote rm mirror');
|
||||
|
||||
await bash(`git fetch`);
|
||||
// add the mirror
|
||||
await bashNoError(
|
||||
`git remote add mirror https://${githubToken}@github.com/${githubUser}/${githubRepo}.git`
|
||||
);
|
||||
await bashNoError(`git push mirror --all`);
|
||||
await bashNoError(`git checkout origin/master`);
|
||||
await bashNoError(`git push mirror master`);
|
||||
logger.log('ok', 'pushed all branches to mirror!');
|
||||
await bashNoError(`git push mirror --tags`);
|
||||
logger.log('ok', 'pushed all tags to mirror!');
|
||||
// remove old mirrors
|
||||
await bashNoError('git remote rm mirror');
|
||||
} else {
|
||||
logger.log('error', `cannot find NPMCI_GIT_GITHUBTOKEN env var!`);
|
||||
process.exit(1);
|
||||
}
|
||||
};
|
||||
}
|
||||
1
ts/manager.git/mod.plugins.ts
Normal file
1
ts/manager.git/mod.plugins.ts
Normal file
@@ -0,0 +1 @@
|
||||
export * from '../npmci.plugins.js';
|
||||
82
ts/manager.nodejs/index.ts
Normal file
82
ts/manager.nodejs/index.ts
Normal file
@@ -0,0 +1,82 @@
|
||||
import * as plugins from '../npmci.plugins.js';
|
||||
import * as paths from '../npmci.paths.js';
|
||||
|
||||
import { logger } from '../npmci.logging.js';
|
||||
import { bash, bashNoError, nvmAvailable } from '../npmci.bash.js';
|
||||
import { Npmci } from '../npmci.classes.npmci.js';
|
||||
|
||||
export class NpmciNodeJsManager {
|
||||
public npmciRef: Npmci;
|
||||
|
||||
constructor(npmciRefArg: Npmci) {
|
||||
this.npmciRef = npmciRefArg;
|
||||
}
|
||||
|
||||
/**
|
||||
* handle cli input
|
||||
* @param argvArg
|
||||
*/
|
||||
public async handleCli(argvArg: any) {
|
||||
if (argvArg._.length >= 3) {
|
||||
const action: string = argvArg._[1];
|
||||
switch (action) {
|
||||
case 'install':
|
||||
await this.install(argvArg._[2]);
|
||||
break;
|
||||
default:
|
||||
logger.log('error', `>>npmci node ...<< action >>${action}<< not supported`);
|
||||
process.exit(1);
|
||||
}
|
||||
} else {
|
||||
logger.log(
|
||||
'error',
|
||||
`>>npmci node ...<< cli arguments invalid... Please read the documentation.`
|
||||
);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Install a specific version of node
|
||||
* @param versionArg
|
||||
*/
|
||||
public async install(versionArg: any) {
|
||||
logger.log('info', `now installing node version ${versionArg}`);
|
||||
let version: string;
|
||||
if (versionArg === 'stable') {
|
||||
version = '18';
|
||||
} else if (versionArg === 'lts') {
|
||||
version = '16';
|
||||
} else if (versionArg === 'legacy') {
|
||||
version = '14';
|
||||
} else {
|
||||
version = versionArg;
|
||||
}
|
||||
if (await nvmAvailable.promise) {
|
||||
await bash(`nvm install ${version} && nvm alias default ${version}`);
|
||||
logger.log('success', `Node version ${version} successfully installed!`);
|
||||
} else {
|
||||
logger.log('warn', 'Nvm not in path so staying at installed node version!');
|
||||
}
|
||||
logger.log('info', 'now installing latest npm version');
|
||||
await bash('npm install -g npm');
|
||||
await bash('node -v');
|
||||
await bash('npm -v');
|
||||
|
||||
// lets look for further config
|
||||
const config = await this.npmciRef.npmciConfig.getConfig();
|
||||
logger.log('info', 'Now checking for needed global npm tools...');
|
||||
for (const npmTool of config.npmGlobalTools) {
|
||||
logger.log('info', `Checking for global "${npmTool}"`);
|
||||
const whichOutput: string = await bashNoError(`which ${npmTool}`);
|
||||
const toolAvailable: boolean = !(/not\sfound/.test(whichOutput) || whichOutput === '');
|
||||
if (toolAvailable) {
|
||||
logger.log('info', `Tool ${npmTool} is available`);
|
||||
} else {
|
||||
logger.log('info', `globally installing ${npmTool} from npm`);
|
||||
await bash(`npm install ${npmTool} -q -g`);
|
||||
}
|
||||
}
|
||||
logger.log('success', 'all global npm tools specified in npmextra.json are now available!');
|
||||
}
|
||||
}
|
||||
189
ts/manager.npm/index.ts
Normal file
189
ts/manager.npm/index.ts
Normal file
@@ -0,0 +1,189 @@
|
||||
import * as plugins from './mod.plugins.js';
|
||||
import * as paths from '../npmci.paths.js';
|
||||
|
||||
import { logger } from '../npmci.logging.js';
|
||||
import { bash, bashNoError, nvmAvailable } from '../npmci.bash.js';
|
||||
import { Npmci } from '../npmci.classes.npmci.js';
|
||||
|
||||
export class NpmciNpmManager {
|
||||
public npmciRef: Npmci;
|
||||
|
||||
constructor(npmciRefArg: Npmci) {
|
||||
this.npmciRef = npmciRefArg;
|
||||
}
|
||||
|
||||
/**
|
||||
* handle cli input
|
||||
* @param argvArg
|
||||
*/
|
||||
public async handleCli(argvArg: any) {
|
||||
if (argvArg._.length >= 2) {
|
||||
const action: string = argvArg._[1];
|
||||
switch (action) {
|
||||
case 'install':
|
||||
await this.install();
|
||||
break;
|
||||
case 'build':
|
||||
await this.build();
|
||||
break;
|
||||
case 'prepare':
|
||||
await this.prepare();
|
||||
break;
|
||||
case 'test':
|
||||
await this.test();
|
||||
break;
|
||||
case 'publish':
|
||||
await this.publish();
|
||||
break;
|
||||
default:
|
||||
logger.log('error', `>>npmci npm ...<< action >>${action}<< not supported`);
|
||||
process.exit(1);
|
||||
}
|
||||
} else {
|
||||
logger.log(
|
||||
'info',
|
||||
`>>npmci npm ...<< cli arguments invalid... Please read the documentation.`
|
||||
);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* authenticates npm with token from env var
|
||||
*/
|
||||
public async prepare() {
|
||||
const config = this.npmciRef.npmciConfig.getConfig();
|
||||
let npmrcFileString: string = '';
|
||||
await plugins.smartobject.forEachMinimatch(
|
||||
process.env,
|
||||
'NPMCI_TOKEN_NPM*',
|
||||
(npmEnvArg: string) => {
|
||||
const npmRegistryUrl = npmEnvArg.split('|')[0];
|
||||
logger.log('ok', `found token for ${npmRegistryUrl}`);
|
||||
let npmToken = npmEnvArg.split('|')[1];
|
||||
if (npmEnvArg.split('|')[2] && npmEnvArg.split('|')[2] === 'plain') {
|
||||
logger.log('ok', 'npm token not base64 encoded.');
|
||||
} else {
|
||||
logger.log('ok', 'npm token base64 encoded.');
|
||||
npmToken = plugins.smartstring.base64.decode(npmToken);
|
||||
}
|
||||
npmrcFileString += `//${npmRegistryUrl}/:_authToken="${npmToken}"\n`;
|
||||
}
|
||||
);
|
||||
logger.log('info', `setting default npm registry to ${config.npmRegistryUrl}`);
|
||||
npmrcFileString += `registry=https://${config.npmRegistryUrl}\n`;
|
||||
|
||||
// final check
|
||||
if (npmrcFileString.length > 0) {
|
||||
logger.log('info', 'found one or more access tokens');
|
||||
} else {
|
||||
logger.log('error', 'no access token found! Exiting!');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// lets save it to disk
|
||||
plugins.smartfile.memory.toFsSync(npmrcFileString, '/root/.npmrc');
|
||||
|
||||
// lets set the cache directory
|
||||
await bash(`npm config set cache ${paths.NpmciCacheDir} --global `);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* publish a package to npm
|
||||
*/
|
||||
public async publish() {
|
||||
const buildPublishCommand = async () => {
|
||||
let npmAccessCliString = ``;
|
||||
let npmRegistryCliString = ``;
|
||||
let publishVerdaccioAsWell = false;
|
||||
const config = this.npmciRef.npmciConfig.getConfig();
|
||||
const availableRegistries: string[] = [];
|
||||
await plugins.smartobject.forEachMinimatch(
|
||||
process.env,
|
||||
'NPMCI_TOKEN_NPM*',
|
||||
(npmEnvArg: string) => {
|
||||
availableRegistries.push(npmEnvArg.split('|')[0]);
|
||||
}
|
||||
);
|
||||
|
||||
// -> configure package access level
|
||||
if (config.npmAccessLevel) {
|
||||
npmAccessCliString = `--access=${config.npmAccessLevel}`;
|
||||
if (config.npmAccessLevel === 'public') {
|
||||
publishVerdaccioAsWell = true;
|
||||
}
|
||||
} else {
|
||||
throw new Error('You need to set a npmAccessLevel!!!');
|
||||
}
|
||||
// -> configure registry url
|
||||
if (config.npmRegistryUrl) {
|
||||
npmRegistryCliString = `--registry=https://${config.npmRegistryUrl}`;
|
||||
} else {
|
||||
logger.log('error', `no registry url specified. Can't publish!`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
let publishCommand = `npm publish ${npmAccessCliString} ${npmRegistryCliString} `;
|
||||
|
||||
// publishEverywhere
|
||||
if (publishVerdaccioAsWell) {
|
||||
const verdaccioRegistry = availableRegistries.find((registryString) =>
|
||||
registryString.startsWith('verdaccio')
|
||||
);
|
||||
if (verdaccioRegistry) {
|
||||
logger.log(
|
||||
'info',
|
||||
`package is public and verdaccio registry is specified. Also publishing to Verdaccio!`
|
||||
);
|
||||
publishCommand = `${publishCommand} && npm publish ${npmAccessCliString} --registry=https://${verdaccioRegistry}`;
|
||||
} else {
|
||||
logger.log(
|
||||
'error',
|
||||
`This package should also be published to Verdaccio, however there is no Verdaccio registry data available!`
|
||||
);
|
||||
}
|
||||
}
|
||||
return publishCommand;
|
||||
};
|
||||
|
||||
// -> preparing
|
||||
logger.log('info', `now preparing environment:`);
|
||||
this.prepare();
|
||||
await bash(`npm -v`);
|
||||
await bash(`pnpm -v`);
|
||||
|
||||
// -> build it
|
||||
await this.install();
|
||||
await this.build();
|
||||
|
||||
logger.log('success', `Nice!!! The build for the publication was successfull!`);
|
||||
logger.log('info', `Lets clean up so we don't publish any packages that don't belong to us:`);
|
||||
// -> clean up before we publish stuff
|
||||
await bashNoError(`rm -r ./.npmci_cache`);
|
||||
await bash(`rm -r ./node_modules`);
|
||||
|
||||
logger.log('success', `Cleaned up!:`);
|
||||
|
||||
// -> publish it
|
||||
logger.log('info', `now invoking npm to publish the package!`);
|
||||
await bash(await buildPublishCommand());
|
||||
logger.log('success', `Package was successfully published!`);
|
||||
}
|
||||
|
||||
public async install(): Promise<void> {
|
||||
logger.log('info', 'now installing dependencies:');
|
||||
await bash('pnpm install');
|
||||
}
|
||||
|
||||
public async build(): Promise<void> {
|
||||
logger.log('info', 'now building the project:');
|
||||
await bash('pnpm run build');
|
||||
}
|
||||
|
||||
public async test(): Promise<void> {
|
||||
logger.log('info', 'now starting tests:');
|
||||
await bash('pnpm test');
|
||||
}
|
||||
}
|
||||
1
ts/manager.npm/mod.plugins.ts
Normal file
1
ts/manager.npm/mod.plugins.ts
Normal file
@@ -0,0 +1 @@
|
||||
export * from '../npmci.plugins.js';
|
||||
@@ -1,10 +1,10 @@
|
||||
import * as plugins from './mod.plugins'
|
||||
import * as paths from '../npmci.paths'
|
||||
import * as plugins from './mod.plugins.js';
|
||||
import * as paths from '../npmci.paths.js';
|
||||
|
||||
/**
|
||||
* cleans npmci config files
|
||||
*/
|
||||
export let clean = async (): Promise<void> => {
|
||||
plugins.smartfile.fs.removeSync(paths.NpmciPackageConfig)
|
||||
return
|
||||
}
|
||||
plugins.smartfile.fs.removeSync(paths.NpmciPackageConfig);
|
||||
return;
|
||||
};
|
||||
|
||||
@@ -1 +1 @@
|
||||
export * from '../npmci.plugins'
|
||||
export * from '../npmci.plugins.js';
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
import * as plugins from './mod.plugins'
|
||||
|
||||
let npmciCflare = new plugins.cflare.CflareAccount()
|
||||
|
||||
/**
|
||||
* handle cli input
|
||||
* @param argvArg
|
||||
*/
|
||||
export let handleCli = async (argvArg) => {
|
||||
if (argvArg._.length >= 2) {
|
||||
let action: string = argvArg._[1]
|
||||
switch (action) {
|
||||
default:
|
||||
plugins.beautylog.error(`>>npmci node ...<< action >>${action}<< not supported`)
|
||||
}
|
||||
} else {
|
||||
plugins.beautylog.log(`>>npmci node ...<< cli arguments invalid... Please read the documentation.`)
|
||||
}
|
||||
}
|
||||
|
||||
export let purge = async (argvArg) => {
|
||||
npmciCflare.auth({
|
||||
email: '',
|
||||
key: ''
|
||||
})
|
||||
npmciCflare.purgeZone(argvArg._[1])
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
export * from '../npmci.plugins'
|
||||
|
||||
import * as cflare from 'cflare'
|
||||
|
||||
export {
|
||||
cflare
|
||||
}
|
||||
@@ -1,13 +1,15 @@
|
||||
import * as plugins from './mod.plugins'
|
||||
import { bash } from '../npmci.bash'
|
||||
import * as plugins from './mod.plugins.js';
|
||||
import { bash } from '../npmci.bash.js';
|
||||
|
||||
export let command = async () => {
|
||||
let wrappedCommand: string = ''
|
||||
let argvArray = process.argv
|
||||
let wrappedCommand: string = '';
|
||||
let argvArray = process.argv;
|
||||
for (let i = 3; i < argvArray.length; i++) {
|
||||
wrappedCommand = wrappedCommand + argvArray[i]
|
||||
if (i + 1 !== argvArray.length) { wrappedCommand = wrappedCommand + ' ' }
|
||||
wrappedCommand = wrappedCommand + argvArray[i];
|
||||
if (i + 1 !== argvArray.length) {
|
||||
wrappedCommand = wrappedCommand + ' ';
|
||||
}
|
||||
await bash(wrappedCommand)
|
||||
return
|
||||
}
|
||||
}
|
||||
await bash(wrappedCommand);
|
||||
return;
|
||||
};
|
||||
|
||||
@@ -1 +1 @@
|
||||
export * from '../npmci.plugins'
|
||||
export * from '../npmci.plugins.js';
|
||||
|
||||
@@ -1,376 +0,0 @@
|
||||
import * as plugins from './mod.plugins'
|
||||
import * as paths from '../npmci.paths'
|
||||
import * as NpmciEnv from '../npmci.env'
|
||||
import { bash } from '../npmci.bash'
|
||||
|
||||
export let modArgvArg // will be set through the build command
|
||||
|
||||
/**
|
||||
* handle cli input
|
||||
* @param argvArg
|
||||
*/
|
||||
export let handleCli = async (argvArg) => {
|
||||
modArgvArg = argvArg
|
||||
if (argvArg._.length >= 2) {
|
||||
let action: string = argvArg._[1]
|
||||
switch (action) {
|
||||
case 'build':
|
||||
await build()
|
||||
break
|
||||
case 'prepare':
|
||||
await prepare()
|
||||
break
|
||||
case 'test':
|
||||
await test()
|
||||
break
|
||||
default:
|
||||
plugins.beautylog.error(`>>npmci node ...<< action >>${action}<< not supported`)
|
||||
}
|
||||
} else {
|
||||
plugins.beautylog.log(`>>npmci node ...<< cli arguments invalid... Please read the documentation.`)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* logs in docker
|
||||
*/
|
||||
export let prepare = async () => {
|
||||
NpmciEnv.setDockerRegistry('docker.io') // TODO: checkup why we set this here
|
||||
|
||||
// handle registries
|
||||
plugins.smartparam.forEachMinimatch(process.env, 'NPMCI_LOGIN_DOCKER*', async (envString) => {
|
||||
let dockerRegexResultArray = envString.split('|')
|
||||
if (dockerRegexResultArray.length !== 3) {
|
||||
plugins.beautylog.error('malformed docker env var...')
|
||||
process.exit(1)
|
||||
return
|
||||
}
|
||||
let registry = dockerRegexResultArray[0]
|
||||
let username = dockerRegexResultArray[1]
|
||||
let password = dockerRegexResultArray[2]
|
||||
if (registry === 'docker.io') {
|
||||
await bash(`docker login -u ${username} -p ${password}`)
|
||||
plugins.beautylog.info('Logged in to standard docker hub')
|
||||
} else {
|
||||
await bash(`docker login -u ${username} -p ${password} ${registry}`)
|
||||
}
|
||||
plugins.beautylog.success(`docker authenticated for ${registry}!`)
|
||||
})
|
||||
|
||||
// Always login to GitLab Registry
|
||||
if (!process.env.CI_BUILD_TOKEN || process.env.CI_BUILD_TOKEN === '') {
|
||||
plugins.beautylog.error('No registry token specified by gitlab!')
|
||||
return
|
||||
}
|
||||
await bash(`docker login -u gitlab-ci-token -p ${process.env.CI_BUILD_TOKEN} registry.gitlab.com`)
|
||||
plugins.beautylog.success(`docker authenticated for registry.gitlab.com!`)
|
||||
return
|
||||
}
|
||||
|
||||
/**
|
||||
* builds a cwd of Dockerfiles by triggering a promisechain
|
||||
*/
|
||||
export let build = async () => {
|
||||
plugins.beautylog.log('now building Dockerfiles...')
|
||||
await readDockerfiles()
|
||||
.then(sortDockerfiles)
|
||||
.then(mapDockerfiles)
|
||||
.then(buildDockerfiles)
|
||||
}
|
||||
|
||||
export let push = async () => {
|
||||
await readDockerfiles()
|
||||
.then(sortDockerfiles)
|
||||
.then(mapDockerfiles)
|
||||
.then(pushDockerfiles)
|
||||
}
|
||||
|
||||
export let pull = async () => {
|
||||
return await readDockerfiles()
|
||||
.then(pullDockerfileImages)
|
||||
}
|
||||
|
||||
export let test = async () => {
|
||||
return await readDockerfiles()
|
||||
.then(testDockerfiles)
|
||||
}
|
||||
|
||||
/**
|
||||
* creates instance of class Dockerfile for all Dockerfiles in cwd
|
||||
* @returns Promise<Dockerfile[]>
|
||||
*/
|
||||
export let readDockerfiles = async (): Promise<Dockerfile[]> => {
|
||||
let fileTree = await plugins.smartfile.fs.listFileTree(paths.cwd, 'Dockerfile*')
|
||||
|
||||
// create the Dockerfile array
|
||||
let readDockerfilesArray: Dockerfile[] = []
|
||||
plugins.beautylog.info(`found ${fileTree.length} Dockerfiles:`)
|
||||
console.log(fileTree)
|
||||
for (let dockerfilePath of fileTree) {
|
||||
let myDockerfile = new Dockerfile({
|
||||
filePath: dockerfilePath,
|
||||
read: true
|
||||
})
|
||||
readDockerfilesArray.push(myDockerfile)
|
||||
}
|
||||
|
||||
return readDockerfilesArray
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* sorts Dockerfiles into a dependency chain
|
||||
* @param sortableArrayArg an array of instances of class Dockerfile
|
||||
* @returns Promise<Dockerfile[]>
|
||||
*/
|
||||
export let sortDockerfiles = (sortableArrayArg: Dockerfile[]): Promise<Dockerfile[]> => {
|
||||
let done = plugins.q.defer<Dockerfile[]>()
|
||||
plugins.beautylog.info('sorting Dockerfiles:')
|
||||
let sortedArray: Dockerfile[] = []
|
||||
let cleanTagsOriginal = cleanTagsArrayFunction(sortableArrayArg, sortedArray)
|
||||
let sorterFunctionCounter: number = 0
|
||||
let sorterFunction = function () {
|
||||
sortableArrayArg.forEach((dockerfileArg) => {
|
||||
let cleanTags = cleanTagsArrayFunction(sortableArrayArg, sortedArray)
|
||||
if (cleanTags.indexOf(dockerfileArg.baseImage) === -1 && sortedArray.indexOf(dockerfileArg) === -1) {
|
||||
sortedArray.push(dockerfileArg)
|
||||
}
|
||||
if (cleanTagsOriginal.indexOf(dockerfileArg.baseImage) !== -1) {
|
||||
dockerfileArg.localBaseImageDependent = true
|
||||
}
|
||||
})
|
||||
if (sortableArrayArg.length === sortedArray.length) {
|
||||
let counter = 1
|
||||
for (let dockerfile of sortedArray) {
|
||||
plugins.beautylog.log(`tag ${counter}: -> ${dockerfile.cleanTag}`)
|
||||
counter++
|
||||
}
|
||||
done.resolve(sortedArray)
|
||||
} else if (sorterFunctionCounter < 10) {
|
||||
sorterFunctionCounter++
|
||||
sorterFunction()
|
||||
}
|
||||
}
|
||||
sorterFunction()
|
||||
return done.promise
|
||||
}
|
||||
|
||||
/**
|
||||
* maps local Dockerfiles dependencies to the correspoding Dockerfile class instances
|
||||
*/
|
||||
export let mapDockerfiles = async (sortedArray: Dockerfile[]): Promise<Dockerfile[]> => {
|
||||
sortedArray.forEach((dockerfileArg) => {
|
||||
if (dockerfileArg.localBaseImageDependent) {
|
||||
sortedArray.forEach((dockfile2: Dockerfile) => {
|
||||
if (dockfile2.cleanTag === dockerfileArg.baseImage) {
|
||||
dockerfileArg.localBaseDockerfile = dockfile2
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
return sortedArray
|
||||
}
|
||||
|
||||
/**
|
||||
* builds the correspoding real docker image for each Dockerfile class instance
|
||||
*/
|
||||
export let buildDockerfiles = async (sortedArrayArg: Dockerfile[]) => {
|
||||
for (let dockerfileArg of sortedArrayArg) {
|
||||
await dockerfileArg.build()
|
||||
}
|
||||
return sortedArrayArg
|
||||
}
|
||||
|
||||
/**
|
||||
* pushes the real Dockerfile images to a Docker registry
|
||||
*/
|
||||
export let pushDockerfiles = async (sortedArrayArg: Dockerfile[]) => {
|
||||
let stageArg = (function () {
|
||||
if (modArgvArg._ && modArgvArg._.length >= 3) {
|
||||
return modArgvArg._[ 2 ]
|
||||
} else {
|
||||
return NpmciEnv.buildStage
|
||||
}
|
||||
})()
|
||||
for (let dockerfileArg of sortedArrayArg) {
|
||||
await dockerfileArg.push(stageArg)
|
||||
}
|
||||
return sortedArrayArg
|
||||
}
|
||||
|
||||
/**
|
||||
* pulls corresponding real Docker images for instances of Dockerfile from a registry.
|
||||
* This is needed if building, testing, and publishing of Docker images is carried out in seperate CI stages.
|
||||
*/
|
||||
export let pullDockerfileImages = async (sortableArrayArg: Dockerfile[], registryArg = 'registry.gitlab.com') => {
|
||||
for (let dockerfileArg of sortableArrayArg) {
|
||||
await dockerfileArg.pull(registryArg)
|
||||
}
|
||||
return sortableArrayArg
|
||||
}
|
||||
|
||||
/**
|
||||
* tests all Dockerfiles in by calling class Dockerfile.test();
|
||||
* @param sortedArrayArg Dockerfile[] that contains all Dockerfiles in cwd
|
||||
*/
|
||||
export let testDockerfiles = async (sortedArrayArg: Dockerfile[]) => {
|
||||
for (let dockerfileArg of sortedArrayArg) {
|
||||
await dockerfileArg.test()
|
||||
}
|
||||
return sortedArrayArg
|
||||
}
|
||||
|
||||
/**
|
||||
* class Dockerfile represents a Dockerfile on disk in npmci
|
||||
*/
|
||||
export class Dockerfile {
|
||||
filePath: string
|
||||
repo: string
|
||||
version: string
|
||||
cleanTag: string
|
||||
buildTag: string
|
||||
gitlabTestTag: string
|
||||
gitlabReleaseTag: string
|
||||
releaseTag: string
|
||||
containerName: string
|
||||
content: string
|
||||
baseImage: string
|
||||
localBaseImageDependent: boolean
|
||||
localBaseDockerfile: Dockerfile
|
||||
constructor(options: { filePath?: string, fileContents?: string | Buffer, read?: boolean }) {
|
||||
this.filePath = options.filePath
|
||||
this.repo = NpmciEnv.repo.user + '/' + NpmciEnv.repo.repo
|
||||
this.version = dockerFileVersion(plugins.path.parse(options.filePath).base)
|
||||
this.cleanTag = this.repo + ':' + this.version
|
||||
this.buildTag = this.cleanTag
|
||||
this.gitlabTestTag = getDockerTagString('docker.io', this.repo, this.version, 'test') // TODO: using docker.io until gitlab is fixed
|
||||
this.gitlabReleaseTag = getDockerTagString('docker.io', this.repo, this.version) // TODO: using docker.io until gitlab is fixed
|
||||
|
||||
// the releaseTag determines where the image gets released
|
||||
this.releaseTag = getDockerTagString('docker.io', this.repo, this.version)
|
||||
|
||||
this.containerName = 'dockerfile-' + this.version
|
||||
if (options.filePath && options.read) {
|
||||
this.content = plugins.smartfile.fs.toStringSync(plugins.path.resolve(options.filePath))
|
||||
}
|
||||
this.baseImage = dockerBaseImage(this.content)
|
||||
this.localBaseImageDependent = false
|
||||
}
|
||||
|
||||
/**
|
||||
* builds the Dockerfile
|
||||
*/
|
||||
async build () {
|
||||
plugins.beautylog.info('now building Dockerfile for ' + this.cleanTag)
|
||||
let buildCommand = `docker build -t ${this.buildTag} -f ${this.filePath} .`
|
||||
await bash(buildCommand)
|
||||
NpmciEnv.dockerFilesBuilt.push(this)
|
||||
return
|
||||
}
|
||||
|
||||
/**
|
||||
* pushes the Dockerfile to a registry
|
||||
*/
|
||||
async push (stageArg) {
|
||||
await bash(`docker tag ${this.buildTag} ${this.releaseTag}`)
|
||||
await bash(`docker tag ${this.buildTag} ${this.gitlabReleaseTag}`)
|
||||
await bash(`docker tag ${this.buildTag} ${this.gitlabTestTag}`)
|
||||
switch (stageArg) {
|
||||
case 'release':
|
||||
await bash(`docker push ${this.gitlabReleaseTag}`)
|
||||
await bash(`docker push ${this.releaseTag}`)
|
||||
break
|
||||
case 'test':
|
||||
default:
|
||||
await bash(`docker push ${this.gitlabTestTag}`)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* pulls the Dockerfile from a registry
|
||||
*/
|
||||
async pull (registryArg: string) {
|
||||
await bash(`docker pull ${this.gitlabTestTag}`)
|
||||
await bash(`docker tag ${this.gitlabTestTag} ${this.buildTag}`)
|
||||
}
|
||||
|
||||
/**
|
||||
* tests the Dockerfile;
|
||||
*/
|
||||
async test () {
|
||||
let testFile: string = plugins.path.join(paths.NpmciTestDir, 'test_' + this.version + '.sh')
|
||||
let testFileExists: boolean = plugins.smartfile.fs.fileExistsSync(testFile)
|
||||
if (testFileExists) {
|
||||
// run tests
|
||||
await bash('docker run --name npmci_test_container ' + this.buildTag + ' mkdir /npmci_test')
|
||||
await bash('docker cp ' + testFile + ' npmci_test_container:/npmci_test/test.sh')
|
||||
await bash('docker commit npmci_test_container npmci_test_image')
|
||||
await bash('docker run npmci_test_image sh /npmci_test/test.sh')
|
||||
await bash('docker rm npmci_test_container')
|
||||
await bash('docker rmi --force npmci_test_image')
|
||||
} else {
|
||||
plugins.beautylog.warn('skipping tests for ' + this.cleanTag + ' because no testfile was found!')
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* gets the id of a Dockerfile
|
||||
*/
|
||||
async getId () {
|
||||
let containerId = await bash('docker inspect --type=image --format=\"{{.Id}}\" ' + this.buildTag)
|
||||
return containerId
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* returns a version for a docker file
|
||||
* @execution SYNC
|
||||
*/
|
||||
export let dockerFileVersion = (dockerfileNameArg: string): string => {
|
||||
let versionString: string
|
||||
let versionRegex = /Dockerfile_([a-zA-Z0-9\.]*)$/
|
||||
let regexResultArray = versionRegex.exec(dockerfileNameArg)
|
||||
if (regexResultArray && regexResultArray.length === 2) {
|
||||
versionString = regexResultArray[ 1 ]
|
||||
} else {
|
||||
versionString = 'latest'
|
||||
}
|
||||
return versionString
|
||||
}
|
||||
|
||||
/**
|
||||
* returns the docker base image for a Dockerfile
|
||||
*/
|
||||
export let dockerBaseImage = function (dockerfileContentArg: string) {
|
||||
let baseImageRegex = /FROM\s([a-zA-z0-9\/\-\:]*)\n?/
|
||||
let regexResultArray = baseImageRegex.exec(dockerfileContentArg)
|
||||
return regexResultArray[ 1 ]
|
||||
}
|
||||
|
||||
/**
|
||||
* returns the docker tag
|
||||
*/
|
||||
export let getDockerTagString = function (registryArg: string, repoArg: string, versionArg: string, suffixArg?: string): string {
|
||||
// determine wether the suffix is needed
|
||||
let version = versionArg
|
||||
if (suffixArg) {
|
||||
version = versionArg + '_' + suffixArg
|
||||
}
|
||||
let tagString = `${registryArg}/${repoArg}:${version}`
|
||||
return tagString
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
export let cleanTagsArrayFunction = function (dockerfileArrayArg: Dockerfile[], trackingArrayArg: Dockerfile[]): string[] {
|
||||
let cleanTagsArray: string[] = []
|
||||
dockerfileArrayArg.forEach(function (dockerfileArg) {
|
||||
if (trackingArrayArg.indexOf(dockerfileArg) === -1) {
|
||||
cleanTagsArray.push(dockerfileArg.cleanTag)
|
||||
}
|
||||
})
|
||||
return cleanTagsArray
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
export * from '../npmci.plugins'
|
||||
|
||||
|
||||
@@ -1,75 +0,0 @@
|
||||
import * as plugins from '../npmci.plugins'
|
||||
import * as npmciConfig from '../npmci.config'
|
||||
import {
|
||||
bash,
|
||||
bashNoError,
|
||||
nvmAvailable,
|
||||
yarnAvailable
|
||||
} from '../npmci.bash'
|
||||
|
||||
/**
|
||||
* handle cli input
|
||||
* @param argvArg
|
||||
*/
|
||||
export let handleCli = async (argvArg) => {
|
||||
if (argvArg._.length >= 3) {
|
||||
let action: string = argvArg._[1]
|
||||
switch (action) {
|
||||
case 'install':
|
||||
await install(argvArg._[2])
|
||||
break
|
||||
default:
|
||||
plugins.beautylog.error(`>>npmci node ...<< action >>${action}<< not supported`)
|
||||
}
|
||||
} else {
|
||||
plugins.beautylog.error(`>>npmci node ...<< cli arguments invalid... Please read the documentation.`)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Install a specific version of node
|
||||
* @param versionArg
|
||||
*/
|
||||
export let install = async (versionArg) => {
|
||||
plugins.beautylog.log(`now installing node version ${versionArg}`)
|
||||
let version: string
|
||||
if (versionArg === 'stable') {
|
||||
version = 'stable'
|
||||
} else if (versionArg === 'lts') {
|
||||
version = '6'
|
||||
} else if (versionArg === 'legacy') {
|
||||
version = '6'
|
||||
} else {
|
||||
version = versionArg
|
||||
}
|
||||
if (await nvmAvailable.promise) {
|
||||
await bash(`nvm install ${version} && nvm alias default ${version}`)
|
||||
plugins.beautylog.success(`Node version ${version} successfully installed!`)
|
||||
} else {
|
||||
plugins.beautylog.warn('Nvm not in path so staying at installed node version!')
|
||||
}
|
||||
await bash('node -v')
|
||||
await bash('npm -v')
|
||||
// lets look for further config
|
||||
await npmciConfig.getConfig()
|
||||
.then(async configArg => {
|
||||
plugins.beautylog.log('Now checking for needed global npm tools...')
|
||||
for (let npmTool of configArg.globalNpmTools) {
|
||||
plugins.beautylog.info(`Checking for global "${npmTool}"`)
|
||||
let whichOutput: string = await bashNoError(`which ${npmTool}`)
|
||||
let toolAvailable: boolean = !((/not\sfound/.test(whichOutput)) || whichOutput === '')
|
||||
if (toolAvailable) {
|
||||
plugins.beautylog.log(`Tool ${npmTool} is available`)
|
||||
} else {
|
||||
plugins.beautylog.info(`globally installing ${npmTool} from npm`)
|
||||
if (await yarnAvailable.promise) {
|
||||
await bash(`yarn global add ${npmTool}`)
|
||||
} else {
|
||||
await bash(`npm install ${npmTool} -q -g`)
|
||||
}
|
||||
}
|
||||
}
|
||||
plugins.beautylog.success('all global npm tools specified in npmextra.json are now available!')
|
||||
})
|
||||
}
|
||||
@@ -1,64 +0,0 @@
|
||||
import * as plugins from './mod.plugins'
|
||||
import * as configModule from '../npmci.config'
|
||||
import {
|
||||
bash,
|
||||
bashNoError,
|
||||
nvmAvailable,
|
||||
yarnAvailable
|
||||
} from '../npmci.bash'
|
||||
|
||||
/**
|
||||
* handle cli input
|
||||
* @param argvArg
|
||||
*/
|
||||
export let handleCli = async (argvArg) => {
|
||||
if (argvArg._.length >= 2) {
|
||||
let action: string = argvArg._[1]
|
||||
switch (action) {
|
||||
case 'install':
|
||||
await install()
|
||||
break
|
||||
case 'prepare':
|
||||
await prepare()
|
||||
break
|
||||
case 'test':
|
||||
await test()
|
||||
break
|
||||
default:
|
||||
plugins.beautylog.error(`>>npmci node ...<< action >>${action}<< not supported`)
|
||||
}
|
||||
} else {
|
||||
plugins.beautylog.log(`>>npmci node ...<< cli arguments invalid... Please read the documentation.`)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* authenticates npm with token from env var
|
||||
*/
|
||||
let prepare = async () => {
|
||||
let npmrcPrefix: string = '//registry.npmjs.org/:_authToken='
|
||||
let npmToken: string = process.env.NPMCI_TOKEN_NPM
|
||||
let npmrcFileString: string = npmrcPrefix + npmToken
|
||||
if (npmToken) {
|
||||
plugins.beautylog.info('found access token')
|
||||
} else {
|
||||
plugins.beautylog.error('no access token found! Exiting!')
|
||||
process.exit(1)
|
||||
}
|
||||
plugins.smartfile.memory.toFsSync(npmrcFileString, '/root/.npmrc')
|
||||
return
|
||||
}
|
||||
|
||||
let install = async (): Promise<void> => {
|
||||
plugins.beautylog.info('now installing dependencies:')
|
||||
if (await yarnAvailable.promise) {
|
||||
await bash('yarn install')
|
||||
} else {
|
||||
await bash('npm install')
|
||||
}
|
||||
}
|
||||
|
||||
export let test = async (): Promise<void> => {
|
||||
plugins.beautylog.info('now starting tests:')
|
||||
await bash('yarn test')
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
export * from '../npmci.plugins'
|
||||
24
ts/mod_precheck/index.ts
Normal file
24
ts/mod_precheck/index.ts
Normal file
@@ -0,0 +1,24 @@
|
||||
import * as plugins from './plugins.js';
|
||||
import * as paths from '../npmci.paths.js';
|
||||
import { logger } from '../npmci.logging.js';
|
||||
import { Npmci } from '../npmci.classes.npmci.js';
|
||||
|
||||
export const handleCli = async (npmciRefArg: Npmci, argvArg: any) => {
|
||||
logger.log('info', 'checking execution context');
|
||||
const presentRunnerTags = process.env.CI_RUNNER_TAGS.split(',').map((stringArg) =>
|
||||
stringArg.trim()
|
||||
);
|
||||
let allDesiredGitlabRunnerTagsPresent = true;
|
||||
for (const desiredRunnerTag of npmciRefArg.npmciConfig.getConfig().gitlabRunnerTags) {
|
||||
if (!presentRunnerTags.includes(desiredRunnerTag)) {
|
||||
allDesiredGitlabRunnerTagsPresent = false;
|
||||
logger.log(
|
||||
'error',
|
||||
`Desired runnerRag ${desiredRunnerTag} is missing in current execution context.`
|
||||
);
|
||||
}
|
||||
}
|
||||
if (!allDesiredGitlabRunnerTagsPresent) {
|
||||
process.exit(1);
|
||||
}
|
||||
};
|
||||
1
ts/mod_precheck/plugins.ts
Normal file
1
ts/mod_precheck/plugins.ts
Normal file
@@ -0,0 +1 @@
|
||||
export * from '../npmci.plugins.js';
|
||||
@@ -1,59 +1,64 @@
|
||||
import * as plugins from './mod.plugins'
|
||||
let sshInstance: plugins.smartssh.SshInstance
|
||||
import { logger } from '../npmci.logging.js';
|
||||
import * as plugins from './mod.plugins.js';
|
||||
let sshInstance: plugins.smartssh.SshInstance;
|
||||
|
||||
export let handleCli = async (argvArg) => {
|
||||
export let handleCli = async (argvArg: any) => {
|
||||
if (argvArg._.length >= 2) {
|
||||
let action: string = argvArg._[1]
|
||||
const action: string = argvArg._[1];
|
||||
switch (action) {
|
||||
case 'prepare':
|
||||
await prepare()
|
||||
break
|
||||
await prepare();
|
||||
break;
|
||||
default:
|
||||
plugins.beautylog.error(`action >>${action}<< not supported`)
|
||||
logger.log('error', `action >>${action}<< not supported`);
|
||||
process.exit(1);
|
||||
}
|
||||
} else {
|
||||
logger.log('error', `>>npmci ssh ...<< please specify an action!`);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* checks if not undefined
|
||||
*/
|
||||
let notUndefined = (stringArg: string) => {
|
||||
return (stringArg && stringArg !== 'undefined' && stringArg !== '##')
|
||||
}
|
||||
const notUndefined = (stringArg: string) => {
|
||||
return stringArg && stringArg !== 'undefined' && stringArg !== '##';
|
||||
};
|
||||
|
||||
/**
|
||||
* checks for ENV vars in form of NPMCI_SSHKEY_* and deploys any found ones
|
||||
*/
|
||||
export let prepare = async () => {
|
||||
sshInstance = new plugins.smartssh.SshInstance() // init ssh instance
|
||||
plugins.smartparam.forEachMinimatch(process.env, 'NPMCI_SSHKEY_*', evaluateSshEnv)
|
||||
sshInstance = new plugins.smartssh.SshInstance(); // init ssh instance
|
||||
plugins.smartobject.forEachMinimatch(process.env, 'NPMCI_SSHKEY_*', evaluateSshEnv);
|
||||
if (!process.env.NPMTS_TEST) {
|
||||
sshInstance.writeToDisk()
|
||||
sshInstance.writeToDisk();
|
||||
} else {
|
||||
plugins.beautylog.log('In test mode, so not storing SSH keys to disk!')
|
||||
logger.log('info', 'In test mode, so not storing SSH keys to disk!');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* gets called for each found SSH ENV Var and deploys it
|
||||
*/
|
||||
let evaluateSshEnv = async (sshkeyEnvVarArg: string) => {
|
||||
let sshEnvArray = sshkeyEnvVarArg.split('|')
|
||||
let sshKey = new plugins.smartssh.SshKey()
|
||||
plugins.beautylog.info('Found SSH identity for ' + sshEnvArray[1])
|
||||
const evaluateSshEnv = async (sshkeyEnvVarArg: string) => {
|
||||
const sshEnvArray = sshkeyEnvVarArg.split('|');
|
||||
const sshKey = new plugins.smartssh.SshKey();
|
||||
logger.log('info', 'Found SSH identity for ' + sshEnvArray[1]);
|
||||
if (notUndefined(sshEnvArray[0])) {
|
||||
plugins.beautylog.log('---> host defined!')
|
||||
sshKey.host = sshEnvArray[0]
|
||||
logger.log('info', '---> host defined!');
|
||||
sshKey.host = sshEnvArray[0];
|
||||
}
|
||||
if (notUndefined(sshEnvArray[1])) {
|
||||
plugins.beautylog.log('---> privKey defined!')
|
||||
sshKey.privKeyBase64 = sshEnvArray[1]
|
||||
logger.log('info', '---> privKey defined!');
|
||||
sshKey.privKeyBase64 = sshEnvArray[1];
|
||||
}
|
||||
if (notUndefined(sshEnvArray[2])) {
|
||||
plugins.beautylog.log('---> pubKey defined!')
|
||||
sshKey.pubKeyBase64 = sshEnvArray[2]
|
||||
logger.log('info', '---> pubKey defined!');
|
||||
sshKey.pubKeyBase64 = sshEnvArray[2];
|
||||
}
|
||||
|
||||
sshInstance.addKey(sshKey)
|
||||
return
|
||||
}
|
||||
sshInstance.addKey(sshKey);
|
||||
return;
|
||||
};
|
||||
|
||||
@@ -1 +1 @@
|
||||
export * from '../npmci.plugins'
|
||||
export * from '../npmci.plugins.js';
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user