Compare commits
560 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2c89cc6a0a | |||
| bad663d5e4 | |||
| 4e1d211a14 | |||
| bd3b1ba9dd | |||
| 5d419e40c1 | |||
| 9d295f2633 | |||
| 5d18e53e30 | |||
| 9ad5222b95 | |||
| dba2e2ae68 | |||
| 6c8095260d | |||
| 95c4ae3b16 | |||
| 536ebca6ab | |||
| 88f64536c2 | |||
| 4854d27a19 | |||
| 75a0e8a7d8 | |||
| 43eb19f772 | |||
| dc2665d250 | |||
| 00f324e151 | |||
| e38cc40f11 | |||
| e9e8acafe4 | |||
| c763db40bb | |||
| 01256480c4 | |||
| c6918399bf | |||
| 66d28e5081 | |||
| 9de77139ea | |||
| 7b4bf10cc0 | |||
| 9eaa6347c1 | |||
| 6e4c967917 | |||
| 52a8f42fc9 | |||
| 8e9a61bbb2 | |||
| dc809a6023 | |||
| 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 | |||
| 108758ad19 | |||
| 6e816f35f6 | |||
| e6bc38c7e5 | |||
| da3ee27d05 | |||
| 40a6bba338 | |||
| f98f490956 | |||
| 15714204a6 | |||
| 35c4963192 | |||
| b3c5db3ed9 | |||
| 0701429782 | |||
| 24dd9edcae | |||
| 3e1397e13f | |||
| ecb21a787f | |||
| 10233ffae0 | |||
| 4cea1d29d2 | |||
| 3bf2502f87 | |||
| c012810a8c | |||
| ae5b1b1fa7 | |||
| f1bf000744 | |||
| 30e16cb33d | |||
| 16984d811f | |||
| 12e2509f0c | |||
| e0b8c4f263 | |||
| 16925a3f3f | |||
| 1ff0337112 | |||
| 6b15728fbf | |||
| 44c20deec7 | |||
| 6d328e263d | |||
| 52f09583f5 | |||
| 782738aae9 | |||
| b62104c2a5 | |||
| 3506d8dd21 | |||
| 4328672958 | |||
| 1ca90eb64d | |||
| e68ee9e593 | |||
| a597c1268b | |||
| 0e7c942a97 | |||
| c9b08b9f9d | |||
| c059dff5e0 | |||
| c0643edc82 | |||
| a8571827b9 | |||
| 1c0331524d | |||
| 66bb3a10b7 | |||
| fdfb600bea | |||
| 8847d9031b | |||
| 90295a79d9 | |||
| 270ff4bb40 | |||
| 2d34e3e9eb | |||
| c899bfa23a | |||
| 6b23e32b13 | |||
| 91fe60c8c1 | |||
| 2fd6765385 | |||
| 53748a21b4 | |||
| a6a3906bd5 | |||
| 6bfc8ac47c | |||
| 988bc3cc5e | |||
| 78eb3702b7 | |||
| 9f2e629e8f | |||
|
|
419db8b197 | ||
| ddf7ca0466 | |||
| bdce1dbded | |||
| 8f81c71de7 | |||
| 2e12fd7548 | |||
| 08152f9b51 | |||
| b6f54bc967 | |||
| faf538aa4d | |||
| 8c28fcc906 | |||
| 7c5cafeb1b | |||
|
|
cf41e81153 | ||
|
|
b6a85319b0 | ||
| 6edd51c6e6 | |||
| eb57697f96 | |||
| 800e4d8956 | |||
| a5633a01c5 | |||
| 0694d3a393 | |||
| b31cc4cbbf | |||
| d1e7448b40 | |||
| e541159019 | |||
| b6c06e2b17 | |||
| 3505b2effc | |||
| 29df49addb | |||
| 3484575108 | |||
| 7c4890f57a | |||
| 308d969540 | |||
| 5065587275 | |||
| 8f0092b2ef | |||
| e81d001aeb | |||
| 993f6f691e | |||
| 64053de75a | |||
| 1edea1046b | |||
| 0f8a76ca02 | |||
| 7dc76be1bb | |||
| 8920110783 | |||
| 7419ee28e4 | |||
| 1f4ecb6ff6 | |||
| a042674a81 | |||
|
|
764cd8f7ee | ||
| 657c6870ec | |||
| 566e074cf4 | |||
| 90b9b61a37 | |||
| 88bc772ea7 | |||
| 76530985e7 | |||
| 2525bc1ad4 | |||
| 20bca85a12 | |||
| dd260538a7 | |||
| d511e8c2f7 | |||
| c44d6c036c | |||
| 9cec914c94 | |||
| 52a09bb8dd | |||
| 1224fce295 | |||
| 6343731772 | |||
| 129d22b537 | |||
| 8075281499 | |||
| fe5f602aca | |||
| 577a9b3e49 | |||
| e6ad22547c | |||
| 8adeb5bb5c | |||
| db0d55636e | |||
| 0a73134e1c | |||
| 2994a9ef5b | |||
| af74e730cc | |||
| 798c909f1e | |||
| ba41776c0e | |||
| 254f7dcfa6 | |||
| d1e060e1dc | |||
|
|
bbc2e9002a | ||
| 1db5d6e669 | |||
| a54015da16 | |||
| d9b8eb3bf0 | |||
| 5ede124f56 | |||
| e835a17fe4 | |||
| b86b090c07 | |||
| 97d2a8d1b7 | |||
| 38e54f13ff | |||
| a11233ddb6 | |||
| 7cfd5e4358 | |||
| 431371db5a | |||
| e784c02a40 | |||
| f156b58b95 | |||
| 40a00cb1b0 | |||
| 0f384a799a | |||
| d2f4512ca4 | |||
|
|
ee7e7e2551 | ||
|
|
4c3d284186 | ||
|
|
5a472326ad | ||
| 5021ee099d | |||
| cd7363625d | |||
| 399168f5d0 | |||
| a272556ccd | |||
| 172b9f9b3f | |||
| 9eb3d1d06a | |||
| 4093675a9d | |||
| 53a2fb4c78 | |||
| 59ed6829e4 | |||
| 4e01b0c9b6 | |||
| 85a6099d56 | |||
| 787145816a | |||
| b194bf2a0e | |||
| 407d9f8237 | |||
| ec196e1d53 | |||
| 305fc6e68e | |||
| 35a7a83ee6 |
31
.gitea/release-template.md
Normal file
31
.gitea/release-template.md
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
## SZCI {{VERSION}}
|
||||||
|
|
||||||
|
Pre-compiled binaries for multiple platforms.
|
||||||
|
|
||||||
|
### Installation
|
||||||
|
|
||||||
|
#### Option 1: Via npm (recommended)
|
||||||
|
```bash
|
||||||
|
npm install -g @ship.zone/szci
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Option 2: Via installer script
|
||||||
|
```bash
|
||||||
|
curl -sSL https://code.foss.global/ship.zone/szci/raw/branch/master/install.sh | sudo bash
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Option 3: Direct binary download
|
||||||
|
Download the appropriate binary for your platform from the assets below and make it executable.
|
||||||
|
|
||||||
|
### Supported Platforms
|
||||||
|
- Linux x86_64 (x64)
|
||||||
|
- Linux ARM64 (aarch64)
|
||||||
|
- macOS x86_64 (Intel)
|
||||||
|
- macOS ARM64 (Apple Silicon)
|
||||||
|
- Windows x86_64
|
||||||
|
|
||||||
|
### Checksums
|
||||||
|
SHA256 checksums are provided in `SHA256SUMS.txt` for binary verification.
|
||||||
|
|
||||||
|
### npm Package
|
||||||
|
The npm package includes automatic binary detection and installation for your platform.
|
||||||
122
.gitea/workflows/README.md
Normal file
122
.gitea/workflows/README.md
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
# SZCI Gitea CI/CD Workflows
|
||||||
|
|
||||||
|
This directory contains Gitea Actions workflows for automated CI/CD of the SZCI project.
|
||||||
|
|
||||||
|
## Workflows
|
||||||
|
|
||||||
|
### 1. CI (`ci.yml`)
|
||||||
|
|
||||||
|
**Trigger:** Push to `main` branch or pull requests
|
||||||
|
|
||||||
|
**Purpose:** Continuous integration checks on every push
|
||||||
|
|
||||||
|
**Jobs:**
|
||||||
|
- **Type Check & Lint** - Validates TypeScript types and code style
|
||||||
|
- **Build Test** - Compiles binary for Linux x64 and tests execution
|
||||||
|
- **Build All Platforms** - Compiles all 5 platform binaries and uploads as artifacts
|
||||||
|
|
||||||
|
**Usage:** Automatically runs on every commit to ensure code quality
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. Release (`release.yml`)
|
||||||
|
|
||||||
|
**Trigger:** Push of version tags (e.g., `v5.0.0`)
|
||||||
|
|
||||||
|
**Purpose:** Creates GitHub releases with pre-compiled binaries
|
||||||
|
|
||||||
|
**Jobs:**
|
||||||
|
1. Validates deno.json version matches git tag
|
||||||
|
2. Compiles binaries for all 5 platforms
|
||||||
|
3. Generates SHA256 checksums
|
||||||
|
4. Creates Gitea release with binaries as assets
|
||||||
|
5. Cleans up old releases (keeps last 3)
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```bash
|
||||||
|
# Update version in deno.json to 6.0.1
|
||||||
|
# Then create and push tag:
|
||||||
|
git tag v6.0.1
|
||||||
|
git push origin v6.0.1
|
||||||
|
```
|
||||||
|
|
||||||
|
**Output:** Release at `https://code.foss.global/ship.zone/szci/releases/tag/v6.0.1`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. NPM Publish (`npm-publish.yml`)
|
||||||
|
|
||||||
|
**Trigger:** Push of version tags (e.g., `v5.0.0`)
|
||||||
|
|
||||||
|
**Purpose:** Publishes package to npm registry
|
||||||
|
|
||||||
|
**Jobs:**
|
||||||
|
1. Validates deno.json version matches git tag
|
||||||
|
2. Compiles all binaries
|
||||||
|
3. Syncs package.json version
|
||||||
|
4. Creates npm package
|
||||||
|
5. Publishes to npm with access token
|
||||||
|
6. Verifies publication
|
||||||
|
|
||||||
|
**Prerequisites:**
|
||||||
|
- `NPM_TOKEN` must be set in Gitea secrets
|
||||||
|
|
||||||
|
**Usage:** Same as release workflow (automatically triggered by version tags)
|
||||||
|
|
||||||
|
**Output:** Package at `https://www.npmjs.com/package/@ship.zone/szci`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Release Process
|
||||||
|
|
||||||
|
To create a new release:
|
||||||
|
|
||||||
|
1. **Update version in deno.json:**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"version": "6.0.1"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Commit the version change:**
|
||||||
|
```bash
|
||||||
|
git add deno.json
|
||||||
|
git commit -m "6.0.1"
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Create and push tag:**
|
||||||
|
```bash
|
||||||
|
git tag v6.0.1
|
||||||
|
git push origin main
|
||||||
|
git push origin v6.0.1
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Workflows run automatically:**
|
||||||
|
- `release.yml` creates Gitea release with binaries
|
||||||
|
- `npm-publish.yml` publishes to npm
|
||||||
|
|
||||||
|
5. **Verify:**
|
||||||
|
- Check https://code.foss.global/ship.zone/szci/releases
|
||||||
|
- Check https://www.npmjs.com/package/@ship.zone/szci
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Secrets Required
|
||||||
|
|
||||||
|
Configure these in Gitea repository settings:
|
||||||
|
|
||||||
|
- `GITHUB_TOKEN` - Gitea access token (auto-provided)
|
||||||
|
- `NPM_TOKEN` - npm publish token (must be configured)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Binary Artifacts
|
||||||
|
|
||||||
|
Each workflow produces binaries for:
|
||||||
|
- Linux x86_64
|
||||||
|
- Linux ARM64
|
||||||
|
- macOS x86_64
|
||||||
|
- macOS ARM64
|
||||||
|
- Windows x86_64
|
||||||
|
|
||||||
|
Total size per release: ~4GB (5 binaries × ~800MB each)
|
||||||
82
.gitea/workflows/ci.yml
Normal file
82
.gitea/workflows/ci.yml
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
name: CI
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check:
|
||||||
|
name: Type Check & Lint
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Deno
|
||||||
|
uses: denoland/setup-deno@v1
|
||||||
|
with:
|
||||||
|
deno-version: v2.x
|
||||||
|
|
||||||
|
- name: Check TypeScript types
|
||||||
|
run: deno check mod.ts
|
||||||
|
|
||||||
|
- name: Lint code
|
||||||
|
run: deno lint
|
||||||
|
continue-on-error: true
|
||||||
|
|
||||||
|
- name: Format check
|
||||||
|
run: deno fmt --check
|
||||||
|
continue-on-error: true
|
||||||
|
|
||||||
|
build:
|
||||||
|
name: Build Test (Current Platform)
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Deno
|
||||||
|
uses: denoland/setup-deno@v1
|
||||||
|
with:
|
||||||
|
deno-version: v2.x
|
||||||
|
|
||||||
|
- name: Compile for current platform
|
||||||
|
run: |
|
||||||
|
echo "Testing compilation for Linux x86_64..."
|
||||||
|
deno compile --allow-all --no-check \
|
||||||
|
--output szci-test \
|
||||||
|
--target x86_64-unknown-linux-gnu mod.ts
|
||||||
|
|
||||||
|
- name: Test binary execution
|
||||||
|
run: |
|
||||||
|
chmod +x szci-test
|
||||||
|
./szci-test --version
|
||||||
|
|
||||||
|
build-all:
|
||||||
|
name: Build All Platforms
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Deno
|
||||||
|
uses: denoland/setup-deno@v1
|
||||||
|
with:
|
||||||
|
deno-version: v2.x
|
||||||
|
|
||||||
|
- name: Compile all platform binaries
|
||||||
|
run: bash scripts/compile-all.sh
|
||||||
|
|
||||||
|
- name: Upload all binaries as artifact
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: szci-binaries.zip
|
||||||
|
path: dist/binaries/*
|
||||||
|
retention-days: 30
|
||||||
129
.gitea/workflows/npm-publish.yml
Normal file
129
.gitea/workflows/npm-publish.yml
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
name: Publish to npm
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
npm-publish:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Deno
|
||||||
|
uses: denoland/setup-deno@v1
|
||||||
|
with:
|
||||||
|
deno-version: v2.x
|
||||||
|
|
||||||
|
- name: Setup Node.js for npm publishing
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '18.x'
|
||||||
|
registry-url: 'https://registry.npmjs.org/'
|
||||||
|
|
||||||
|
- name: Get version from tag
|
||||||
|
id: version
|
||||||
|
run: |
|
||||||
|
VERSION=${GITHUB_REF#refs/tags/}
|
||||||
|
echo "version=$VERSION" >> $GITHUB_OUTPUT
|
||||||
|
echo "version_number=${VERSION#v}" >> $GITHUB_OUTPUT
|
||||||
|
echo "Publishing version: $VERSION"
|
||||||
|
|
||||||
|
- name: Verify deno.json version matches tag
|
||||||
|
run: |
|
||||||
|
DENO_VERSION=$(grep -o '"version": "[^"]*"' deno.json | cut -d'"' -f4)
|
||||||
|
TAG_VERSION="${{ steps.version.outputs.version_number }}"
|
||||||
|
echo "deno.json version: $DENO_VERSION"
|
||||||
|
echo "Tag version: $TAG_VERSION"
|
||||||
|
if [ "$DENO_VERSION" != "$TAG_VERSION" ]; then
|
||||||
|
echo "ERROR: Version mismatch!"
|
||||||
|
echo "deno.json has version $DENO_VERSION but tag is $TAG_VERSION"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Compile binaries for npm package
|
||||||
|
run: |
|
||||||
|
echo "Compiling binaries for npm package..."
|
||||||
|
deno task compile
|
||||||
|
echo ""
|
||||||
|
echo "Binary sizes:"
|
||||||
|
ls -lh dist/binaries/
|
||||||
|
|
||||||
|
- name: Generate SHA256 checksums
|
||||||
|
run: |
|
||||||
|
cd dist/binaries
|
||||||
|
sha256sum * > SHA256SUMS
|
||||||
|
cat SHA256SUMS
|
||||||
|
cd ../..
|
||||||
|
|
||||||
|
- name: Sync package.json version
|
||||||
|
run: |
|
||||||
|
VERSION="${{ steps.version.outputs.version_number }}"
|
||||||
|
echo "Syncing package.json to version ${VERSION}..."
|
||||||
|
npm version ${VERSION} --no-git-tag-version --allow-same-version
|
||||||
|
echo "package.json version: $(grep '"version"' package.json | head -1)"
|
||||||
|
|
||||||
|
- name: Create npm package
|
||||||
|
run: |
|
||||||
|
echo "Creating npm package..."
|
||||||
|
npm pack
|
||||||
|
echo ""
|
||||||
|
echo "Package created:"
|
||||||
|
ls -lh *.tgz
|
||||||
|
|
||||||
|
- name: Test local installation
|
||||||
|
run: |
|
||||||
|
echo "Testing local package installation..."
|
||||||
|
PACKAGE_FILE=$(ls *.tgz)
|
||||||
|
npm install -g ${PACKAGE_FILE}
|
||||||
|
echo ""
|
||||||
|
echo "Testing szci command:"
|
||||||
|
szci --version || echo "Note: Binary execution may fail in CI environment"
|
||||||
|
echo ""
|
||||||
|
echo "Checking installed files:"
|
||||||
|
npm ls -g @ship.zone/szci || true
|
||||||
|
|
||||||
|
- name: Publish to npm
|
||||||
|
env:
|
||||||
|
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||||
|
run: |
|
||||||
|
echo "Publishing to npm registry..."
|
||||||
|
npm publish --access public
|
||||||
|
echo ""
|
||||||
|
echo "✅ Successfully published @ship.zone/szci to npm!"
|
||||||
|
echo ""
|
||||||
|
echo "Package info:"
|
||||||
|
npm view @ship.zone/szci
|
||||||
|
|
||||||
|
- name: Verify npm package
|
||||||
|
run: |
|
||||||
|
echo "Waiting for npm propagation..."
|
||||||
|
sleep 30
|
||||||
|
echo ""
|
||||||
|
echo "Verifying published package..."
|
||||||
|
npm view @ship.zone/szci
|
||||||
|
echo ""
|
||||||
|
echo "Testing installation from npm:"
|
||||||
|
npm install -g @ship.zone/szci
|
||||||
|
echo ""
|
||||||
|
echo "Package installed successfully!"
|
||||||
|
which szci || echo "Binary location check skipped"
|
||||||
|
|
||||||
|
- name: Publish Summary
|
||||||
|
run: |
|
||||||
|
echo "================================================"
|
||||||
|
echo " npm Publish Complete!"
|
||||||
|
echo "================================================"
|
||||||
|
echo ""
|
||||||
|
echo "✅ Package: @ship.zone/szci"
|
||||||
|
echo "✅ Version: ${{ steps.version.outputs.version }}"
|
||||||
|
echo ""
|
||||||
|
echo "Installation:"
|
||||||
|
echo " npm install -g @ship.zone/szci"
|
||||||
|
echo ""
|
||||||
|
echo "Registry:"
|
||||||
|
echo " https://www.npmjs.com/package/@ship.zone/szci"
|
||||||
|
echo ""
|
||||||
248
.gitea/workflows/release.yml
Normal file
248
.gitea/workflows/release.yml
Normal file
@@ -0,0 +1,248 @@
|
|||||||
|
name: Release
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-and-release:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Set up Deno
|
||||||
|
uses: denoland/setup-deno@v1
|
||||||
|
with:
|
||||||
|
deno-version: v2.x
|
||||||
|
|
||||||
|
- name: Get version from tag
|
||||||
|
id: version
|
||||||
|
run: |
|
||||||
|
VERSION=${GITHUB_REF#refs/tags/}
|
||||||
|
echo "version=$VERSION" >> $GITHUB_OUTPUT
|
||||||
|
echo "version_number=${VERSION#v}" >> $GITHUB_OUTPUT
|
||||||
|
echo "Building version: $VERSION"
|
||||||
|
|
||||||
|
- name: Verify deno.json version matches tag
|
||||||
|
run: |
|
||||||
|
DENO_VERSION=$(grep -o '"version": "[^"]*"' deno.json | cut -d'"' -f4)
|
||||||
|
TAG_VERSION="${{ steps.version.outputs.version_number }}"
|
||||||
|
echo "deno.json version: $DENO_VERSION"
|
||||||
|
echo "Tag version: $TAG_VERSION"
|
||||||
|
if [ "$DENO_VERSION" != "$TAG_VERSION" ]; then
|
||||||
|
echo "ERROR: Version mismatch!"
|
||||||
|
echo "deno.json has version $DENO_VERSION but tag is $TAG_VERSION"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Compile binaries for all platforms
|
||||||
|
run: |
|
||||||
|
echo "================================================"
|
||||||
|
echo " SZCI Release Compilation"
|
||||||
|
echo " Version: ${{ steps.version.outputs.version }}"
|
||||||
|
echo "================================================"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Clean up old binaries and create fresh directory
|
||||||
|
rm -rf dist/binaries
|
||||||
|
mkdir -p dist/binaries
|
||||||
|
echo "→ Cleaned old binaries from dist/binaries"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Linux x86_64
|
||||||
|
echo "→ Compiling for Linux x86_64..."
|
||||||
|
deno compile --allow-all --no-check \
|
||||||
|
--output dist/binaries/szci-linux-x64 \
|
||||||
|
--target x86_64-unknown-linux-gnu mod.ts
|
||||||
|
echo " ✓ Linux x86_64 complete"
|
||||||
|
|
||||||
|
# Linux ARM64
|
||||||
|
echo "→ Compiling for Linux ARM64..."
|
||||||
|
deno compile --allow-all --no-check \
|
||||||
|
--output dist/binaries/szci-linux-arm64 \
|
||||||
|
--target aarch64-unknown-linux-gnu mod.ts
|
||||||
|
echo " ✓ Linux ARM64 complete"
|
||||||
|
|
||||||
|
# macOS x86_64
|
||||||
|
echo "→ Compiling for macOS x86_64..."
|
||||||
|
deno compile --allow-all --no-check \
|
||||||
|
--output dist/binaries/szci-macos-x64 \
|
||||||
|
--target x86_64-apple-darwin mod.ts
|
||||||
|
echo " ✓ macOS x86_64 complete"
|
||||||
|
|
||||||
|
# macOS ARM64
|
||||||
|
echo "→ Compiling for macOS ARM64..."
|
||||||
|
deno compile --allow-all --no-check \
|
||||||
|
--output dist/binaries/szci-macos-arm64 \
|
||||||
|
--target aarch64-apple-darwin mod.ts
|
||||||
|
echo " ✓ macOS ARM64 complete"
|
||||||
|
|
||||||
|
# Windows x86_64
|
||||||
|
echo "→ Compiling for Windows x86_64..."
|
||||||
|
deno compile --allow-all --no-check \
|
||||||
|
--output dist/binaries/szci-windows-x64.exe \
|
||||||
|
--target x86_64-pc-windows-msvc mod.ts
|
||||||
|
echo " ✓ Windows x86_64 complete"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "All binaries compiled successfully!"
|
||||||
|
ls -lh dist/binaries/
|
||||||
|
|
||||||
|
- name: Generate SHA256 checksums
|
||||||
|
run: |
|
||||||
|
cd dist/binaries
|
||||||
|
sha256sum * > SHA256SUMS.txt
|
||||||
|
cat SHA256SUMS.txt
|
||||||
|
cd ../..
|
||||||
|
|
||||||
|
- name: Extract changelog for this version
|
||||||
|
id: changelog
|
||||||
|
run: |
|
||||||
|
VERSION="${{ steps.version.outputs.version }}"
|
||||||
|
|
||||||
|
# Check if changelog.md exists
|
||||||
|
if [ ! -f changelog.md ]; then
|
||||||
|
echo "No changelog.md found, using default release notes"
|
||||||
|
cat > /tmp/release_notes.md << EOF
|
||||||
|
## SZCI $VERSION
|
||||||
|
|
||||||
|
Pre-compiled binaries for multiple platforms.
|
||||||
|
|
||||||
|
### Installation
|
||||||
|
|
||||||
|
Use the installation script:
|
||||||
|
\`\`\`bash
|
||||||
|
curl -sSL https://code.foss.global/ship.zone/szci/raw/branch/main/install.sh | sudo bash
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
Or download the binary for your platform and make it executable.
|
||||||
|
|
||||||
|
### Supported Platforms
|
||||||
|
- Linux x86_64 (x64)
|
||||||
|
- Linux ARM64 (aarch64)
|
||||||
|
- macOS x86_64 (Intel)
|
||||||
|
- macOS ARM64 (Apple Silicon)
|
||||||
|
- Windows x86_64
|
||||||
|
|
||||||
|
### Checksums
|
||||||
|
SHA256 checksums are provided in SHA256SUMS.txt
|
||||||
|
EOF
|
||||||
|
else
|
||||||
|
# Try to extract section for this version from changelog.md
|
||||||
|
awk "/## \[$VERSION\]/,/## \[/" changelog.md | sed '$d' > /tmp/release_notes.md || cat > /tmp/release_notes.md << EOF
|
||||||
|
## SZCI $VERSION
|
||||||
|
|
||||||
|
See changelog.md for full details.
|
||||||
|
|
||||||
|
### Installation
|
||||||
|
|
||||||
|
Use the installation script:
|
||||||
|
\`\`\`bash
|
||||||
|
curl -sSL https://code.foss.global/ship.zone/szci/raw/branch/main/install.sh | sudo bash
|
||||||
|
\`\`\`
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Release notes:"
|
||||||
|
cat /tmp/release_notes.md
|
||||||
|
|
||||||
|
- name: Delete existing release if it exists
|
||||||
|
run: |
|
||||||
|
VERSION="${{ steps.version.outputs.version }}"
|
||||||
|
|
||||||
|
echo "Checking for existing release $VERSION..."
|
||||||
|
|
||||||
|
# Try to get existing release by tag
|
||||||
|
EXISTING_RELEASE_ID=$(curl -s \
|
||||||
|
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
|
||||||
|
"https://code.foss.global/api/v1/repos/ship.zone/szci/releases/tags/$VERSION" \
|
||||||
|
| jq -r '.id // empty')
|
||||||
|
|
||||||
|
if [ -n "$EXISTING_RELEASE_ID" ]; then
|
||||||
|
echo "Found existing release (ID: $EXISTING_RELEASE_ID), deleting..."
|
||||||
|
curl -X DELETE -s \
|
||||||
|
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
|
||||||
|
"https://code.foss.global/api/v1/repos/ship.zone/szci/releases/$EXISTING_RELEASE_ID"
|
||||||
|
echo "Existing release deleted"
|
||||||
|
sleep 2
|
||||||
|
else
|
||||||
|
echo "No existing release found, proceeding with creation"
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Create Gitea Release
|
||||||
|
run: |
|
||||||
|
VERSION="${{ steps.version.outputs.version }}"
|
||||||
|
RELEASE_NOTES=$(cat /tmp/release_notes.md)
|
||||||
|
|
||||||
|
# Create the release
|
||||||
|
echo "Creating release for $VERSION..."
|
||||||
|
RELEASE_ID=$(curl -X POST -s \
|
||||||
|
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
"https://code.foss.global/api/v1/repos/ship.zone/szci/releases" \
|
||||||
|
-d "{
|
||||||
|
\"tag_name\": \"$VERSION\",
|
||||||
|
\"name\": \"SZCI $VERSION\",
|
||||||
|
\"body\": $(jq -Rs . /tmp/release_notes.md),
|
||||||
|
\"draft\": false,
|
||||||
|
\"prerelease\": false
|
||||||
|
}" | jq -r '.id')
|
||||||
|
|
||||||
|
echo "Release created with ID: $RELEASE_ID"
|
||||||
|
|
||||||
|
# Upload binaries as release assets
|
||||||
|
for binary in dist/binaries/*; do
|
||||||
|
filename=$(basename "$binary")
|
||||||
|
echo "Uploading $filename..."
|
||||||
|
curl -X POST -s \
|
||||||
|
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
|
||||||
|
-H "Content-Type: application/octet-stream" \
|
||||||
|
--data-binary "@$binary" \
|
||||||
|
"https://code.foss.global/api/v1/repos/ship.zone/szci/releases/$RELEASE_ID/assets?name=$filename"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "All assets uploaded successfully"
|
||||||
|
|
||||||
|
- name: Clean up old releases
|
||||||
|
run: |
|
||||||
|
echo "Cleaning up old releases (keeping only last 3)..."
|
||||||
|
|
||||||
|
# Fetch all releases sorted by creation date
|
||||||
|
RELEASES=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
|
||||||
|
"https://code.foss.global/api/v1/repos/ship.zone/szci/releases" | \
|
||||||
|
jq -r 'sort_by(.created_at) | reverse | .[3:] | .[].id')
|
||||||
|
|
||||||
|
# Delete old releases
|
||||||
|
if [ -n "$RELEASES" ]; then
|
||||||
|
echo "Found releases to delete:"
|
||||||
|
for release_id in $RELEASES; do
|
||||||
|
echo " Deleting release ID: $release_id"
|
||||||
|
curl -X DELETE -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
|
||||||
|
"https://code.foss.global/api/v1/repos/ship.zone/szci/releases/$release_id"
|
||||||
|
done
|
||||||
|
echo "Old releases deleted successfully"
|
||||||
|
else
|
||||||
|
echo "No old releases to delete (less than 4 releases total)"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
- name: Release Summary
|
||||||
|
run: |
|
||||||
|
echo "================================================"
|
||||||
|
echo " Release ${{ steps.version.outputs.version }} Complete!"
|
||||||
|
echo "================================================"
|
||||||
|
echo ""
|
||||||
|
echo "Binaries published:"
|
||||||
|
ls -lh dist/binaries/
|
||||||
|
echo ""
|
||||||
|
echo "Release URL:"
|
||||||
|
echo "https://code.foss.global/ship.zone/szci/releases/tag/${{ steps.version.outputs.version }}"
|
||||||
|
echo ""
|
||||||
|
echo "Installation command:"
|
||||||
|
echo "curl -sSL https://code.foss.global/ship.zone/szci/raw/branch/main/install.sh | sudo bash"
|
||||||
|
echo ""
|
||||||
20
.gitignore
vendored
20
.gitignore
vendored
@@ -1,5 +1,17 @@
|
|||||||
|
.nogit/
|
||||||
|
|
||||||
|
# installs
|
||||||
node_modules/
|
node_modules/
|
||||||
coverage/
|
|
||||||
pages/
|
# caches
|
||||||
public/
|
.cache/
|
||||||
config.json
|
|
||||||
|
# builds
|
||||||
|
dist/
|
||||||
|
dist_*/
|
||||||
|
|
||||||
|
# deno
|
||||||
|
deno.lock
|
||||||
|
.deno/
|
||||||
|
|
||||||
|
# custom
|
||||||
|
|||||||
@@ -1,70 +0,0 @@
|
|||||||
image: node:latest
|
|
||||||
|
|
||||||
stages:
|
|
||||||
- test
|
|
||||||
- release
|
|
||||||
- trigger
|
|
||||||
- page
|
|
||||||
|
|
||||||
|
|
||||||
before_script:
|
|
||||||
- npm install npmci -q -g
|
|
||||||
|
|
||||||
testLTS:
|
|
||||||
stage: test
|
|
||||||
script:
|
|
||||||
- npmci install lts
|
|
||||||
- npmci command npm install -g npmts
|
|
||||||
- npmci test lts
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
|
|
||||||
testSTABLE:
|
|
||||||
stage: test
|
|
||||||
script:
|
|
||||||
- npmci install stable
|
|
||||||
- npmci command npm install -g npmts
|
|
||||||
- npmci test stable
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
|
|
||||||
testLEGACY:
|
|
||||||
stage: test
|
|
||||||
script:
|
|
||||||
- npmci install legacy
|
|
||||||
- npmci command npm install -g npmts
|
|
||||||
- npmci test legacy
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
allow_failure: true
|
|
||||||
|
|
||||||
release:
|
|
||||||
stage: release
|
|
||||||
script:
|
|
||||||
- npmci publish
|
|
||||||
only:
|
|
||||||
- tags
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
|
|
||||||
trigger:
|
|
||||||
stage: trigger
|
|
||||||
script:
|
|
||||||
- npmci trigger
|
|
||||||
only:
|
|
||||||
- tags
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
|
|
||||||
pages:
|
|
||||||
stage: page
|
|
||||||
script:
|
|
||||||
- npmci test stable
|
|
||||||
- npmci command npm install -g -q npmpage
|
|
||||||
- npmci command npmpage --host gitlab
|
|
||||||
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": {
|
||||||
|
"szci": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "settings for szci"
|
||||||
|
},
|
||||||
|
"gitzone": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "settings for gitzone",
|
||||||
|
"properties": {
|
||||||
|
"projectType": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["website", "element", "service", "npm", "wcc"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
65
README.md
65
README.md
@@ -1,65 +0,0 @@
|
|||||||
# NPMCI
|
|
||||||
npmci is your friend when it comes to handling npm packages during CI builds. It is optimized for GitLab CI
|
|
||||||
|
|
||||||
## Availabililty
|
|
||||||
[](https://www.npmjs.com/package/npmci)
|
|
||||||
[](https://gitlab.com/pushrocks/npmci)
|
|
||||||
[](https://github.com/pushrocks/npmci)
|
|
||||||
[](https://pushrocks.gitlab.io/npmci/docs)
|
|
||||||
|
|
||||||
## Status for master
|
|
||||||
[](https://gitlab.com/pushrocks/npmci/commits/master)
|
|
||||||
[](https://gitlab.com/pushrocks/npmci/commits/master)
|
|
||||||
[](https://david-dm.org/pushrocks/npmci)
|
|
||||||
[](https://www.bithound.io/github/pushrocks/npmci/master/dependencies/npm)
|
|
||||||
[](https://www.bithound.io/github/pushrocks/npmci)
|
|
||||||
[](https://nodejs.org/dist/latest-v6.x/docs/api/)
|
|
||||||
[](https://nodejs.org/dist/latest-v6.x/docs/api/)
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
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 lake 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
|
|
||||||
```
|
|
||||||
|
|
||||||
108
bin/szci-wrapper.js
Executable file
108
bin/szci-wrapper.js
Executable file
@@ -0,0 +1,108 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SZCI npm wrapper
|
||||||
|
* This script executes the appropriate pre-compiled binary based on the current platform
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { spawn } from 'child_process';
|
||||||
|
import { fileURLToPath } from 'url';
|
||||||
|
import { dirname, join } from 'path';
|
||||||
|
import { existsSync } from 'fs';
|
||||||
|
import { platform, arch } from 'os';
|
||||||
|
|
||||||
|
const __filename = fileURLToPath(import.meta.url);
|
||||||
|
const __dirname = dirname(__filename);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the binary name for the current platform
|
||||||
|
*/
|
||||||
|
function getBinaryName() {
|
||||||
|
const plat = platform();
|
||||||
|
const architecture = arch();
|
||||||
|
|
||||||
|
// Map Node's platform/arch to our binary naming
|
||||||
|
const platformMap = {
|
||||||
|
'darwin': 'macos',
|
||||||
|
'linux': 'linux',
|
||||||
|
'win32': 'windows'
|
||||||
|
};
|
||||||
|
|
||||||
|
const archMap = {
|
||||||
|
'x64': 'x64',
|
||||||
|
'arm64': 'arm64'
|
||||||
|
};
|
||||||
|
|
||||||
|
const mappedPlatform = platformMap[plat];
|
||||||
|
const mappedArch = archMap[architecture];
|
||||||
|
|
||||||
|
if (!mappedPlatform || !mappedArch) {
|
||||||
|
console.error(`Error: Unsupported platform/architecture: ${plat}/${architecture}`);
|
||||||
|
console.error('Supported platforms: Linux, macOS, Windows');
|
||||||
|
console.error('Supported architectures: x64, arm64');
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Construct binary name
|
||||||
|
let binaryName = `szci-${mappedPlatform}-${mappedArch}`;
|
||||||
|
if (plat === 'win32') {
|
||||||
|
binaryName += '.exe';
|
||||||
|
}
|
||||||
|
|
||||||
|
return binaryName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the binary
|
||||||
|
*/
|
||||||
|
function executeBinary() {
|
||||||
|
const binaryName = getBinaryName();
|
||||||
|
const binaryPath = join(__dirname, '..', 'dist', 'binaries', binaryName);
|
||||||
|
|
||||||
|
// Check if binary exists
|
||||||
|
if (!existsSync(binaryPath)) {
|
||||||
|
console.error(`Error: Binary not found at ${binaryPath}`);
|
||||||
|
console.error('This might happen if:');
|
||||||
|
console.error('1. The postinstall script failed to run');
|
||||||
|
console.error('2. The platform is not supported');
|
||||||
|
console.error('3. The package was not installed correctly');
|
||||||
|
console.error('');
|
||||||
|
console.error('Try reinstalling the package:');
|
||||||
|
console.error(' npm uninstall -g @ship.zone/szci');
|
||||||
|
console.error(' npm install -g @ship.zone/szci');
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Spawn the binary with all arguments passed through
|
||||||
|
const child = spawn(binaryPath, process.argv.slice(2), {
|
||||||
|
stdio: 'inherit',
|
||||||
|
shell: false
|
||||||
|
});
|
||||||
|
|
||||||
|
// Handle child process events
|
||||||
|
child.on('error', (err) => {
|
||||||
|
console.error(`Error executing szci: ${err.message}`);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
child.on('exit', (code, signal) => {
|
||||||
|
if (signal) {
|
||||||
|
process.kill(process.pid, signal);
|
||||||
|
} else {
|
||||||
|
process.exit(code || 0);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Forward signals to child process
|
||||||
|
const signals = ['SIGINT', 'SIGTERM', 'SIGHUP'];
|
||||||
|
signals.forEach(signal => {
|
||||||
|
process.on(signal, () => {
|
||||||
|
if (!child.killed) {
|
||||||
|
child.kill(signal);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Execute
|
||||||
|
executeBinary();
|
||||||
144
changelog.md
Normal file
144
changelog.md
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
## 2026-02-07 - 7.1.1 - fix(workflows)
|
||||||
|
normalize default branch to 'main' across CI/release workflows and docs; update package metadata; clean .gitignore and fix readme license link
|
||||||
|
|
||||||
|
- Updated workflow triggers and documentation from 'master' to 'main' (.gitea/workflows/ci.yml, .gitea/workflows/release.yml, .gitea/workflows/README.md) including install script URLs referenced in release instructions.
|
||||||
|
- Updated npmextra.json @git.zone/cli metadata: changed projectType from 'npm' to 'deno' and githost from 'gitlab.com' to 'code.foss.global'.
|
||||||
|
- Cleaned .gitignore by removing outdated entries (coverage/, public/, pages/, .yarn/, .rpt2_cache) and minor whitespace fixes.
|
||||||
|
- Normalized license filename link in readme.md from 'LICENSE' to lowercase 'license'.
|
||||||
|
|
||||||
|
## 2026-02-07 - 7.1.0 - feat(installer)
|
||||||
|
switch installer/docs to use main branch; add automated installer instructions and update CI examples to use the installer; add release registries and access level in npmextra.json
|
||||||
|
|
||||||
|
- Replaced master branch URLs with main in install.sh and README examples
|
||||||
|
- Added "Automated Installer (Recommended)" section to README with curl install examples (including versioned install)
|
||||||
|
- Replaced npm install -g @ship.zone/szci in CI examples with the curl-based installer invocation (some uses sudo)
|
||||||
|
- Updated npmextra.json: removed npmAccessLevel for @ship.zone/szci and added release.registries and release.accessLevel entries
|
||||||
|
|
||||||
|
## 2026-02-06 - 7.0.0 - BREAKING CHANGE(szci)
|
||||||
|
delegate Docker operations to @git.zone/tsdocker, remove internal Docker managers and deprecated modules, simplify CLI and env var handling
|
||||||
|
|
||||||
|
- Delegate all Docker actions to @git.zone/tsdocker via npx; SzciDockerManager now bridges SZCI_LOGIN_DOCKER* and CI_JOB_TOKEN to DOCKER_REGISTRY_N and invokes npx @git.zone/tsdocker for build/login/push/pull/test.
|
||||||
|
- Removed internal Docker implementation: Dockerfile, DockerRegistry, RegistryStorage, related helpers and plugin wrappers removed from ts/manager.docker.
|
||||||
|
- Removed Cloudron manager and other deprecated modules and their plugin shims: manager.cloudron, mod_clean, mod_command, mod_precheck, mod_trigger (and corresponding CLI commands: cloudron, clean, command, precheck, trigger).
|
||||||
|
- CLI and exports simplified: Dockerfile export removed from mod.ts; Szci CLI now delegates docker command to the simplified SzciDockerManager.
|
||||||
|
- Updated environment handling: bridges SZCI_LOGIN_DOCKER* → DOCKER_REGISTRY_N and auto-bridges GitLab CI CI_JOB_TOKEN to DOCKER_REGISTRY_0.
|
||||||
|
- Node.js default mappings updated: stable→22, lts→20, legacy→18.
|
||||||
|
- Dependencies and plugins cleaned-up: removed unused/obsolete deps (e.g. @push.rocks/lik, smartdelay, through2) from deno.json and szci.plugins.ts.
|
||||||
|
- Docs updated (readme.md, readme.hints.md) to reflect architecture, tsdocker delegation, env var bridging and migration notes from npmci.
|
||||||
|
- BREAKING: CI configs and any workflows relying on internal Docker classes or the removed CLI commands must be updated to use tsdocker and the new env var/command flows.
|
||||||
|
|
||||||
|
## 2025-10-26 - 6.0.1 - fix(tests)
|
||||||
|
Migrate tests to Deno native runner and update Deno config
|
||||||
|
|
||||||
|
- Convert test suites from tap/tapbundle to Deno.test and @std/assert
|
||||||
|
- Replace CommonJS-style runtime imports with .ts module imports for Deno (test files updated)
|
||||||
|
- Use Deno.env.set to configure test environment variables and restore working directory after tests
|
||||||
|
- Update test/test.cloudly.ts to import CloudlyConnector directly and disable TLS verification for tests
|
||||||
|
- Adjust deno.json version field (6.0.0 -> 5.0.0) as part of Deno configuration changes
|
||||||
|
- Add local project .claude/settings.local.json for tooling permissions
|
||||||
|
|
||||||
|
## 2025-10-26 - 6.0.0 - BREAKING CHANGE(szci)
|
||||||
|
Rename project from npmci to szci and migrate runtime to Deno; add compiled binaries, installer and wrapper; update imports, env handling and package metadata
|
||||||
|
|
||||||
|
- Major rename/refactor: Npmci -> Szci across the codebase (classes, filenames, modules and exports).
|
||||||
|
- Migrate runtime to Deno: add deno.json, mod.ts entry point, use Deno.std imports and .ts module imports throughout.
|
||||||
|
- Add compilation and distribution tooling: scripts/compile-all.sh, scripts/install-binary.js, bin/szci-wrapper.js and dist/binaries layout for prebuilt executables.
|
||||||
|
- Package metadata updated: package.json renamed/rewritten for @ship.zone/szci and bumped to 5.0.0, updated publishConfig, files and scripts.
|
||||||
|
- Environment API changes: replaced process.env usages with Deno.env accessors and updated path constants (Szci paths).
|
||||||
|
- Refactored helper modules: npmci.bash -> szci.bash, updated smartshell/bash wrappers and other manager modules to Deno patterns.
|
||||||
|
- Tests and imports updated to new module paths and package layout; .gitignore updated to ignore deno artifacts.
|
||||||
|
- Breaking changes to callers: CLI name, class names, programmatic API, binary installation and environment handling have changed and may require updates in integrations and CI configurations.
|
||||||
|
|
||||||
|
## 2024-11-17 - 4.1.37 - fix(docker)
|
||||||
|
Enhanced base image extraction logic from Dockerfile
|
||||||
|
|
||||||
|
- Improved dockerBaseImage to accurately extract base images considering ARG variables.
|
||||||
|
- Added support for parsing Dockerfile content without external libraries.
|
||||||
|
- Enhanced error handling for missing FROM instructions.
|
||||||
|
|
||||||
|
## 2024-11-17 - 4.1.36 - fix(docker)
|
||||||
|
Improve logging for Dockerfile build order with base image details.
|
||||||
|
|
||||||
|
- Enhance logging in Dockerfile sorting process to include base image information.
|
||||||
|
|
||||||
|
## 2024-11-17 - 4.1.35 - fix(docker)
|
||||||
|
Fix Dockerfile dependency sorting and enhance environment variable handling for GitHub repos
|
||||||
|
|
||||||
|
- Refined the algorithm for sorting Dockerfiles based on dependencies to ensure proper build order.
|
||||||
|
- Enhanced environment variable handling in the NpmciEnv class to support conditional assignments.
|
||||||
|
- Updated various dependencies in package.json for improved performance and compatibility.
|
||||||
|
- Added error handling to circular dependency detection in Dockerfile sorting.
|
||||||
|
|
||||||
|
## 2024-11-05 - 4.1.34 - fix(connector)
|
||||||
|
Remove unused typedrequest implementation in cloudlyconnector
|
||||||
|
|
||||||
|
- Removed commented out code that initialized typedrequest in CloudlyConnector.
|
||||||
|
|
||||||
|
## 2024-11-05 - 4.1.33 - fix(core)
|
||||||
|
Updated dependencies and improved npm preparation logic.
|
||||||
|
|
||||||
|
- Updated @git.zone/tsbuild from ^2.1.84 to ^2.2.0.
|
||||||
|
- Updated @git.zone/tsrun from ^1.2.49 to ^1.3.3.
|
||||||
|
- Updated @types/node from ^22.7.9 to ^22.8.7.
|
||||||
|
- Updated @serve.zone/api from ^1.2.1 to ^4.3.1.
|
||||||
|
- Improved npm preparation logic to handle empty tokens gracefully.
|
||||||
|
|
||||||
|
## 2024-10-23 - 4.1.32 - fix(dependencies)
|
||||||
|
Update project dependencies to latest versions
|
||||||
|
|
||||||
|
- Updated development dependencies, including @git.zone/tsbuild and @git.zone/tsrun.
|
||||||
|
- Updated production dependencies such as @api.global/typedrequest and @push.rocks/smartfile.
|
||||||
|
|
||||||
|
## 2022-10-24 - 4.0.11 - prerelease
|
||||||
|
now includes a precheck for more generic runner execution
|
||||||
|
|
||||||
|
- Implemented a precheck feature for runners.
|
||||||
|
|
||||||
|
## 2022-10-09 to 2022-10-11 - 4.0.0 to 4.0.10 - migration
|
||||||
|
internal migrations and fixes
|
||||||
|
|
||||||
|
- Major switch to ESM style module: **BREAKING CHANGE**.
|
||||||
|
- Multiple fixes in core functionalities and module updates.
|
||||||
|
|
||||||
|
## 2019-11-26 - 3.1.73 - fixes
|
||||||
|
correctly setting npm cache and other updates
|
||||||
|
|
||||||
|
- Ensured correct npm cache setting during preparation.
|
||||||
|
- Various core updates.
|
||||||
|
|
||||||
|
## 2018-12-23 - 3.1.19 - privacy updates
|
||||||
|
enhanced mirroring controls for private code
|
||||||
|
|
||||||
|
- Now refusing to mirror private code.
|
||||||
|
|
||||||
|
## 2018-11-24 - 3.1.2 - ci improvement
|
||||||
|
removed unnecessary build dependency
|
||||||
|
|
||||||
|
- Removed npmts build dependency in CI pipeline.
|
||||||
|
|
||||||
|
## 2018-09-22 - 3.0.59 - enhancement
|
||||||
|
integrated smartlog for improved logging
|
||||||
|
|
||||||
|
- Logs now utilize smartlog for better management.
|
||||||
|
|
||||||
|
## 2017-09-08 - 3.0.14 - analytics
|
||||||
|
added analytics features
|
||||||
|
|
||||||
|
- Enabled analytics throughout the system.
|
||||||
|
|
||||||
|
## 2017-08-29 - 3.0.9 - docker enhancements
|
||||||
|
docker improvements and build args implementation
|
||||||
|
|
||||||
|
- Implemented working `dockerBuildArgEnvMap`.
|
||||||
|
|
||||||
|
## 2017-07-27 - 2.4.0 - stability improvements
|
||||||
|
various updates to stabilize the environment
|
||||||
|
|
||||||
|
- Fixed npmci versioning issues.
|
||||||
|
|
||||||
|
## 2016-11-25 - 2.3.24 - global tools
|
||||||
|
improved handling for global tool installations
|
||||||
|
|
||||||
|
- Improved install handling for needed global tools.
|
||||||
63
deno.json
Normal file
63
deno.json
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
{
|
||||||
|
"name": "@ship.zone/szci",
|
||||||
|
"version": "7.1.1",
|
||||||
|
"exports": "./mod.ts",
|
||||||
|
"nodeModulesDir": "auto",
|
||||||
|
"tasks": {
|
||||||
|
"dev": "deno run --allow-all mod.ts",
|
||||||
|
"compile": "deno task compile:all",
|
||||||
|
"compile:all": "bash scripts/compile-all.sh",
|
||||||
|
"test": "deno test --allow-all test/",
|
||||||
|
"test:watch": "deno test --allow-all --watch test/",
|
||||||
|
"check": "deno check mod.ts",
|
||||||
|
"fmt": "deno fmt",
|
||||||
|
"lint": "deno lint"
|
||||||
|
},
|
||||||
|
"lint": {
|
||||||
|
"rules": {
|
||||||
|
"tags": [
|
||||||
|
"recommended"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"fmt": {
|
||||||
|
"useTabs": false,
|
||||||
|
"lineWidth": 100,
|
||||||
|
"indentWidth": 2,
|
||||||
|
"semiColons": true,
|
||||||
|
"singleQuote": true
|
||||||
|
},
|
||||||
|
"compilerOptions": {
|
||||||
|
"lib": [
|
||||||
|
"deno.window"
|
||||||
|
],
|
||||||
|
"strict": true
|
||||||
|
},
|
||||||
|
"imports": {
|
||||||
|
"@std/path": "jsr:@std/path@^1.0.0",
|
||||||
|
"@std/fmt": "jsr:@std/fmt@^1.0.0",
|
||||||
|
"@std/cli": "jsr:@std/cli@^1.0.0",
|
||||||
|
"@std/assert": "jsr:@std/assert@^1.0.0",
|
||||||
|
"@api.global/typedrequest": "npm:@api.global/typedrequest@^3.1.10",
|
||||||
|
"@push.rocks/npmextra": "npm:@push.rocks/npmextra@^5.1.2",
|
||||||
|
"@push.rocks/projectinfo": "npm:@push.rocks/projectinfo@^5.0.2",
|
||||||
|
"@push.rocks/qenv": "npm:@push.rocks/qenv@^6.0.2",
|
||||||
|
"@push.rocks/smartanalytics": "npm:@push.rocks/smartanalytics@^2.0.15",
|
||||||
|
"@push.rocks/smartcli": "npm:@push.rocks/smartcli@^4.0.11",
|
||||||
|
"@push.rocks/smartfile": "npm:@push.rocks/smartfile@^11.0.21",
|
||||||
|
"@push.rocks/smartgit": "npm:@push.rocks/smartgit@^3.1.1",
|
||||||
|
"@push.rocks/smartlog": "npm:@push.rocks/smartlog@^3.0.7",
|
||||||
|
"@push.rocks/smartlog-destination-local": "npm:@push.rocks/smartlog-destination-local@^9.0.0",
|
||||||
|
"@push.rocks/smartobject": "npm:@push.rocks/smartobject@^1.0.12",
|
||||||
|
"@push.rocks/smartpath": "npm:@push.rocks/smartpath@^5.0.11",
|
||||||
|
"@push.rocks/smartpromise": "npm:@push.rocks/smartpromise@^4.0.4",
|
||||||
|
"@push.rocks/smartrequest": "npm:@push.rocks/smartrequest@^2.0.23",
|
||||||
|
"@push.rocks/smartshell": "npm:@push.rocks/smartshell@^3.0.6",
|
||||||
|
"@push.rocks/smartsocket": "npm:@push.rocks/smartsocket@^2.0.22",
|
||||||
|
"@push.rocks/smartssh": "npm:@push.rocks/smartssh@^2.0.1",
|
||||||
|
"@push.rocks/smartstring": "npm:@push.rocks/smartstring@^4.0.8",
|
||||||
|
"@push.rocks/smartexpect": "npm:@push.rocks/smartexpect@^1.0.15",
|
||||||
|
"@serve.zone/api": "npm:@serve.zone/api@^4.3.11",
|
||||||
|
"@tsclass/tsclass": "npm:@tsclass/tsclass@^4.1.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
2
dist/cli.js
vendored
2
dist/cli.js
vendored
@@ -1,2 +0,0 @@
|
|||||||
#!/usr/bin/env node
|
|
||||||
var index = require("../dist/index.js");
|
|
||||||
3
dist/index.d.ts
vendored
3
dist/index.d.ts
vendored
@@ -1,3 +0,0 @@
|
|||||||
export { build } from './npmci.build';
|
|
||||||
export { install } from './npmci.install';
|
|
||||||
export { publish } from './npmci.publish';
|
|
||||||
79
dist/index.js
vendored
79
dist/index.js
vendored
@@ -1,79 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
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 npmci_build_1 = require("./npmci.build");
|
|
||||||
const npmci_clean_1 = require("./npmci.clean");
|
|
||||||
const npmci_command_1 = require("./npmci.command");
|
|
||||||
const npmci_install_1 = require("./npmci.install");
|
|
||||||
const npmci_publish_1 = require("./npmci.publish");
|
|
||||||
const npmci_prepare_1 = require("./npmci.prepare");
|
|
||||||
const npmci_test_1 = require("./npmci.test");
|
|
||||||
const npmci_trigger_1 = require("./npmci.trigger");
|
|
||||||
const NpmciEnv = require("./npmci.env");
|
|
||||||
var npmci_build_2 = require("./npmci.build");
|
|
||||||
exports.build = npmci_build_2.build;
|
|
||||||
var npmci_install_2 = require("./npmci.install");
|
|
||||||
exports.install = npmci_install_2.install;
|
|
||||||
var npmci_publish_2 = require("./npmci.publish");
|
|
||||||
exports.publish = npmci_publish_2.publish;
|
|
||||||
let smartcli = new plugins.smartcli.Smartcli();
|
|
||||||
smartcli.addVersion(npmciInfo.version);
|
|
||||||
// build
|
|
||||||
smartcli.addCommand({
|
|
||||||
commandName: 'build'
|
|
||||||
}).then((argv) => {
|
|
||||||
npmci_build_1.build(argv._[1])
|
|
||||||
.then(NpmciEnv.configStore);
|
|
||||||
});
|
|
||||||
// clean
|
|
||||||
smartcli.addCommand({
|
|
||||||
commandName: 'clean'
|
|
||||||
}).then((argv) => {
|
|
||||||
npmci_clean_1.clean()
|
|
||||||
.then(NpmciEnv.configStore);
|
|
||||||
});
|
|
||||||
// command
|
|
||||||
smartcli.addCommand({
|
|
||||||
commandName: 'command'
|
|
||||||
}).then((argv) => {
|
|
||||||
npmci_command_1.command()
|
|
||||||
.then(NpmciEnv.configStore);
|
|
||||||
});
|
|
||||||
// install
|
|
||||||
smartcli.addCommand({
|
|
||||||
commandName: 'install'
|
|
||||||
}).then((argv) => {
|
|
||||||
npmci_install_1.install(argv._[1])
|
|
||||||
.then(NpmciEnv.configStore);
|
|
||||||
});
|
|
||||||
// prepare
|
|
||||||
smartcli.addCommand({
|
|
||||||
commandName: 'prepare'
|
|
||||||
}).then((argv) => {
|
|
||||||
npmci_prepare_1.prepare(argv._[1])
|
|
||||||
.then(NpmciEnv.configStore);
|
|
||||||
});
|
|
||||||
// publish
|
|
||||||
smartcli.addCommand({
|
|
||||||
commandName: 'publish'
|
|
||||||
}).then((argv) => {
|
|
||||||
npmci_publish_1.publish(argv._[1])
|
|
||||||
.then(NpmciEnv.configStore);
|
|
||||||
});
|
|
||||||
// test
|
|
||||||
smartcli.addCommand({
|
|
||||||
commandName: 'test'
|
|
||||||
}).then((argv) => {
|
|
||||||
npmci_test_1.test(argv._[1])
|
|
||||||
.then(NpmciEnv.configStore);
|
|
||||||
});
|
|
||||||
// trigger
|
|
||||||
smartcli.addCommand({
|
|
||||||
commandName: 'trigger'
|
|
||||||
}).then((argv) => {
|
|
||||||
npmci_trigger_1.trigger();
|
|
||||||
});
|
|
||||||
smartcli.startParse();
|
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMkNBQTBDO0FBQzFDLHVDQUFzQztBQUN0QyxJQUFJLFNBQVMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO0FBQzlFLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtBQUU1RCwrQ0FBbUM7QUFDbkMsK0NBQW1DO0FBQ25DLG1EQUF1QztBQUN2QyxtREFBdUM7QUFDdkMsbURBQXVDO0FBQ3ZDLG1EQUF1QztBQUN2Qyw2Q0FBaUM7QUFDakMsbURBQXVDO0FBQ3ZDLHdDQUF1QztBQUV2Qyw2Q0FBbUM7QUFBM0IsOEJBQUEsS0FBSyxDQUFBO0FBQ2IsaURBQXdDO0FBQWhDLGtDQUFBLE9BQU8sQ0FBQTtBQUNmLGlEQUF3QztBQUFoQyxrQ0FBQSxPQUFPLENBQUE7QUFFZixJQUFJLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUE7QUFDOUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUE7QUFFdEMsUUFBUTtBQUNSLFFBQVEsQ0FBQyxVQUFVLENBQUM7SUFDaEIsV0FBVyxFQUFFLE9BQU87Q0FDdkIsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUk7SUFDVCxtQkFBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDWCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFBO0FBQ25DLENBQUMsQ0FBQyxDQUFBO0FBRUYsUUFBUTtBQUNSLFFBQVEsQ0FBQyxVQUFVLENBQUM7SUFDaEIsV0FBVyxFQUFFLE9BQU87Q0FDdkIsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUk7SUFDVCxtQkFBSyxFQUFFO1NBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQTtBQUNuQyxDQUFDLENBQUMsQ0FBQTtBQUVGLFVBQVU7QUFDVixRQUFRLENBQUMsVUFBVSxDQUFDO0lBQ2hCLFdBQVcsRUFBRSxTQUFTO0NBQ3pCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJO0lBQ1QsdUJBQU8sRUFBRTtTQUNKLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUE7QUFDbkMsQ0FBQyxDQUFDLENBQUE7QUFFRixVQUFVO0FBQ1YsUUFBUSxDQUFDLFVBQVUsQ0FBQztJQUNoQixXQUFXLEVBQUUsU0FBUztDQUN6QixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSTtJQUNULHVCQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNiLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUE7QUFDbkMsQ0FBQyxDQUFDLENBQUE7QUFFRixVQUFVO0FBQ1YsUUFBUSxDQUFDLFVBQVUsQ0FBQztJQUNoQixXQUFXLEVBQUUsU0FBUztDQUN6QixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSTtJQUNULHVCQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNiLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUE7QUFDbkMsQ0FBQyxDQUFDLENBQUE7QUFFRixVQUFVO0FBQ1YsUUFBUSxDQUFDLFVBQVUsQ0FBQztJQUNoQixXQUFXLEVBQUUsU0FBUztDQUN6QixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSTtJQUNULHVCQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNiLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUE7QUFDbkMsQ0FBQyxDQUFDLENBQUE7QUFFRixPQUFPO0FBQ1AsUUFBUSxDQUFDLFVBQVUsQ0FBQztJQUNoQixXQUFXLEVBQUUsTUFBTTtDQUN0QixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSTtJQUNULGlCQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNWLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUE7QUFDbkMsQ0FBQyxDQUFDLENBQUE7QUFFRixVQUFVO0FBQ1YsUUFBUSxDQUFDLFVBQVUsQ0FBQztJQUNoQixXQUFXLEVBQUUsU0FBUztDQUN6QixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSTtJQUNULHVCQUFPLEVBQUUsQ0FBQTtBQUNiLENBQUMsQ0FBQyxDQUFBO0FBRUYsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFBIn0=
|
|
||||||
3
dist/npmci.bash.d.ts
vendored
3
dist/npmci.bash.d.ts
vendored
@@ -1,3 +0,0 @@
|
|||||||
export declare let nvmAvailable: boolean;
|
|
||||||
export declare let bash: (commandArg: string, retryArg?: number, bareArg?: boolean) => string;
|
|
||||||
export declare let bashBare: (commandArg: any, retryArg?: number) => string;
|
|
||||||
51
dist/npmci.bash.js
vendored
51
dist/npmci.bash.js
vendored
@@ -1,51 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
const plugins = require("./npmci.plugins");
|
|
||||||
let nvmSourceString = '';
|
|
||||||
exports.nvmAvailable = false;
|
|
||||||
let checkNvm = () => {
|
|
||||||
if (plugins.shelljs.exec(`bash -c "source /usr/local/nvm/nvm.sh"`, { silent: true }).code === 0) {
|
|
||||||
nvmSourceString = `source /usr/local/nvm/nvm.sh && `;
|
|
||||||
exports.nvmAvailable = true;
|
|
||||||
}
|
|
||||||
else if (plugins.shelljs.exec(`bash -c "source ~/.nvm/nvm.sh"`, { silent: true }).code === 0) {
|
|
||||||
nvmSourceString = `source ~/.nvm/nvm.sh && `;
|
|
||||||
exports.nvmAvailable = true;
|
|
||||||
}
|
|
||||||
;
|
|
||||||
};
|
|
||||||
checkNvm();
|
|
||||||
exports.bash = (commandArg, retryArg = 2, bareArg = false) => {
|
|
||||||
let exitCode;
|
|
||||||
let stdOut;
|
|
||||||
let execResult;
|
|
||||||
if (!process.env.NPMTS_TEST) {
|
|
||||||
for (let i = 0; i <= retryArg; i++) {
|
|
||||||
if (!bareArg) {
|
|
||||||
execResult = plugins.shelljs.exec(`bash -c "${nvmSourceString} ${commandArg}"`);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
execResult = plugins.shelljs.exec(commandArg);
|
|
||||||
}
|
|
||||||
exitCode = execResult.code;
|
|
||||||
stdOut = execResult.stdout;
|
|
||||||
if (exitCode !== 0 && i === retryArg) {
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
else if (exitCode === 0) {
|
|
||||||
i = retryArg + 1; // if everything works out ok retrials are not wanted
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
plugins.beautylog.warn('Something went wrong! Exit Code: ' + exitCode.toString());
|
|
||||||
plugins.beautylog.info('Retry ' + (i + 1).toString() + ' of ' + retryArg.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
plugins.beautylog.log('ShellExec would be: ' + commandArg);
|
|
||||||
}
|
|
||||||
return stdOut;
|
|
||||||
};
|
|
||||||
exports.bashBare = (commandArg, retryArg = 2) => {
|
|
||||||
return exports.bash(commandArg, retryArg, true);
|
|
||||||
};
|
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtY2kuYmFzaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL25wbWNpLmJhc2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDJDQUEwQztBQUUxQyxJQUFJLGVBQWUsR0FBVyxFQUFFLENBQUE7QUFDckIsUUFBQSxZQUFZLEdBQVksS0FBSyxDQUFBO0FBQ3hDLElBQUksUUFBUSxHQUFHO0lBQ1gsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsd0NBQXdDLEVBQUMsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRixlQUFlLEdBQUcsa0NBQWtDLENBQUE7UUFDcEQsb0JBQVksR0FBRyxJQUFJLENBQUE7SUFDdkIsQ0FBQztJQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsRUFBQyxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFGLGVBQWUsR0FBRywwQkFBMEIsQ0FBQTtRQUM1QyxvQkFBWSxHQUFHLElBQUksQ0FBQTtJQUN2QixDQUFDO0lBQUEsQ0FBQztBQUNOLENBQUMsQ0FBQTtBQUNELFFBQVEsRUFBRSxDQUFBO0FBRUMsUUFBQSxJQUFJLEdBQUcsQ0FBQyxVQUFrQixFQUFFLFFBQVEsR0FBRyxDQUFDLEVBQUUsT0FBTyxHQUFHLEtBQUs7SUFDaEUsSUFBSSxRQUFnQixDQUFBO0lBQ3BCLElBQUksTUFBYyxDQUFBO0lBQ2xCLElBQUksVUFBVSxDQUFBO0lBQ2QsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDMUIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNqQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ1gsVUFBVSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUM3QixZQUFZLGVBQWUsSUFBSSxVQUFVLEdBQUcsQ0FDL0MsQ0FBQTtZQUNMLENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDSixVQUFVLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDakQsQ0FBQztZQUNELFFBQVEsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFBO1lBQzFCLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFBO1lBQzFCLEVBQUUsQ0FBQyxDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQ25DLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDbkIsQ0FBQztZQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEIsQ0FBQyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUEsQ0FBQyxxREFBcUQ7WUFDMUUsQ0FBQztZQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNKLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLG1DQUFtQyxHQUFHLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO2dCQUNqRixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEdBQUcsTUFBTSxHQUFHLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO1lBQ3hGLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUFDLElBQUksQ0FBQyxDQUFDO1FBQ0osT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLEdBQUcsVUFBVSxDQUFDLENBQUE7SUFDOUQsQ0FBQztJQUNELE1BQU0sQ0FBQyxNQUFNLENBQUE7QUFDakIsQ0FBQyxDQUFBO0FBRVUsUUFBQSxRQUFRLEdBQUcsQ0FBQyxVQUFVLEVBQUUsUUFBUSxHQUFHLENBQUM7SUFDM0MsTUFBTSxDQUFDLFlBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO0FBQzNDLENBQUMsQ0FBQSJ9
|
|
||||||
10
dist/npmci.build.d.ts
vendored
10
dist/npmci.build.d.ts
vendored
@@ -1,10 +0,0 @@
|
|||||||
/// <reference types="q" />
|
|
||||||
import * as plugins from './npmci.plugins';
|
|
||||||
/**
|
|
||||||
* defines possible build services
|
|
||||||
*/
|
|
||||||
export declare type TBuildService = 'docker';
|
|
||||||
/**
|
|
||||||
* builds for a specific service
|
|
||||||
*/
|
|
||||||
export declare let build: (commandArg: any) => plugins.q.Promise<any>;
|
|
||||||
98
dist/npmci.build.docker.d.ts
vendored
98
dist/npmci.build.docker.d.ts
vendored
@@ -1,98 +0,0 @@
|
|||||||
/// <reference types="q" />
|
|
||||||
/// <reference types="node" />
|
|
||||||
import * as plugins from './npmci.plugins';
|
|
||||||
/**
|
|
||||||
* builds a cwd of Dockerfiles by triggering a promisechain
|
|
||||||
*/
|
|
||||||
export declare let build: () => plugins.q.Promise<{}>;
|
|
||||||
/**
|
|
||||||
* creates instance of class Dockerfile for all Dockerfiles in cwd
|
|
||||||
* @returns Promise<Dockerfile[]>
|
|
||||||
*/
|
|
||||||
export declare let readDockerfiles: () => plugins.q.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[]) => plugins.q.Promise<Dockerfile[]>;
|
|
||||||
/**
|
|
||||||
* maps local Dockerfiles dependencies to the correspoding Dockerfile class instances
|
|
||||||
*/
|
|
||||||
export declare let mapDockerfiles: (sortedArray: Dockerfile[]) => plugins.q.Promise<Dockerfile[]>;
|
|
||||||
/**
|
|
||||||
* builds the correspoding real docker image for each Dockerfile class instance
|
|
||||||
*/
|
|
||||||
export declare let buildDockerfiles: (sortedArrayArg: Dockerfile[]) => plugins.q.Promise<{}>;
|
|
||||||
/**
|
|
||||||
* pushes the real Dockerfile images to a Docker registry
|
|
||||||
*/
|
|
||||||
export declare let pushDockerfiles: (sortedArrayArg: Dockerfile[]) => plugins.q.Promise<{}>;
|
|
||||||
/**
|
|
||||||
* 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) => plugins.q.Promise<{}>;
|
|
||||||
/**
|
|
||||||
* tests all Dockerfiles in by calling class Dockerfile.test();
|
|
||||||
* @param sortedArrayArg Dockerfile[] that contains all Dockerfiles in cwd
|
|
||||||
*/
|
|
||||||
export declare let testDockerfiles: (sortedArrayArg: Dockerfile[]) => plugins.q.Promise<{}>;
|
|
||||||
/**
|
|
||||||
* class Dockerfile represents a Dockerfile on disk in npmci
|
|
||||||
*/
|
|
||||||
export declare class Dockerfile {
|
|
||||||
filePath: string;
|
|
||||||
repo: string;
|
|
||||||
version: string;
|
|
||||||
cleanTag: string;
|
|
||||||
buildTag: string;
|
|
||||||
testTag: 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(): plugins.q.Promise<{}>;
|
|
||||||
/**
|
|
||||||
* pushes the Dockerfile to a registry
|
|
||||||
*/
|
|
||||||
push(stageArg: any): plugins.q.Promise<{}>;
|
|
||||||
/**
|
|
||||||
* pulls the Dockerfile from a registry
|
|
||||||
*/
|
|
||||||
pull(registryArg: string): void;
|
|
||||||
/**
|
|
||||||
* tests the Dockerfile;
|
|
||||||
*/
|
|
||||||
test(): void;
|
|
||||||
/**
|
|
||||||
* gets the id of a Dockerfile
|
|
||||||
*/
|
|
||||||
getId(): string;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
export declare let dockerFileVersion: (dockerfileNameArg: string) => string;
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
export declare let dockerBaseImage: (dockerfileContentArg: string) => string;
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
export declare let dockerTag: (registryArg: string, repoArg: string, versionArg: string, suffixArg?: string) => string;
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
export declare let cleanTagsArrayFunction: (dockerfileArrayArg: Dockerfile[], trackingArrayArg: Dockerfile[]) => string[];
|
|
||||||
281
dist/npmci.build.docker.js
vendored
281
dist/npmci.build.docker.js
vendored
File diff suppressed because one or more lines are too long
17
dist/npmci.build.js
vendored
17
dist/npmci.build.js
vendored
@@ -1,17 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
const plugins = require("./npmci.plugins");
|
|
||||||
const buildDocker = require("./npmci.build.docker");
|
|
||||||
/**
|
|
||||||
* builds for a specific service
|
|
||||||
*/
|
|
||||||
exports.build = function (commandArg) {
|
|
||||||
switch (commandArg) {
|
|
||||||
case 'docker':
|
|
||||||
return buildDocker.build();
|
|
||||||
default:
|
|
||||||
plugins.beautylog.log('build target ' + commandArg + ' not recognised!');
|
|
||||||
}
|
|
||||||
;
|
|
||||||
return;
|
|
||||||
};
|
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtY2kuYnVpbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9ucG1jaS5idWlsZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMkNBQTBDO0FBRzFDLG9EQUFtRDtBQU9uRDs7R0FFRztBQUNRLFFBQUEsS0FBSyxHQUFHLFVBQVMsVUFBVTtJQUNsQyxNQUFNLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLEtBQUssUUFBUTtZQUNULE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDOUI7WUFDSSxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEdBQUcsVUFBVSxHQUFHLGtCQUFrQixDQUFDLENBQUE7SUFDaEYsQ0FBQztJQUFBLENBQUM7SUFDRixNQUFNLENBQUE7QUFDVixDQUFDLENBQUEifQ==
|
|
||||||
6
dist/npmci.clean.d.ts
vendored
6
dist/npmci.clean.d.ts
vendored
@@ -1,6 +0,0 @@
|
|||||||
/// <reference types="q" />
|
|
||||||
import * as plugins from './npmci.plugins';
|
|
||||||
/**
|
|
||||||
* cleans npmci config files
|
|
||||||
*/
|
|
||||||
export declare let clean: () => plugins.q.Promise<{}>;
|
|
||||||
13
dist/npmci.clean.js
vendored
13
dist/npmci.clean.js
vendored
@@ -1,13 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
const plugins = require("./npmci.plugins");
|
|
||||||
const paths = require("./npmci.paths");
|
|
||||||
/**
|
|
||||||
* cleans npmci config files
|
|
||||||
*/
|
|
||||||
exports.clean = () => {
|
|
||||||
let done = plugins.q.defer();
|
|
||||||
plugins.smartfile.fs.removeSync(paths.NpmciPackageConfig);
|
|
||||||
done.resolve();
|
|
||||||
return done.promise;
|
|
||||||
};
|
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtY2kuY2xlYW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9ucG1jaS5jbGVhbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMkNBQTBDO0FBQzFDLHVDQUFzQztBQUV0Qzs7R0FFRztBQUNRLFFBQUEsS0FBSyxHQUFHO0lBQ2YsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUM1QixPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUE7SUFDekQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7QUFDdkIsQ0FBQyxDQUFBIn0=
|
|
||||||
3
dist/npmci.command.d.ts
vendored
3
dist/npmci.command.d.ts
vendored
@@ -1,3 +0,0 @@
|
|||||||
/// <reference types="q" />
|
|
||||||
import * as plugins from './npmci.plugins';
|
|
||||||
export declare let command: () => plugins.q.Promise<{}>;
|
|
||||||
18
dist/npmci.command.js
vendored
18
dist/npmci.command.js
vendored
@@ -1,18 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
const plugins = require("./npmci.plugins");
|
|
||||||
const npmci_bash_1 = require("./npmci.bash");
|
|
||||||
exports.command = () => {
|
|
||||||
let done = plugins.q.defer();
|
|
||||||
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 + ' ';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
npmci_bash_1.bash(wrappedCommand);
|
|
||||||
done.resolve();
|
|
||||||
return done.promise;
|
|
||||||
};
|
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtY2kuY29tbWFuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL25wbWNpLmNvbW1hbmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDJDQUEwQztBQUMxQyw2Q0FBaUM7QUFFdEIsUUFBQSxPQUFPLEdBQUc7SUFDakIsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUM1QixJQUFJLGNBQWMsR0FBVyxFQUFFLENBQUE7SUFDL0IsSUFBSSxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQTtJQUM1QixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN4QyxjQUFjLEdBQUcsY0FBYyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUM5QyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQUMsY0FBYyxHQUFHLGNBQWMsR0FBRyxHQUFHLENBQUE7UUFBQyxDQUFDO0lBQzdFLENBQUM7SUFDRCxpQkFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO0lBQ3BCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFBO0FBQ3ZCLENBQUMsQ0FBQSJ9
|
|
||||||
6
dist/npmci.config.d.ts
vendored
6
dist/npmci.config.d.ts
vendored
@@ -1,6 +0,0 @@
|
|||||||
/// <reference types="q" />
|
|
||||||
import * as q from 'q';
|
|
||||||
export interface INpmciOptions {
|
|
||||||
globalNpmTools: string[];
|
|
||||||
}
|
|
||||||
export declare let getConfig: () => q.Promise<INpmciOptions>;
|
|
||||||
15
dist/npmci.config.js
vendored
15
dist/npmci.config.js
vendored
@@ -1,15 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
const q = require("q");
|
|
||||||
const plugins = require("./npmci.plugins");
|
|
||||||
const paths = require("./npmci.paths");
|
|
||||||
exports.getConfig = () => {
|
|
||||||
let done = q.defer();
|
|
||||||
let npmciNpmextra = new plugins.npmextra.Npmextra(paths.cwd);
|
|
||||||
let defaultConfig = {
|
|
||||||
globalNpmTools: []
|
|
||||||
};
|
|
||||||
let npmciConfig = npmciNpmextra.dataFor('npmci', defaultConfig);
|
|
||||||
done.resolve(npmciConfig);
|
|
||||||
return done.promise;
|
|
||||||
};
|
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtY2kuY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvbnBtY2kuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx1QkFBc0I7QUFFdEIsMkNBQTBDO0FBQzFDLHVDQUFzQztBQU0zQixRQUFBLFNBQVMsR0FBRztJQUNuQixJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFpQixDQUFBO0lBQ25DLElBQUksYUFBYSxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQzVELElBQUksYUFBYSxHQUFrQjtRQUMvQixjQUFjLEVBQUUsRUFBRTtLQUNyQixDQUFBO0lBQ0QsSUFBSSxXQUFXLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBZ0IsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFBO0lBQzlFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDekIsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7QUFDdkIsQ0FBQyxDQUFBIn0=
|
|
||||||
15
dist/npmci.env.d.ts
vendored
15
dist/npmci.env.d.ts
vendored
@@ -1,15 +0,0 @@
|
|||||||
import { GitRepo } from 'smartstring';
|
|
||||||
import { Dockerfile } from './npmci.build.docker';
|
|
||||||
export declare let repo: GitRepo;
|
|
||||||
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[];
|
|
||||||
export declare let config: {
|
|
||||||
dockerRegistry: any;
|
|
||||||
dockerFilesBuilt: Dockerfile[];
|
|
||||||
dockerFiles: Dockerfile[];
|
|
||||||
project: any;
|
|
||||||
};
|
|
||||||
export declare let configStore: () => void;
|
|
||||||
48
dist/npmci.env.js
vendored
48
dist/npmci.env.js
vendored
@@ -1,48 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
const plugins = require("./npmci.plugins");
|
|
||||||
const paths = require("./npmci.paths");
|
|
||||||
const smartstring_1 = require("smartstring");
|
|
||||||
if (process.env.CI_BUILD_REPO)
|
|
||||||
exports.repo = new smartstring_1.GitRepo(process.env.CI_BUILD_REPO);
|
|
||||||
exports.buildStage = process.env.CI_BUILD_STAGE;
|
|
||||||
exports.setDockerRegistry = (dockerRegistryArg) => {
|
|
||||||
exports.dockerRegistry = dockerRegistryArg;
|
|
||||||
};
|
|
||||||
exports.dockerFilesBuilt = [];
|
|
||||||
exports.dockerFiles = [];
|
|
||||||
exports.config = {
|
|
||||||
dockerRegistry: undefined,
|
|
||||||
dockerFilesBuilt: exports.dockerFilesBuilt,
|
|
||||||
dockerFiles: exports.dockerFiles,
|
|
||||||
project: undefined
|
|
||||||
};
|
|
||||||
exports.configStore = () => {
|
|
||||||
exports.config.dockerRegistry = exports.dockerRegistry;
|
|
||||||
plugins.smartfile.memory.toFsSync(JSON.stringify(exports.config), paths.NpmciPackageConfig);
|
|
||||||
};
|
|
||||||
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtY2kuZW52LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvbnBtY2kuZW52LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwyQ0FBMEM7QUFDMUMsdUNBQXNDO0FBQ3RDLDZDQUFtQztBQUluQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQztJQUFDLFlBQUksR0FBRyxJQUFJLHFCQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtBQUVqRSxRQUFBLFVBQVUsR0FBVyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQTtBQUkvQyxRQUFBLGlCQUFpQixHQUFHLENBQUMsaUJBQXlCO0lBQ3JELHNCQUFjLEdBQUcsaUJBQWlCLENBQUE7QUFDdEMsQ0FBQyxDQUFBO0FBQ1UsUUFBQSxnQkFBZ0IsR0FBaUIsRUFBRSxDQUFBO0FBQ25DLFFBQUEsV0FBVyxHQUFpQixFQUFFLENBQUE7QUFDOUIsUUFBQSxNQUFNLEdBQUc7SUFDaEIsY0FBYyxFQUFFLFNBQVM7SUFDekIsZ0JBQWdCLEVBQUUsd0JBQWdCO0lBQ2xDLFdBQVcsRUFBRSxtQkFBVztJQUN4QixPQUFPLEVBQUUsU0FBUztDQUNyQixDQUFBO0FBRVUsUUFBQSxXQUFXLEdBQUc7SUFDckIsY0FBTSxDQUFDLGNBQWMsR0FBRyxzQkFBYyxDQUFBO0lBQ3RDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFNLENBQUMsRUFDdEIsS0FBSyxDQUFDLGtCQUFrQixDQUMzQixDQUFBO0FBQ0wsQ0FBQyxDQUFBO0FBRUQsSUFBSSxVQUFVLEdBQUc7SUFDYix1RUFBdUU7SUFDdkUsSUFBSSxDQUFDO1FBQ0QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBTSxFQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtJQUNwRyxDQUNBO0lBQUEsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNULG1CQUFXLEVBQUUsQ0FBQTtRQUNiLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUE7SUFDaEQsQ0FBQztJQUVELGlCQUFpQjtJQUNqQixJQUFJLENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLGNBQU0sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUMsWUFBWSxDQUFDLENBQUE7WUFDdEYsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtRQUNqRCxDQUFDO1FBQUEsQ0FBQztJQUNOLENBQ0E7SUFBQSxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ1QsY0FBTSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUE7UUFDbkIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsZ0VBQWdFLENBQUMsQ0FBQTtJQUMzRixDQUFDO0lBRUQsY0FBTSxDQUFDLGNBQWMsR0FBRyxzQkFBYyxHQUFHLGNBQU0sQ0FBQyxjQUFjLEdBQUcsS0FBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3hFLGNBQU0sQ0FBQyxnQkFBZ0IsR0FBRyx3QkFBZ0IsR0FBRyxjQUFNLENBQUMsZ0JBQWdCLEdBQUcsS0FBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ2xGLENBQUMsQ0FBQTtBQUNELFVBQVUsRUFBRSxDQUFBIn0=
|
|
||||||
3
dist/npmci.install.d.ts
vendored
3
dist/npmci.install.d.ts
vendored
@@ -1,3 +0,0 @@
|
|||||||
/// <reference types="q" />
|
|
||||||
import * as plugins from './npmci.plugins';
|
|
||||||
export declare let install: (versionArg: any) => plugins.q.Promise<{}>;
|
|
||||||
51
dist/npmci.install.js
vendored
51
dist/npmci.install.js
vendored
@@ -1,51 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
const plugins = require("./npmci.plugins");
|
|
||||||
const configModule = require("./npmci.config");
|
|
||||||
const npmci_bash_1 = require("./npmci.bash");
|
|
||||||
const npmci_bash_2 = require("./npmci.bash");
|
|
||||||
exports.install = (versionArg) => {
|
|
||||||
let done = plugins.q.defer();
|
|
||||||
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 (npmci_bash_2.nvmAvailable) {
|
|
||||||
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!');
|
|
||||||
}
|
|
||||||
;
|
|
||||||
npmci_bash_1.bash('node -v');
|
|
||||||
npmci_bash_1.bash('npm -v');
|
|
||||||
// lets look for further config
|
|
||||||
configModule.getConfig()
|
|
||||||
.then(config => {
|
|
||||||
for (let npmTool of config.globalNpmTools) {
|
|
||||||
let whichOutput = npmci_bash_1.bash(`which ${npmTool}`);
|
|
||||||
let toolAvailable = !(/not found/.test(whichOutput));
|
|
||||||
if (toolAvailable) {
|
|
||||||
plugins.beautylog.log(`Tool ${npmTool} is available`);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
plugins.beautylog.info(`globally installing ${npmTool} from npm`);
|
|
||||||
npmci_bash_1.bash(`npm install -q -g ${npmTool}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
done.resolve();
|
|
||||||
});
|
|
||||||
return done.promise;
|
|
||||||
};
|
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtY2kuaW5zdGFsbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL25wbWNpLmluc3RhbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDJDQUEwQztBQUMxQywrQ0FBOEM7QUFDOUMsNkNBQW1DO0FBQ25DLDZDQUEyQztBQUNoQyxRQUFBLE9BQU8sR0FBRyxDQUFDLFVBQVU7SUFDNUIsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUM1QixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsVUFBVSxFQUFFLENBQUMsQ0FBQTtJQUNsRSxJQUFJLE9BQWUsQ0FBQTtJQUNuQixFQUFFLENBQUMsQ0FBQyxVQUFVLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztRQUMxQixPQUFPLEdBQUcsUUFBUSxDQUFBO0lBQ3RCLENBQUM7SUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDOUIsT0FBTyxHQUFHLEdBQUcsQ0FBQTtJQUNqQixDQUFDO0lBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLE9BQU8sR0FBRyxHQUFHLENBQUE7SUFDakIsQ0FBQztJQUFDLElBQUksQ0FBQyxDQUFDO1FBQ0osT0FBTyxHQUFHLFVBQVUsQ0FBQTtJQUN4QixDQUFDO0lBQUEsQ0FBQztJQUNGLEVBQUUsQ0FBQyxDQUFDLHlCQUFZLENBQUMsQ0FBQyxDQUFDO1FBQ2YsaUJBQUksQ0FBQyxlQUFlLE9BQU8seUJBQXlCLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDOUQsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLE9BQU8sMEJBQTBCLENBQUMsQ0FBQTtJQUNoRixDQUFDO0lBQUMsSUFBSSxDQUFDLENBQUM7UUFDSixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyx1REFBdUQsQ0FBQyxDQUFBO0lBQ25GLENBQUM7SUFBQSxDQUFDO0lBQ0YsaUJBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUNmLGlCQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7SUFFZCwrQkFBK0I7SUFDL0IsWUFBWSxDQUFDLFNBQVMsRUFBRTtTQUNuQixJQUFJLENBQUMsTUFBTTtRQUNSLEdBQUcsQ0FBQyxDQUFDLElBQUksT0FBTyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLElBQUksV0FBVyxHQUFHLGlCQUFJLENBQUMsU0FBUyxPQUFPLEVBQUUsQ0FBQyxDQUFBO1lBQzFDLElBQUksYUFBYSxHQUFZLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUE7WUFDN0QsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDaEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxPQUFPLGVBQWUsQ0FBQyxDQUFBO1lBQ3pELENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDSixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsT0FBTyxXQUFXLENBQUMsQ0FBQTtnQkFDakUsaUJBQUksQ0FBQyxxQkFBcUIsT0FBTyxFQUFFLENBQUMsQ0FBQTtZQUN4QyxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUNsQixDQUFDLENBQUMsQ0FBQTtJQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFBO0FBQ3ZCLENBQUMsQ0FBQSJ9
|
|
||||||
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;
|
|
||||||
8
dist/npmci.paths.js
vendored
8
dist/npmci.paths.js
vendored
@@ -1,8 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtY2kucGF0aHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9ucG1jaS5wYXRocy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMkNBQTBDO0FBRS9CLFFBQUEsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQTtBQUVuQixRQUFBLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBQyxLQUFLLENBQUMsQ0FBQTtBQUNyRCxRQUFBLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUFnQixFQUFDLGVBQWUsQ0FBQyxDQUFBO0FBQ3hFLFFBQUEsZUFBZSxHQUFHLFdBQUcsQ0FBQTtBQUNyQixRQUFBLFlBQVksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFHLEVBQUMsUUFBUSxDQUFDLENBQUEifQ==
|
|
||||||
17
dist/npmci.plugins.d.ts
vendored
17
dist/npmci.plugins.d.ts
vendored
@@ -1,17 +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('q');
|
|
||||||
export declare let request: any;
|
|
||||||
export import shelljs = require('shelljs');
|
|
||||||
export import smartcli = require('smartcli');
|
|
||||||
export import smartfile = require('smartfile');
|
|
||||||
export import smartparam = require('smartparam');
|
|
||||||
export import smartsocket = require('smartsocket');
|
|
||||||
export import smartssh = require('smartssh');
|
|
||||||
export import smartstring = require('smartstring');
|
|
||||||
export import through2 = require('through2');
|
|
||||||
19
dist/npmci.plugins.js
vendored
19
dist/npmci.plugins.js
vendored
@@ -1,19 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
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("q");
|
|
||||||
exports.request = require('request');
|
|
||||||
exports.shelljs = require("shelljs");
|
|
||||||
exports.smartcli = require("smartcli");
|
|
||||||
exports.smartfile = require("smartfile");
|
|
||||||
exports.smartparam = require("smartparam");
|
|
||||||
exports.smartsocket = require("smartsocket");
|
|
||||||
exports.smartssh = require("smartssh");
|
|
||||||
exports.smartstring = require("smartstring");
|
|
||||||
exports.through2 = require("through2");
|
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtY2kucGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL25wbWNpLnBsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHlDQUE4QztBQUNuQyxRQUFBLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUE7QUFDakMsZ0RBQXFEO0FBQ3JELG1DQUF3QztBQUN4Qyx1Q0FBNEM7QUFDNUMsK0JBQW9DO0FBQ3BDLDZDQUFrRDtBQUNsRCx5QkFBOEI7QUFDbkIsUUFBQSxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0FBQ3ZDLHFDQUEwQztBQUMxQyx1Q0FBNEM7QUFDNUMseUNBQThDO0FBQzlDLDJDQUFnRDtBQUNoRCw2Q0FBa0Q7QUFDbEQsdUNBQTRDO0FBQzVDLDZDQUFrRDtBQUNsRCx1Q0FBNEMifQ==
|
|
||||||
11
dist/npmci.prepare.d.ts
vendored
11
dist/npmci.prepare.d.ts
vendored
@@ -1,11 +0,0 @@
|
|||||||
/// <reference types="q" />
|
|
||||||
import * as plugins from './npmci.plugins';
|
|
||||||
/**
|
|
||||||
* defines possible prepare services
|
|
||||||
*/
|
|
||||||
export declare type TPrepService = 'npm' | 'docker' | 'docker-gitlab' | 'ssh';
|
|
||||||
/**
|
|
||||||
* the main exported prepare function
|
|
||||||
* @param servieArg describes the service to prepare
|
|
||||||
*/
|
|
||||||
export declare let prepare: (serviceArg: TPrepService) => plugins.q.Promise<{}>;
|
|
||||||
80
dist/npmci.prepare.js
vendored
80
dist/npmci.prepare.js
vendored
@@ -1,80 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
const plugins = require("./npmci.plugins");
|
|
||||||
const env = require("./npmci.env");
|
|
||||||
const sshModule = require("./npmci.ssh");
|
|
||||||
/**
|
|
||||||
* authenticates npm with token from env var
|
|
||||||
*/
|
|
||||||
let npm = function () {
|
|
||||||
let done = plugins.q.defer();
|
|
||||||
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');
|
|
||||||
done.resolve();
|
|
||||||
return done.promise;
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* logs in docker
|
|
||||||
*/
|
|
||||||
let docker = function () {
|
|
||||||
let done = plugins.q.defer();
|
|
||||||
env.setDockerRegistry('docker.io');
|
|
||||||
let dockerRegex = /^([a-zA-Z0-9\.]*)\|([a-zA-Z0-9\.]*)/;
|
|
||||||
if (!process.env.NPMCI_LOGIN_DOCKER) {
|
|
||||||
plugins.beautylog.error('You have to specify Login Data to the Docker Registry');
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
plugins.shelljs.exec('docker login -u gitlab-ci-token -p ' + process.env.CI_BUILD_TOKEN + ' ' + 'registry.gitlab.com'); // Always also login to GitLab Registry
|
|
||||||
let dockerRegexResultArray = dockerRegex.exec(process.env.NPMCI_LOGIN_DOCKER);
|
|
||||||
let username = dockerRegexResultArray[1];
|
|
||||||
let password = dockerRegexResultArray[2];
|
|
||||||
plugins.shelljs.exec('docker login -u ' + username + ' -p ' + password);
|
|
||||||
done.resolve();
|
|
||||||
return done.promise;
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* prepare docker for gitlab registry
|
|
||||||
*/
|
|
||||||
let dockerGitlab = function () {
|
|
||||||
let done = plugins.q.defer();
|
|
||||||
env.setDockerRegistry('registry.gitlab.com');
|
|
||||||
plugins.shelljs.exec('docker login -u gitlab-ci-token -p ' + process.env.CI_BUILD_TOKEN + ' ' + 'registry.gitlab.com');
|
|
||||||
done.resolve();
|
|
||||||
return done.promise;
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* prepare ssh
|
|
||||||
*/
|
|
||||||
let ssh = function () {
|
|
||||||
let done = plugins.q.defer();
|
|
||||||
sshModule.ssh()
|
|
||||||
.then(done.resolve);
|
|
||||||
return done.promise;
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* the main exported prepare function
|
|
||||||
* @param servieArg describes the service to prepare
|
|
||||||
*/
|
|
||||||
exports.prepare = function (serviceArg) {
|
|
||||||
switch (serviceArg) {
|
|
||||||
case 'npm':
|
|
||||||
return npm();
|
|
||||||
case 'docker':
|
|
||||||
return docker();
|
|
||||||
case 'docker-gitlab':
|
|
||||||
return dockerGitlab();
|
|
||||||
case 'ssh':
|
|
||||||
return ssh();
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtY2kucHJlcGFyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL25wbWNpLnByZXBhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDJDQUEwQztBQUUxQyxtQ0FBa0M7QUFDbEMseUNBQXdDO0FBVXhDOztHQUVHO0FBQ0gsSUFBSSxHQUFHLEdBQUc7SUFDTixJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFBO0lBRTVCLElBQUksV0FBVyxHQUFXLG1DQUFtQyxDQUFBO0lBQzdELElBQUksUUFBUSxHQUFXLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFBO0lBQ2xELElBQUksZUFBZSxHQUFHLFdBQVcsR0FBRyxRQUFRLENBQUE7SUFFNUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNYLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUE7SUFDaEQsQ0FBQztJQUFDLElBQUksQ0FBQyxDQUFDO1FBQ0osT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQTtRQUMxRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ25CLENBQUM7SUFDRCxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFDLGNBQWMsQ0FBQyxDQUFBO0lBQ2pFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFBO0FBQ3ZCLENBQUMsQ0FBQTtBQUVEOztHQUVHO0FBQ0gsSUFBSSxNQUFNLEdBQUc7SUFDVCxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQzVCLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUNsQyxJQUFJLFdBQVcsR0FBRyxxQ0FBcUMsQ0FBQTtJQUN2RCxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUE7UUFDaEYsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNuQixDQUFDO0lBQ0QsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMscUNBQXFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEdBQUcsR0FBRyxHQUFHLHFCQUFxQixDQUFDLENBQUEsQ0FBQyx1Q0FBdUM7SUFDOUosSUFBSSxzQkFBc0IsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtJQUM3RSxJQUFJLFFBQVEsR0FBRyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN4QyxJQUFJLFFBQVEsR0FBRyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN4QyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxRQUFRLEdBQUcsTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFBO0lBQ3ZFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFBO0FBQ3ZCLENBQUMsQ0FBQTtBQUVEOztHQUVHO0FBQ0gsSUFBSSxZQUFZLEdBQUc7SUFDZixJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQzVCLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO0lBQzVDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHFDQUFxQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxHQUFHLEdBQUcsR0FBRyxxQkFBcUIsQ0FBQyxDQUFBO0lBQ3RILElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFBO0FBQ3ZCLENBQUMsQ0FBQTtBQUVEOztHQUVHO0FBQ0gsSUFBSSxHQUFHLEdBQUc7SUFDTixJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQzVCLFNBQVMsQ0FBQyxHQUFHLEVBQUU7U0FDVixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3ZCLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFBO0FBQ3ZCLENBQUMsQ0FBQTtBQUVEOzs7R0FHRztBQUNRLFFBQUEsT0FBTyxHQUFHLFVBQVMsVUFBd0I7SUFDbEQsTUFBTSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUNqQixLQUFLLEtBQUs7WUFDTixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUE7UUFDaEIsS0FBSyxRQUFRO1lBQ1QsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFBO1FBQ25CLEtBQUssZUFBZTtZQUNoQixNQUFNLENBQUMsWUFBWSxFQUFFLENBQUE7UUFDekIsS0FBSyxLQUFLO1lBQ04sTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBQ2hCO1lBQ0ksS0FBSyxDQUFBO0lBQ2IsQ0FBQztBQUNMLENBQUMsQ0FBQSJ9
|
|
||||||
11
dist/npmci.publish.d.ts
vendored
11
dist/npmci.publish.d.ts
vendored
@@ -1,11 +0,0 @@
|
|||||||
/// <reference types="q" />
|
|
||||||
import * as plugins from './npmci.plugins';
|
|
||||||
/**
|
|
||||||
* type of supported services
|
|
||||||
*/
|
|
||||||
export declare type TPubService = 'npm' | 'docker';
|
|
||||||
/**
|
|
||||||
* the main exported publish function.
|
|
||||||
* @param pubServiceArg references targeted service to publish to
|
|
||||||
*/
|
|
||||||
export declare let publish: (pubServiceArg?: TPubService) => plugins.q.Promise<{}>;
|
|
||||||
42
dist/npmci.publish.js
vendored
42
dist/npmci.publish.js
vendored
@@ -1,42 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
const plugins = require("./npmci.plugins");
|
|
||||||
const npmci_prepare_1 = require("./npmci.prepare");
|
|
||||||
const npmci_bash_1 = require("./npmci.bash");
|
|
||||||
const NpmciBuildDocker = require("./npmci.build.docker");
|
|
||||||
/**
|
|
||||||
* the main exported publish function.
|
|
||||||
* @param pubServiceArg references targeted service to publish to
|
|
||||||
*/
|
|
||||||
exports.publish = (pubServiceArg = 'npm') => {
|
|
||||||
switch (pubServiceArg) {
|
|
||||||
case 'npm':
|
|
||||||
return publishNpm();
|
|
||||||
case 'docker':
|
|
||||||
return publishDocker();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* tries to publish current cwd to NPM registry
|
|
||||||
*/
|
|
||||||
let publishNpm = function () {
|
|
||||||
let done = plugins.q.defer();
|
|
||||||
npmci_prepare_1.prepare('npm')
|
|
||||||
.then(function () {
|
|
||||||
npmci_bash_1.bash('npm publish');
|
|
||||||
plugins.beautylog.ok('Done!');
|
|
||||||
done.resolve();
|
|
||||||
});
|
|
||||||
return done.promise;
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* tries to pubish current cwd to Docker registry
|
|
||||||
*/
|
|
||||||
let publishDocker = function () {
|
|
||||||
let done = plugins.q.defer();
|
|
||||||
NpmciBuildDocker.readDockerfiles()
|
|
||||||
.then(NpmciBuildDocker.pullDockerfileImages)
|
|
||||||
.then(NpmciBuildDocker.pushDockerfiles)
|
|
||||||
.then(done.resolve);
|
|
||||||
return done.promise;
|
|
||||||
};
|
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtY2kucHVibGlzaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL25wbWNpLnB1Ymxpc2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDJDQUEwQztBQUMxQyxtREFBdUM7QUFDdkMsNkNBQWlDO0FBRWpDLHlEQUF3RDtBQU94RDs7O0dBR0c7QUFDUSxRQUFBLE9BQU8sR0FBRyxDQUFDLGdCQUE2QixLQUFLO0lBQ3BELE1BQU0sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDcEIsS0FBSyxLQUFLO1lBQ04sTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFBO1FBQ3ZCLEtBQUssUUFBUTtZQUNULE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQTtJQUM5QixDQUFDO0FBQ0wsQ0FBQyxDQUFBO0FBRUQ7O0dBRUc7QUFDSCxJQUFJLFVBQVUsR0FBSTtJQUNkLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUE7SUFDNUIsdUJBQU8sQ0FBQyxLQUFLLENBQUM7U0FDVCxJQUFJLENBQUM7UUFDRixpQkFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQ25CLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzdCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUNsQixDQUFDLENBQUMsQ0FBQTtJQUNQLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFBO0FBQ3RCLENBQUMsQ0FBQTtBQUVEOztHQUVHO0FBQ0gsSUFBSSxhQUFhLEdBQUc7SUFDaEIsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUN4QixnQkFBZ0IsQ0FBQyxlQUFlLEVBQUU7U0FDakMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDO1NBQzNDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUM7U0FDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtBQUN2QixDQUFDLENBQUEifQ==
|
|
||||||
4
dist/npmci.servezone.d.ts
vendored
4
dist/npmci.servezone.d.ts
vendored
@@ -1,4 +0,0 @@
|
|||||||
/**
|
|
||||||
* the main run function to submit a service to a servezone
|
|
||||||
*/
|
|
||||||
export declare let run: (configArg: any) => void;
|
|
||||||
28
dist/npmci.servezone.js
vendored
28
dist/npmci.servezone.js
vendored
@@ -1,28 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
const plugins = require("./npmci.plugins");
|
|
||||||
/**
|
|
||||||
* servezoneRegex is the regex that parses the servezone connection data
|
|
||||||
* parses strings in the form of "servezone.example.com|3000|somepassword"
|
|
||||||
*/
|
|
||||||
let servezoneRegex = /^(.*)\|(.*)\|(.*)/;
|
|
||||||
/**
|
|
||||||
* holds the results of the parsed servezone env string
|
|
||||||
*/
|
|
||||||
let servezoneRegexResultArray = servezoneRegex.exec(process.env.NPMCI_SERVEZONE);
|
|
||||||
/**
|
|
||||||
* the data object that is used for the smartsocket client object
|
|
||||||
*/
|
|
||||||
let smartsocketClientConstructorOptions = {
|
|
||||||
alias: 'npmci',
|
|
||||||
password: servezoneRegexResultArray[3],
|
|
||||||
port: parseInt(servezoneRegexResultArray[2]),
|
|
||||||
role: 'ci',
|
|
||||||
url: servezoneRegexResultArray[1]
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* the main run function to submit a service to a servezone
|
|
||||||
*/
|
|
||||||
exports.run = (configArg) => {
|
|
||||||
new plugins.smartsocket.SmartsocketClient(smartsocketClientConstructorOptions);
|
|
||||||
};
|
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtY2kuc2VydmV6b25lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvbnBtY2kuc2VydmV6b25lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwyQ0FBMEM7QUFFMUM7OztHQUdHO0FBQ0gsSUFBSSxjQUFjLEdBQUcsbUJBQW1CLENBQUE7QUFFeEM7O0dBRUc7QUFDSCxJQUFJLHlCQUF5QixHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQTtBQUVoRjs7R0FFRztBQUNILElBQUksbUNBQW1DLEdBQUc7SUFDdEMsS0FBSyxFQUFFLE9BQU87SUFDZCxRQUFRLEVBQUUseUJBQXlCLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLElBQUksRUFBRSxRQUFRLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUMsSUFBSSxFQUFFLElBQUk7SUFDVixHQUFHLEVBQUUseUJBQXlCLENBQUMsQ0FBQyxDQUFDO0NBQ3BDLENBQUE7QUFFRDs7R0FFRztBQUNRLFFBQUEsR0FBRyxHQUFHLENBQUMsU0FBUztJQUN2QixJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQ3JDLG1DQUFtQyxDQUN0QyxDQUFBO0FBQ0wsQ0FBQyxDQUFBIn0=
|
|
||||||
6
dist/npmci.ssh.d.ts
vendored
6
dist/npmci.ssh.d.ts
vendored
@@ -1,6 +0,0 @@
|
|||||||
/// <reference types="q" />
|
|
||||||
import * as plugins from './npmci.plugins';
|
|
||||||
/**
|
|
||||||
* checks for ENV vars in form of NPMCI_SSHKEY_* and deploys any found ones
|
|
||||||
*/
|
|
||||||
export declare let ssh: () => plugins.q.Promise<{}>;
|
|
||||||
51
dist/npmci.ssh.js
vendored
51
dist/npmci.ssh.js
vendored
@@ -1,51 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
const plugins = require("./npmci.plugins");
|
|
||||||
let sshRegex = /^(.*)\|(.*)\|(.*)/;
|
|
||||||
let sshInstance;
|
|
||||||
/**
|
|
||||||
* checks for ENV vars in form of NPMCI_SSHKEY_* and deploys any found ones
|
|
||||||
*/
|
|
||||||
exports.ssh = () => {
|
|
||||||
let done = plugins.q.defer();
|
|
||||||
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!');
|
|
||||||
}
|
|
||||||
;
|
|
||||||
done.resolve();
|
|
||||||
return done.promise;
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* gets called for each found SSH ENV Var and deploys it
|
|
||||||
*/
|
|
||||||
let evaluateSshEnv = (sshkeyEnvVarArg) => {
|
|
||||||
let resultArray = sshRegex.exec(sshkeyEnvVarArg);
|
|
||||||
let sshKey = new plugins.smartssh.SshKey();
|
|
||||||
plugins.beautylog.info('Found SSH identity for ' + resultArray[1]);
|
|
||||||
if (notUndefined(resultArray[1])) {
|
|
||||||
plugins.beautylog.log('---> host defined!');
|
|
||||||
sshKey.host = resultArray[1];
|
|
||||||
}
|
|
||||||
if (notUndefined(resultArray[2])) {
|
|
||||||
plugins.beautylog.log('---> privKey defined!');
|
|
||||||
sshKey.privKeyBase64 = resultArray[2];
|
|
||||||
}
|
|
||||||
;
|
|
||||||
if (notUndefined(resultArray[3])) {
|
|
||||||
'---> pubKey defined!';
|
|
||||||
sshKey.pubKeyBase64 = resultArray[3];
|
|
||||||
}
|
|
||||||
;
|
|
||||||
sshInstance.addKey(sshKey);
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* checks if not undefined
|
|
||||||
*/
|
|
||||||
let notUndefined = (stringArg) => {
|
|
||||||
return (stringArg && stringArg !== 'undefined' && stringArg !== '##');
|
|
||||||
};
|
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtY2kuc3NoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvbnBtY2kuc3NoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwyQ0FBMEM7QUFFMUMsSUFBSSxRQUFRLEdBQUcsbUJBQW1CLENBQUE7QUFDbEMsSUFBSSxXQUF5QyxDQUFBO0FBRTdDOztHQUVHO0FBQ1EsUUFBQSxHQUFHLEdBQUc7SUFDYixJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQzVCLFdBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUEsQ0FBQyxvQkFBb0I7SUFDckUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFDLGdCQUFnQixFQUFDLGNBQWMsQ0FBQyxDQUFBO0lBQ2hGLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQzFCLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUM3QixDQUFDO0lBQUMsSUFBSSxDQUFDLENBQUM7UUFDSixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxnREFBZ0QsQ0FBQyxDQUFBO0lBQzNFLENBQUM7SUFBQSxDQUFDO0lBQ0YsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7QUFDdkIsQ0FBQyxDQUFBO0FBRUQ7O0dBRUc7QUFDSCxJQUFJLGNBQWMsR0FBRyxDQUFDLGVBQWU7SUFDakMsSUFBSSxXQUFXLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUNoRCxJQUFJLE1BQU0sR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUE7SUFDMUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMseUJBQXlCLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDbEUsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1FBQzNDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2hDLENBQUM7SUFDRCxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLENBQUE7UUFDOUMsTUFBTSxDQUFDLGFBQWEsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDekMsQ0FBQztJQUFBLENBQUM7SUFDRixFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLHNCQUFzQixDQUFBO1FBQ3RCLE1BQU0sQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3hDLENBQUM7SUFBQSxDQUFDO0lBRUYsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUM5QixDQUFDLENBQUE7QUFFRDs7R0FFRztBQUNILElBQUksWUFBWSxHQUFHLENBQUMsU0FBaUI7SUFDakMsTUFBTSxDQUFDLENBQUMsU0FBUyxJQUFJLFNBQVMsS0FBSyxXQUFXLElBQUksU0FBUyxLQUFLLElBQUksQ0FBQyxDQUFBO0FBQ3pFLENBQUMsQ0FBQSJ9
|
|
||||||
3
dist/npmci.test.d.ts
vendored
3
dist/npmci.test.d.ts
vendored
@@ -1,3 +0,0 @@
|
|||||||
/// <reference types="q" />
|
|
||||||
import * as plugins from './npmci.plugins';
|
|
||||||
export declare let test: (versionArg: any) => plugins.q.Promise<{}>;
|
|
||||||
46
dist/npmci.test.js
vendored
46
dist/npmci.test.js
vendored
@@ -1,46 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
const plugins = require("./npmci.plugins");
|
|
||||||
const npmci_bash_1 = require("./npmci.bash");
|
|
||||||
const npmci_install_1 = require("./npmci.install");
|
|
||||||
const NpmciBuildDocker = require("./npmci.build.docker");
|
|
||||||
exports.test = (versionArg) => {
|
|
||||||
let done = plugins.q.defer();
|
|
||||||
if (versionArg === 'docker') {
|
|
||||||
testDocker()
|
|
||||||
.then(() => {
|
|
||||||
done.resolve();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
npmci_install_1.install(versionArg)
|
|
||||||
.then(npmDependencies)
|
|
||||||
.then(npmTest)
|
|
||||||
.then(() => {
|
|
||||||
done.resolve();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return done.promise;
|
|
||||||
};
|
|
||||||
let npmDependencies = function () {
|
|
||||||
let done = plugins.q.defer();
|
|
||||||
plugins.beautylog.info('now installing dependencies:');
|
|
||||||
npmci_bash_1.bash('npm install');
|
|
||||||
done.resolve();
|
|
||||||
return done.promise;
|
|
||||||
};
|
|
||||||
let npmTest = () => {
|
|
||||||
let done = plugins.q.defer();
|
|
||||||
plugins.beautylog.info('now starting tests:');
|
|
||||||
npmci_bash_1.bash('npm test');
|
|
||||||
done.resolve();
|
|
||||||
return done.promise;
|
|
||||||
};
|
|
||||||
let testDocker = function () {
|
|
||||||
let done = plugins.q.defer();
|
|
||||||
NpmciBuildDocker.readDockerfiles()
|
|
||||||
.then(NpmciBuildDocker.pullDockerfileImages)
|
|
||||||
.then(NpmciBuildDocker.testDockerfiles)
|
|
||||||
.then(done.resolve);
|
|
||||||
return done.promise;
|
|
||||||
};
|
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtY2kudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL25wbWNpLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDJDQUEwQztBQUMxQyw2Q0FBaUM7QUFDakMsbURBQXVDO0FBRXZDLHlEQUF3RDtBQUU3QyxRQUFBLElBQUksR0FBRyxDQUFDLFVBQVU7SUFDekIsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUM1QixFQUFFLENBQUMsQ0FBQyxVQUFVLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztRQUMxQixVQUFVLEVBQUU7YUFDUCxJQUFJLENBQUM7WUFDRixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDbEIsQ0FBQyxDQUFDLENBQUE7SUFDVixDQUFDO0lBQUMsSUFBSSxDQUFDLENBQUM7UUFDSix1QkFBTyxDQUFDLFVBQVUsQ0FBQzthQUNkLElBQUksQ0FBQyxlQUFlLENBQUM7YUFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQzthQUNiLElBQUksQ0FBQztZQUNGLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUNsQixDQUFDLENBQUMsQ0FBQTtJQUNWLENBQUM7SUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtBQUN2QixDQUFDLENBQUE7QUFFRCxJQUFJLGVBQWUsR0FBRztJQUNsQixJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQzVCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLENBQUE7SUFDdEQsaUJBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUNuQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDZCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtBQUN2QixDQUFDLENBQUE7QUFFRCxJQUFJLE9BQU8sR0FBRztJQUNWLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUE7SUFDNUIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQTtJQUM3QyxpQkFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ2hCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFBO0FBQ3ZCLENBQUMsQ0FBQTtBQUVELElBQUksVUFBVSxHQUFHO0lBQ2IsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUM1QixnQkFBZ0IsQ0FBQyxlQUFlLEVBQUU7U0FDN0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDO1NBQzNDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUM7U0FDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtBQUN2QixDQUFDLENBQUEifQ==
|
|
||||||
3
dist/npmci.trigger.d.ts
vendored
3
dist/npmci.trigger.d.ts
vendored
@@ -1,3 +0,0 @@
|
|||||||
/// <reference types="q" />
|
|
||||||
import * as plugins from './npmci.plugins';
|
|
||||||
export declare let trigger: () => plugins.q.Promise<{}>;
|
|
||||||
28
dist/npmci.trigger.js
vendored
28
dist/npmci.trigger.js
vendored
@@ -1,28 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
const plugins = require("./npmci.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 = function () {
|
|
||||||
let done = plugins.q.defer();
|
|
||||||
plugins.beautylog.info('now running triggers');
|
|
||||||
plugins.smartparam.forEachMinimatch(process.env, 'NPMCI_TRIGGER_*', evaluateTrigger);
|
|
||||||
done.resolve();
|
|
||||||
return done.promise;
|
|
||||||
};
|
|
||||||
let evaluateTrigger = (triggerEnvVarArg) => {
|
|
||||||
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtY2kudHJpZ2dlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL25wbWNpLnRyaWdnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDJDQUEwQztBQUkxQyxJQUFJLGlCQUFpQixHQUFHLGdHQUFnRyxDQUFBO0FBRTdHLFFBQUEsT0FBTyxHQUFHO0lBQ2pCLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUE7SUFDNUIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtJQUM5QyxPQUFPLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLENBQUE7SUFDcEYsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7QUFDdkIsQ0FBQyxDQUFBO0FBRUQsSUFBSSxlQUFlLEdBQUcsQ0FBQyxnQkFBZ0I7SUFDbkMsSUFBSSx1QkFBdUIsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUN0RSxJQUFJLFdBQVcsR0FBRyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUM1QyxJQUFJLGNBQWMsR0FBRyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUMvQyxJQUFJLHdCQUF3QixHQUFHLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3pELElBQUksWUFBWSxHQUFHLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzdDLElBQUksZ0JBQWdCLENBQUE7SUFDcEIsRUFBRSxDQUFDLENBQUMsdUJBQXVCLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkMsZ0JBQWdCLEdBQUcsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDakQsQ0FBQztJQUFDLElBQUksQ0FBQyxDQUFDO1FBQ0osZ0JBQWdCLEdBQUcsaUJBQWlCLENBQUE7SUFDeEMsQ0FBQztJQUNELE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUE7SUFDeEMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsMkJBQTJCLEdBQUcsWUFBWSxHQUFHLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxDQUFBO0lBQzdGLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHFDQUFxQyxHQUFHLGNBQWMsR0FBRyxpQkFBaUIsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0FBQ3RLLENBQUMsQ0FBQSJ9
|
|
||||||
257
install.sh
Executable file
257
install.sh
Executable file
@@ -0,0 +1,257 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# SZCI Installer Script (v5.0+)
|
||||||
|
# Downloads and installs pre-compiled SZCI binary from Gitea releases
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# Direct piped installation (recommended):
|
||||||
|
# curl -sSL https://code.foss.global/ship.zone/szci/raw/branch/main/install.sh | sudo bash
|
||||||
|
#
|
||||||
|
# With version specification:
|
||||||
|
# curl -sSL https://code.foss.global/ship.zone/szci/raw/branch/main/install.sh | sudo bash -s -- --version v5.0.0
|
||||||
|
#
|
||||||
|
# Options:
|
||||||
|
# -h, --help Show this help message
|
||||||
|
# --version VERSION Install specific version (e.g., v5.0.0)
|
||||||
|
# --install-dir DIR Installation directory (default: /opt/szci)
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Default values
|
||||||
|
SHOW_HELP=0
|
||||||
|
SPECIFIED_VERSION=""
|
||||||
|
INSTALL_DIR="/opt/szci"
|
||||||
|
GITEA_BASE_URL="https://code.foss.global"
|
||||||
|
GITEA_REPO="ship.zone/szci"
|
||||||
|
|
||||||
|
# Parse command line arguments
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
-h|--help)
|
||||||
|
SHOW_HELP=1
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--version)
|
||||||
|
SPECIFIED_VERSION="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--install-dir)
|
||||||
|
INSTALL_DIR="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unknown option: $1"
|
||||||
|
echo "Use -h or --help for usage information"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ $SHOW_HELP -eq 1 ]; then
|
||||||
|
echo "SZCI Installer Script (v5.0+)"
|
||||||
|
echo "Downloads and installs pre-compiled SZCI binary"
|
||||||
|
echo ""
|
||||||
|
echo "Usage: $0 [options]"
|
||||||
|
echo ""
|
||||||
|
echo "Options:"
|
||||||
|
echo " -h, --help Show this help message"
|
||||||
|
echo " --version VERSION Install specific version (e.g., v5.0.0)"
|
||||||
|
echo " --install-dir DIR Installation directory (default: /opt/szci)"
|
||||||
|
echo ""
|
||||||
|
echo "Examples:"
|
||||||
|
echo " # Install latest version"
|
||||||
|
echo " curl -sSL https://code.foss.global/ship.zone/szci/raw/branch/main/install.sh | sudo bash"
|
||||||
|
echo ""
|
||||||
|
echo " # Install specific version"
|
||||||
|
echo " curl -sSL https://code.foss.global/ship.zone/szci/raw/branch/main/install.sh | sudo bash -s -- --version v5.0.0"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if running as root
|
||||||
|
if [ "$EUID" -ne 0 ]; then
|
||||||
|
echo "Please run as root (sudo bash install.sh or pipe to sudo bash)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Helper function to detect OS and architecture
|
||||||
|
detect_platform() {
|
||||||
|
local os=$(uname -s)
|
||||||
|
local arch=$(uname -m)
|
||||||
|
|
||||||
|
# Map OS
|
||||||
|
case "$os" in
|
||||||
|
Linux)
|
||||||
|
os_name="linux"
|
||||||
|
;;
|
||||||
|
Darwin)
|
||||||
|
os_name="macos"
|
||||||
|
;;
|
||||||
|
MINGW*|MSYS*|CYGWIN*)
|
||||||
|
os_name="windows"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Error: Unsupported operating system: $os"
|
||||||
|
echo "Supported: Linux, macOS, Windows"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Map architecture
|
||||||
|
case "$arch" in
|
||||||
|
x86_64|amd64)
|
||||||
|
arch_name="x64"
|
||||||
|
;;
|
||||||
|
aarch64|arm64)
|
||||||
|
arch_name="arm64"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Error: Unsupported architecture: $arch"
|
||||||
|
echo "Supported: x86_64/amd64 (x64), aarch64/arm64 (arm64)"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Construct binary name
|
||||||
|
if [ "$os_name" = "windows" ]; then
|
||||||
|
echo "szci-${os_name}-${arch_name}.exe"
|
||||||
|
else
|
||||||
|
echo "szci-${os_name}-${arch_name}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get latest release version from Gitea API
|
||||||
|
get_latest_version() {
|
||||||
|
echo "Fetching latest release version from Gitea..." >&2
|
||||||
|
|
||||||
|
local api_url="${GITEA_BASE_URL}/api/v1/repos/${GITEA_REPO}/releases/latest"
|
||||||
|
local response=$(curl -sSL "$api_url" 2>/dev/null)
|
||||||
|
|
||||||
|
if [ $? -ne 0 ] || [ -z "$response" ]; then
|
||||||
|
echo "Error: Failed to fetch latest release information from Gitea API" >&2
|
||||||
|
echo "URL: $api_url" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Extract tag_name from JSON response
|
||||||
|
local version=$(echo "$response" | grep -o '"tag_name":"[^"]*"' | cut -d'"' -f4)
|
||||||
|
|
||||||
|
if [ -z "$version" ]; then
|
||||||
|
echo "Error: Could not determine latest version from API response" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$version"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Main installation process
|
||||||
|
echo "================================================"
|
||||||
|
echo " SZCI Installation Script (v5.0+)"
|
||||||
|
echo " Serve Zone CI/CD Tool"
|
||||||
|
echo "================================================"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Detect platform
|
||||||
|
BINARY_NAME=$(detect_platform)
|
||||||
|
echo "Detected platform: $BINARY_NAME"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Determine version to install
|
||||||
|
if [ -n "$SPECIFIED_VERSION" ]; then
|
||||||
|
VERSION="$SPECIFIED_VERSION"
|
||||||
|
echo "Installing specified version: $VERSION"
|
||||||
|
else
|
||||||
|
VERSION=$(get_latest_version)
|
||||||
|
echo "Installing latest version: $VERSION"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Construct download URL
|
||||||
|
DOWNLOAD_URL="${GITEA_BASE_URL}/${GITEA_REPO}/releases/download/${VERSION}/${BINARY_NAME}"
|
||||||
|
echo "Download URL: $DOWNLOAD_URL"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Clean installation directory - ensure only binary exists
|
||||||
|
if [ -d "$INSTALL_DIR" ]; then
|
||||||
|
echo "Cleaning installation directory: $INSTALL_DIR"
|
||||||
|
rm -rf "$INSTALL_DIR"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create fresh installation directory
|
||||||
|
echo "Creating installation directory: $INSTALL_DIR"
|
||||||
|
mkdir -p "$INSTALL_DIR"
|
||||||
|
|
||||||
|
# Download binary
|
||||||
|
echo "Downloading SZCI binary..."
|
||||||
|
TEMP_FILE="$INSTALL_DIR/szci.download"
|
||||||
|
curl -sSL "$DOWNLOAD_URL" -o "$TEMP_FILE"
|
||||||
|
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "Error: Failed to download binary from $DOWNLOAD_URL"
|
||||||
|
echo ""
|
||||||
|
echo "Please check:"
|
||||||
|
echo " 1. Your internet connection"
|
||||||
|
echo " 2. The specified version exists: ${GITEA_BASE_URL}/${GITEA_REPO}/releases"
|
||||||
|
echo " 3. The platform binary is available for this release"
|
||||||
|
rm -f "$TEMP_FILE"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if download was successful (file exists and not empty)
|
||||||
|
if [ ! -s "$TEMP_FILE" ]; then
|
||||||
|
echo "Error: Downloaded file is empty or does not exist"
|
||||||
|
rm -f "$TEMP_FILE"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Move to final location
|
||||||
|
BINARY_PATH="$INSTALL_DIR/szci"
|
||||||
|
mv "$TEMP_FILE" "$BINARY_PATH"
|
||||||
|
|
||||||
|
if [ $? -ne 0 ] || [ ! -f "$BINARY_PATH" ]; then
|
||||||
|
echo "Error: Failed to move binary to $BINARY_PATH"
|
||||||
|
rm -f "$TEMP_FILE" 2>/dev/null
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Make executable
|
||||||
|
chmod +x "$BINARY_PATH"
|
||||||
|
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "Error: Failed to make binary executable"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Binary installed successfully to: $BINARY_PATH"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Check if /usr/local/bin is in PATH
|
||||||
|
if [[ ":$PATH:" == *":/usr/local/bin:"* ]]; then
|
||||||
|
BIN_DIR="/usr/local/bin"
|
||||||
|
else
|
||||||
|
BIN_DIR="/usr/bin"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create symlink for global access
|
||||||
|
ln -sf "$BINARY_PATH" "$BIN_DIR/szci"
|
||||||
|
echo "Symlink created: $BIN_DIR/szci -> $BINARY_PATH"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "================================================"
|
||||||
|
echo " SZCI Installation Complete!"
|
||||||
|
echo "================================================"
|
||||||
|
echo ""
|
||||||
|
echo "Installation details:"
|
||||||
|
echo " Binary location: $BINARY_PATH"
|
||||||
|
echo " Symlink location: $BIN_DIR/szci"
|
||||||
|
echo " Version: $VERSION"
|
||||||
|
echo ""
|
||||||
|
echo "Get started:"
|
||||||
|
echo " szci --version"
|
||||||
|
echo " szci --help"
|
||||||
|
echo " szci node install stable # Install Node.js"
|
||||||
|
echo " szci docker build # Build Docker images"
|
||||||
|
echo " szci npm test # Run tests"
|
||||||
|
echo ""
|
||||||
|
echo "For CI/CD integration examples, visit:"
|
||||||
|
echo " https://code.foss.global/ship.zone/szci"
|
||||||
|
echo ""
|
||||||
47
mod.ts
Normal file
47
mod.ts
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
#!/usr/bin/env -S deno run --allow-all
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SZCI - Serve Zone CI/CD Tool
|
||||||
|
*
|
||||||
|
* A command-line tool for streamlining Node.js and Docker workflows
|
||||||
|
* within CI environments, particularly GitLab CI, GitHub CI, and Gitea CI.
|
||||||
|
*
|
||||||
|
* Required Permissions:
|
||||||
|
* - --allow-net: Network access for Docker registries, npm, git operations
|
||||||
|
* - --allow-read: Read configuration files, Dockerfiles, package.json
|
||||||
|
* - --allow-write: Write configuration files, build artifacts
|
||||||
|
* - --allow-run: Execute system commands (docker, git, npm, ssh)
|
||||||
|
* - --allow-sys: Access system information (OS details)
|
||||||
|
* - --allow-env: Read/write environment variables
|
||||||
|
*
|
||||||
|
* @module
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { Szci } from './ts/szci.classes.szci.ts';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main entry point for the SZCI application
|
||||||
|
* Parses command-line arguments and executes the requested command
|
||||||
|
*/
|
||||||
|
async function main(): Promise<void> {
|
||||||
|
// Create Szci instance
|
||||||
|
const szciInstance = new Szci();
|
||||||
|
|
||||||
|
// Start the CLI
|
||||||
|
// Deno.args is already 0-indexed (unlike Node's process.argv which starts at index 2)
|
||||||
|
// The smartcli library may expect process.argv format, so we might need to prepend placeholders
|
||||||
|
await szciInstance.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Execute main and handle errors
|
||||||
|
if (import.meta.main) {
|
||||||
|
try {
|
||||||
|
await main();
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
||||||
|
Deno.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Export for programmatic use
|
||||||
|
export { Szci } from './ts/szci.classes.szci.ts';
|
||||||
@@ -1,10 +1,45 @@
|
|||||||
{
|
{
|
||||||
"npmts":{
|
"@ship.zone/szci": {
|
||||||
"mode":"default",
|
"npmGlobalTools": [],
|
||||||
"coverageTreshold": "70",
|
"npmRegistryUrl": "registry.npmjs.org"
|
||||||
"cli": true
|
},
|
||||||
|
"@git.zone/tsdocker": {
|
||||||
|
"baseImage": "hosttoday/ht-docker-node:npmci",
|
||||||
|
"command": "szci test stable"
|
||||||
|
},
|
||||||
|
"@git.zone/cli": {
|
||||||
|
"projectType": "deno",
|
||||||
|
"module": {
|
||||||
|
"githost": "code.foss.global",
|
||||||
|
"gitscope": "ship.zone",
|
||||||
|
"gitrepo": "szci",
|
||||||
|
"description": "A tool to streamline Node.js and Docker workflows within CI environments, particularly GitLab CI, providing various CI/CD utilities.",
|
||||||
|
"npmPackagename": "@ship.zone/szci",
|
||||||
|
"license": "MIT",
|
||||||
|
"keywords": [
|
||||||
|
"Node.js",
|
||||||
|
"Docker",
|
||||||
|
"GitLab CI",
|
||||||
|
"GitHub CI",
|
||||||
|
"Gitea CI",
|
||||||
|
"CI/CD",
|
||||||
|
"automation",
|
||||||
|
"npm",
|
||||||
|
"TypeScript",
|
||||||
|
"cloud",
|
||||||
|
"SSH",
|
||||||
|
"registry",
|
||||||
|
"container management",
|
||||||
|
"continuous integration",
|
||||||
|
"continuous deployment"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"npmdocker":{
|
"release": {
|
||||||
"baseImage":"hosttoday/ht-docker-node:npmts"
|
"registries": [
|
||||||
|
"https://verdaccio.lossless.digital",
|
||||||
|
"https://registry.npmjs.org"
|
||||||
|
],
|
||||||
|
"accessLevel": "public"
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
102
package.json
102
package.json
@@ -1,55 +1,67 @@
|
|||||||
{
|
{
|
||||||
"name": "npmci",
|
"name": "@ship.zone/szci",
|
||||||
"version": "2.3.28",
|
"version": "7.1.1",
|
||||||
"description": "",
|
"description": "Serve Zone CI - A tool to streamline Node.js and Docker workflows within CI environments, particularly GitLab CI, providing various CI/CD utilities. Powered by Deno with standalone executables.",
|
||||||
"main": "dist/index.js",
|
"keywords": [
|
||||||
"typings": "dist/index.d.ts",
|
"Node.js",
|
||||||
"bin": {
|
"Docker",
|
||||||
"npmci": "dist/cli.js"
|
"GitLab CI",
|
||||||
},
|
"GitHub CI",
|
||||||
"scripts": {
|
"Gitea CI",
|
||||||
"test": "(npmts) && (npm run testVersion)",
|
"CI/CD",
|
||||||
"testVersion": "(cd test/assets/ && node ../../dist/cli.js -v)"
|
"automation",
|
||||||
|
"npm",
|
||||||
|
"TypeScript",
|
||||||
|
"Deno",
|
||||||
|
"cloud",
|
||||||
|
"SSH",
|
||||||
|
"registry",
|
||||||
|
"container management",
|
||||||
|
"continuous integration",
|
||||||
|
"continuous deployment"
|
||||||
|
],
|
||||||
|
"homepage": "https://code.foss.global/ship.zone/szci",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://code.foss.global/ship.zone/szci/issues"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "git+ssh://git@github.com/pushrocks/npmci.git"
|
"url": "git+https://code.foss.global/ship.zone/szci.git"
|
||||||
},
|
},
|
||||||
"author": "Lossless GmbH",
|
"author": "Lossless GmbH",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"bugs": {
|
"type": "module",
|
||||||
"url": "https://gitlab.com/pushrocks/npmci/issues"
|
"bin": {
|
||||||
|
"szci": "./bin/szci-wrapper.js"
|
||||||
},
|
},
|
||||||
"homepage": "https://gitlab.com/pushrocks/npmci#README",
|
"scripts": {
|
||||||
"devDependencies": {
|
"postinstall": "node scripts/install-binary.js",
|
||||||
"@types/should": "^8.1.30",
|
"prepublishOnly": "echo 'Publishing SZCI binaries to npm...'",
|
||||||
"npmts-g": "^5.2.8",
|
"test": "echo 'Tests are run with Deno: deno task test'",
|
||||||
"should": "^11.1.1",
|
"build": "echo 'no build needed'"
|
||||||
"typings-test": "^1.0.3"
|
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"files": [
|
||||||
"@types/lodash": "^4.14.40",
|
"bin/",
|
||||||
"@types/node": "^6.0.51",
|
"scripts/install-binary.js",
|
||||||
"@types/q": "0.x.x",
|
"readme.md",
|
||||||
"@types/request": "0.x.x",
|
"license",
|
||||||
"@types/shelljs": "^0.3.33",
|
"changelog.md"
|
||||||
"@types/through2": "^2.0.32",
|
],
|
||||||
"beautylog": "^6.0.0",
|
"engines": {
|
||||||
"gulp": "^3.9.1",
|
"node": ">=14.0.0"
|
||||||
"gulp-function": "^2.2.0",
|
},
|
||||||
"lodash": "^4.17.2",
|
"os": [
|
||||||
"npmextra": "^2.0.3",
|
"darwin",
|
||||||
"projectinfo": "^1.0.4",
|
"linux",
|
||||||
"q": "^1.4.1",
|
"win32"
|
||||||
"request": "^2.79.0",
|
],
|
||||||
"shelljs": "^0.7.5",
|
"cpu": [
|
||||||
"smartcli": "^1.0.15",
|
"x64",
|
||||||
"smartfile": "^4.1.0",
|
"arm64"
|
||||||
"smartparam": "^0.1.1",
|
],
|
||||||
"smartsocket": "^1.1.7",
|
"publishConfig": {
|
||||||
"smartssh": "^1.2.1",
|
"access": "public",
|
||||||
"smartstring": "^2.0.22",
|
"registry": "https://registry.npmjs.org/"
|
||||||
"through2": "^2.0.1",
|
},
|
||||||
"typings-global": "^1.0.14"
|
"packageManager": "pnpm@10.18.1+sha512.77a884a165cbba2d8d1c19e3b4880eee6d2fcabd0d879121e282196b80042351d5eb3ca0935fa599da1dc51265cc68816ad2bddd2a2de5ea9fdf92adbec7cd34"
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
9
pnpm-lock.yaml
generated
Normal file
9
pnpm-lock.yaml
generated
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
lockfileVersion: '9.0'
|
||||||
|
|
||||||
|
settings:
|
||||||
|
autoInstallPeers: true
|
||||||
|
excludeLinksFromLockfile: false
|
||||||
|
|
||||||
|
importers:
|
||||||
|
|
||||||
|
.: {}
|
||||||
55
readme.hints.md
Normal file
55
readme.hints.md
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
- Focus on CLI usage in CI environments.
|
||||||
|
- Show GitLab CI, GitHub CI and Gitea CI examples.
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
szci is a thin orchestrator that delegates heavy lifting to specialized tools:
|
||||||
|
- **Docker**: Delegates all operations to `@git.zone/tsdocker` via `npx`
|
||||||
|
- **NPM**: Thin wrapper around `pnpm` with .npmrc generation from `SZCI_TOKEN_NPM*` env vars
|
||||||
|
- **Node.js**: NVM-based version management (stable=22, lts=20, legacy=18)
|
||||||
|
- **SSH**: Deploys SSH keys from `SZCI_SSHKEY_*` env vars
|
||||||
|
- **Git**: GitHub mirroring via `SZCI_GIT_GITHUBTOKEN`
|
||||||
|
- **Cloudly**: Integration with serve.zone infrastructure
|
||||||
|
|
||||||
|
## Docker Env Var Bridging
|
||||||
|
|
||||||
|
szci bridges its own env var format to tsdocker's format before delegation:
|
||||||
|
- `SZCI_LOGIN_DOCKER*` -> `DOCKER_REGISTRY_N` (pipe-delimited: `url|user|pass`)
|
||||||
|
- GitLab CI: `CI_JOB_TOKEN` -> `DOCKER_REGISTRY_0` for `registry.gitlab.com`
|
||||||
|
|
||||||
|
## Deno Migration Status
|
||||||
|
|
||||||
|
The project has been fully migrated from Node.js to Deno runtime.
|
||||||
|
|
||||||
|
### Environment Variables
|
||||||
|
|
||||||
|
All environment variables have been rebranded from NPMCI_* to SZCI_*:
|
||||||
|
|
||||||
|
| Old Name | New Name |
|
||||||
|
|----------|----------|
|
||||||
|
| `NPMCI_COMPUTED_REPOURL` | `SZCI_COMPUTED_REPOURL` |
|
||||||
|
| `NPMCI_URL_CLOUDLY` | `SZCI_URL_CLOUDLY` |
|
||||||
|
| `NPMCI_GIT_GITHUBTOKEN` | `SZCI_GIT_GITHUBTOKEN` |
|
||||||
|
| `NPMCI_GIT_GITHUBGROUP` | `SZCI_GIT_GITHUBGROUP` |
|
||||||
|
| `NPMCI_GIT_GITHUB` | `SZCI_GIT_GITHUB` |
|
||||||
|
| `NPMCI_SSHKEY_*` | `SZCI_SSHKEY_*` |
|
||||||
|
| `NPMCI_LOGIN_DOCKER*` | `SZCI_LOGIN_DOCKER*` |
|
||||||
|
| `NPMCI_TOKEN_NPM*` | `SZCI_TOKEN_NPM*` |
|
||||||
|
| `NPMTS_TEST` | `SZCI_TEST` |
|
||||||
|
| `DEBUG_NPMCI` | `DEBUG_SZCI` |
|
||||||
|
|
||||||
|
### Runtime
|
||||||
|
|
||||||
|
- Uses Deno APIs (`Deno.env`, `Deno.cwd`, `Deno.exit`)
|
||||||
|
- Logger runtime set to 'deno'
|
||||||
|
- Dynamic imports use `.ts` extensions
|
||||||
|
|
||||||
|
## Removed Modules (v7+)
|
||||||
|
|
||||||
|
The following were removed as dead/obsolete code:
|
||||||
|
- `mod_trigger` - Deprecated GitLab API v3
|
||||||
|
- `mod_precheck` - GitLab-specific runner tag validation
|
||||||
|
- `manager.cloudron` - Niche Cloudron deployment
|
||||||
|
- `mod_command` - Trivial bash wrapper
|
||||||
|
- `mod_clean` - Trivial config cleanup
|
||||||
|
- Docker manager internals (Dockerfile, DockerRegistry, RegistryStorage classes) - replaced by tsdocker delegation
|
||||||
391
readme.md
Normal file
391
readme.md
Normal file
@@ -0,0 +1,391 @@
|
|||||||
|
# @ship.zone/szci
|
||||||
|
|
||||||
|
A lightweight CI/CD orchestrator built with Deno that unifies Node.js, Docker, NPM, SSH, and Git workflows into a single CLI. Compiles to standalone binaries — no runtime required.
|
||||||
|
|
||||||
|
## Issue Reporting and Security
|
||||||
|
|
||||||
|
For reporting bugs, issues, or security vulnerabilities, please visit [community.foss.global/](https://community.foss.global/). This is the central community hub for all issue reporting. Developers who sign and comply with our contribution agreement and go through identification can also get a [code.foss.global/](https://code.foss.global/) account to submit Pull Requests directly.
|
||||||
|
|
||||||
|
## 🏗️ Architecture
|
||||||
|
|
||||||
|
szci is a **thin orchestrator** — it doesn't reinvent the wheel. Instead, it wires up best-in-class tools and handles the CI-specific glue:
|
||||||
|
|
||||||
|
| Domain | What szci does | Delegates to |
|
||||||
|
|--------|---------------|-------------|
|
||||||
|
| 🐳 Docker | Bridges `SZCI_LOGIN_DOCKER*` env vars, auto-detects GitLab CI tokens | [`@git.zone/tsdocker`](https://code.foss.global/git.zone/tsdocker) |
|
||||||
|
| 📦 NPM | Generates `.npmrc` from `SZCI_TOKEN_NPM*` env vars, handles multi-registry publish | `pnpm` + `npm publish` |
|
||||||
|
| 🟢 Node.js | Manages Node versions via NVM with named aliases | `nvm` |
|
||||||
|
| 🔑 SSH | Deploys SSH keys from env vars to `~/.ssh` | `@push.rocks/smartssh` |
|
||||||
|
| 🔀 Git | Mirrors repos to GitHub | `git remote` |
|
||||||
|
|
||||||
|
```
|
||||||
|
CLI Input (Deno.args)
|
||||||
|
↓
|
||||||
|
SmartCLI Router
|
||||||
|
↓
|
||||||
|
├─ szci docker * → env var bridging → npx @git.zone/tsdocker
|
||||||
|
├─ szci npm * → .npmrc generation → pnpm / npm publish
|
||||||
|
├─ szci node * → version aliasing → nvm install
|
||||||
|
├─ szci git * → token injection → git push --mirror
|
||||||
|
└─ szci ssh * → key parsing → write to ~/.ssh
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📥 Installation
|
||||||
|
|
||||||
|
### Automated Installer (Recommended)
|
||||||
|
|
||||||
|
The easiest way to install szci is using the automated installer script. It handles platform detection, binary download, and global setup:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
curl -sSL https://code.foss.global/ship.zone/szci/raw/branch/main/install.sh | sudo bash
|
||||||
|
```
|
||||||
|
|
||||||
|
To install a specific version:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
curl -sSL https://code.foss.global/ship.zone/szci/raw/branch/main/install.sh | sudo bash -s -- --version v7.0.0
|
||||||
|
```
|
||||||
|
|
||||||
|
### Via NPM (downloads pre-compiled binary)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm install -g @ship.zone/szci
|
||||||
|
```
|
||||||
|
|
||||||
|
### From Source
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git clone https://code.foss.global/ship.zone/szci.git
|
||||||
|
cd szci
|
||||||
|
deno task compile
|
||||||
|
```
|
||||||
|
|
||||||
|
The compiled binaries land in `dist/binaries/` for Linux (x64/arm64), macOS (x64/arm64), and Windows (x64).
|
||||||
|
|
||||||
|
## 🚀 Quick Start
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Setup Node.js environment
|
||||||
|
szci node install stable
|
||||||
|
|
||||||
|
# Install project dependencies
|
||||||
|
szci npm install
|
||||||
|
|
||||||
|
# Build & push Docker images
|
||||||
|
szci docker build
|
||||||
|
szci docker push registry.example.com
|
||||||
|
|
||||||
|
# Run tests
|
||||||
|
szci npm test
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📖 CLI Reference
|
||||||
|
|
||||||
|
### `szci docker` — Docker Operations
|
||||||
|
|
||||||
|
All Docker commands delegate to `@git.zone/tsdocker` after bridging environment variables.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
szci docker build # Build all Dockerfiles in cwd
|
||||||
|
szci docker login # Login to all configured registries
|
||||||
|
szci docker prepare # Alias for login
|
||||||
|
szci docker push registry.example.com # Push images to a registry
|
||||||
|
szci docker pull registry.example.com # Pull images from a registry
|
||||||
|
szci docker test # Test Dockerfiles
|
||||||
|
```
|
||||||
|
|
||||||
|
**Env var bridging:** Before delegating, szci converts its own env var format to tsdocker's expected format:
|
||||||
|
|
||||||
|
```
|
||||||
|
SZCI_LOGIN_DOCKER_1 → DOCKER_REGISTRY_1
|
||||||
|
SZCI_LOGIN_DOCKER_2 → DOCKER_REGISTRY_2
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
In GitLab CI, `CI_JOB_TOKEN` is automatically bridged as `DOCKER_REGISTRY_0` for `registry.gitlab.com`.
|
||||||
|
|
||||||
|
### `szci npm` — NPM/pnpm Workflows
|
||||||
|
|
||||||
|
```sh
|
||||||
|
szci npm install # Runs pnpm install
|
||||||
|
szci npm build # Runs pnpm run build
|
||||||
|
szci npm test # Runs pnpm test
|
||||||
|
szci npm prepare # Generates ~/.npmrc from SZCI_TOKEN_NPM* env vars
|
||||||
|
szci npm publish # Full workflow: prepare → install → build → clean → npm publish
|
||||||
|
```
|
||||||
|
|
||||||
|
The `publish` command supports multi-registry publishing. If `npmAccessLevel` is `public` and a Verdaccio registry is configured, it publishes to both npm and Verdaccio automatically.
|
||||||
|
|
||||||
|
### `szci node` — Node.js Version Management
|
||||||
|
|
||||||
|
```sh
|
||||||
|
szci node install stable # Node.js 22
|
||||||
|
szci node install lts # Node.js 20
|
||||||
|
szci node install legacy # Node.js 18
|
||||||
|
szci node install 21 # Any specific version
|
||||||
|
```
|
||||||
|
|
||||||
|
Uses NVM under the hood (auto-detected at `/usr/local/nvm/nvm.sh` or `~/.nvm/nvm.sh`). After installing, it:
|
||||||
|
1. Sets the installed version as `nvm alias default`
|
||||||
|
2. Upgrades npm to latest
|
||||||
|
3. Installs any global tools listed in `npmextra.json` → `npmGlobalTools`
|
||||||
|
|
||||||
|
### `szci ssh` — SSH Key Deployment
|
||||||
|
|
||||||
|
```sh
|
||||||
|
szci ssh prepare # Deploy SSH keys from env vars to ~/.ssh
|
||||||
|
```
|
||||||
|
|
||||||
|
Reads all `SZCI_SSHKEY_*` env vars and writes the keys to disk.
|
||||||
|
|
||||||
|
### `szci git` — Git Mirroring
|
||||||
|
|
||||||
|
```sh
|
||||||
|
szci git mirror # Mirror repository to GitHub
|
||||||
|
```
|
||||||
|
|
||||||
|
Pushes all branches and tags to a GitHub mirror. Requires `SZCI_GIT_GITHUBTOKEN`. Refuses to mirror packages marked as `private` in `package.json`.
|
||||||
|
|
||||||
|
## ⚙️ Configuration
|
||||||
|
|
||||||
|
### `npmextra.json`
|
||||||
|
|
||||||
|
Place this in your project root to configure szci behavior:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"@ship.zone/szci": {
|
||||||
|
"npmGlobalTools": ["typescript", "pnpm"],
|
||||||
|
"npmAccessLevel": "public",
|
||||||
|
"npmRegistryUrl": "registry.npmjs.org",
|
||||||
|
"urlCloudly": "https://cloudly.example.com"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
| Option | Type | Default | Description |
|
||||||
|
|--------|------|---------|-------------|
|
||||||
|
| `npmGlobalTools` | `string[]` | `[]` | Global npm packages to install during `node install` |
|
||||||
|
| `npmAccessLevel` | `"public" \| "private"` | `"private"` | Access level for `npm publish` |
|
||||||
|
| `npmRegistryUrl` | `string` | `"registry.npmjs.org"` | Default npm registry |
|
||||||
|
| `urlCloudly` | `string?` | — | Cloudly endpoint URL (can also be set via `SZCI_URL_CLOUDLY`) |
|
||||||
|
|
||||||
|
## 🔐 Environment Variables
|
||||||
|
|
||||||
|
### Docker Registry Authentication
|
||||||
|
|
||||||
|
Pipe-delimited format: `registry|username|password`
|
||||||
|
|
||||||
|
```sh
|
||||||
|
SZCI_LOGIN_DOCKER_1="registry.example.com|myuser|mypass"
|
||||||
|
SZCI_LOGIN_DOCKER_2="ghcr.io|token|ghp_xxxx"
|
||||||
|
```
|
||||||
|
|
||||||
|
In **GitLab CI**, the `CI_JOB_TOKEN` is automatically used for `registry.gitlab.com` — no manual config needed.
|
||||||
|
|
||||||
|
### NPM Registry Authentication
|
||||||
|
|
||||||
|
Pipe-delimited format: `registry|token[|plain]`
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Base64-encoded token (default)
|
||||||
|
SZCI_TOKEN_NPM_1="registry.npmjs.org|dGhlLXRva2VuLWhlcmU="
|
||||||
|
|
||||||
|
# Plain text token
|
||||||
|
SZCI_TOKEN_NPM_2="verdaccio.example.com|the-token-here|plain"
|
||||||
|
```
|
||||||
|
|
||||||
|
### SSH Keys
|
||||||
|
|
||||||
|
Pipe-delimited format: `host|privKeyBase64|pubKeyBase64`
|
||||||
|
|
||||||
|
```sh
|
||||||
|
SZCI_SSHKEY_1="github.com|BASE64_PRIVATE_KEY|BASE64_PUBLIC_KEY"
|
||||||
|
SZCI_SSHKEY_2="gitlab.com|BASE64_PRIVATE_KEY|##" # Use ## to skip a field
|
||||||
|
```
|
||||||
|
|
||||||
|
### Git Mirroring
|
||||||
|
|
||||||
|
```sh
|
||||||
|
SZCI_GIT_GITHUBTOKEN="ghp_your_personal_access_token"
|
||||||
|
SZCI_GIT_GITHUBGROUP="your-org" # Defaults to repo owner
|
||||||
|
SZCI_GIT_GITHUB="your-repo" # Defaults to repo name
|
||||||
|
```
|
||||||
|
|
||||||
|
### Debugging & Testing
|
||||||
|
|
||||||
|
```sh
|
||||||
|
DEBUG_SZCI="true" # Log all shell commands before execution
|
||||||
|
SZCI_TEST="true" # Test mode: mocks bash execution, skips SSH disk writes
|
||||||
|
```
|
||||||
|
|
||||||
|
### Full Environment Variable Reference
|
||||||
|
|
||||||
|
| Variable | Purpose |
|
||||||
|
|----------|---------|
|
||||||
|
| `SZCI_LOGIN_DOCKER_*` | Docker registry credentials (pipe-delimited) |
|
||||||
|
| `SZCI_TOKEN_NPM_*` | NPM registry auth tokens (pipe-delimited) |
|
||||||
|
| `SZCI_SSHKEY_*` | SSH key pairs (pipe-delimited) |
|
||||||
|
| `SZCI_GIT_GITHUBTOKEN` | GitHub personal access token for mirroring |
|
||||||
|
| `SZCI_GIT_GITHUBGROUP` | GitHub org/user for mirror target |
|
||||||
|
| `SZCI_GIT_GITHUB` | GitHub repo name for mirror target |
|
||||||
|
| `SZCI_URL_CLOUDLY` | Cloudly endpoint URL |
|
||||||
|
| `SZCI_COMPUTED_REPOURL` | Override auto-detected repo URL |
|
||||||
|
| `DEBUG_SZCI` | Enable verbose shell command logging |
|
||||||
|
| `SZCI_TEST` | Enable test mode (mock execution) |
|
||||||
|
|
||||||
|
## 🔄 CI/CD Integration Examples
|
||||||
|
|
||||||
|
### GitLab CI
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
image: node:22
|
||||||
|
|
||||||
|
stages:
|
||||||
|
- prepare
|
||||||
|
- build
|
||||||
|
- test
|
||||||
|
- deploy
|
||||||
|
|
||||||
|
before_script:
|
||||||
|
- curl -sSL https://code.foss.global/ship.zone/szci/raw/branch/main/install.sh | bash
|
||||||
|
|
||||||
|
prepare:
|
||||||
|
stage: prepare
|
||||||
|
script:
|
||||||
|
- szci node install stable
|
||||||
|
- szci npm install
|
||||||
|
|
||||||
|
build:
|
||||||
|
stage: build
|
||||||
|
script:
|
||||||
|
- szci docker build
|
||||||
|
|
||||||
|
test:
|
||||||
|
stage: test
|
||||||
|
script:
|
||||||
|
- szci npm test
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
stage: deploy
|
||||||
|
script:
|
||||||
|
- szci docker push $CI_REGISTRY
|
||||||
|
only:
|
||||||
|
- master
|
||||||
|
```
|
||||||
|
|
||||||
|
> 💡 In GitLab CI, `CI_JOB_TOKEN` is automatically detected — szci will login to `registry.gitlab.com` without any extra config.
|
||||||
|
|
||||||
|
### GitHub Actions
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
name: CI/CD
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [main]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install szci
|
||||||
|
run: curl -sSL https://code.foss.global/ship.zone/szci/raw/branch/main/install.sh | sudo bash
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
run: szci node install stable
|
||||||
|
|
||||||
|
- name: Install & Build
|
||||||
|
run: |
|
||||||
|
szci npm install
|
||||||
|
szci npm build
|
||||||
|
|
||||||
|
- name: Test
|
||||||
|
run: szci npm test
|
||||||
|
|
||||||
|
- name: Push Docker
|
||||||
|
if: github.ref == 'refs/heads/main'
|
||||||
|
run: szci docker push ghcr.io
|
||||||
|
env:
|
||||||
|
SZCI_LOGIN_DOCKER_1: "ghcr.io|${{ github.actor }}|${{ secrets.GITHUB_TOKEN }}"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Gitea CI (Woodpecker)
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
steps:
|
||||||
|
- name: ci
|
||||||
|
image: node:22
|
||||||
|
commands:
|
||||||
|
- curl -sSL https://code.foss.global/ship.zone/szci/raw/branch/main/install.sh | bash
|
||||||
|
- szci node install stable
|
||||||
|
- szci npm install
|
||||||
|
- szci docker build
|
||||||
|
- szci npm test
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔄 Migration from npmci
|
||||||
|
|
||||||
|
Upgrading from `@ship.zone/npmci`? Three steps:
|
||||||
|
|
||||||
|
1. **Rename the binary** — replace `npmci` with `szci` in all CI scripts
|
||||||
|
2. **Rename env vars** — `NPMCI_*` → `SZCI_*` (same formats, just the prefix changed)
|
||||||
|
3. **Docker ops** — now delegate to `@git.zone/tsdocker` (installed automatically via `npx`)
|
||||||
|
|
||||||
|
| Old | New |
|
||||||
|
|-----|-----|
|
||||||
|
| `NPMCI_LOGIN_DOCKER*` | `SZCI_LOGIN_DOCKER*` |
|
||||||
|
| `NPMCI_TOKEN_NPM*` | `SZCI_TOKEN_NPM*` |
|
||||||
|
| `NPMCI_SSHKEY_*` | `SZCI_SSHKEY_*` |
|
||||||
|
| `NPMCI_GIT_GITHUBTOKEN` | `SZCI_GIT_GITHUBTOKEN` |
|
||||||
|
| `NPMCI_URL_CLOUDLY` | `SZCI_URL_CLOUDLY` |
|
||||||
|
| `DEBUG_NPMCI` | `DEBUG_SZCI` |
|
||||||
|
| `NPMTS_TEST` | `SZCI_TEST` |
|
||||||
|
|
||||||
|
## 🛠️ Development
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Type check
|
||||||
|
deno task check
|
||||||
|
|
||||||
|
# Run tests
|
||||||
|
deno task test
|
||||||
|
|
||||||
|
# Watch tests
|
||||||
|
deno task test:watch
|
||||||
|
|
||||||
|
# Dev mode
|
||||||
|
deno task dev -- --help
|
||||||
|
|
||||||
|
# Compile binaries for all platforms
|
||||||
|
deno task compile
|
||||||
|
|
||||||
|
# Format code
|
||||||
|
deno task fmt
|
||||||
|
|
||||||
|
# Lint
|
||||||
|
deno task lint
|
||||||
|
```
|
||||||
|
|
||||||
|
## License and Legal Information
|
||||||
|
|
||||||
|
This repository contains open-source code licensed under the MIT License. A copy of the license can be found in the [license](./license) file.
|
||||||
|
|
||||||
|
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
### Trademarks
|
||||||
|
|
||||||
|
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH or third parties, and are not included within the scope of the MIT license granted herein.
|
||||||
|
|
||||||
|
Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines or the guidelines of the respective third-party owners, and any usage must be approved in writing. Third-party trademarks used herein are the property of their respective owners and used only in a descriptive manner, e.g. for an implementation of an API or similar.
|
||||||
|
|
||||||
|
### Company Information
|
||||||
|
|
||||||
|
Task Venture Capital GmbH
|
||||||
|
Registered at District Court Bremen HRB 35230 HB, Germany
|
||||||
|
|
||||||
|
For any legal inquiries or further information, please contact us via email at hello@task.vc.
|
||||||
|
|
||||||
|
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.
|
||||||
66
scripts/compile-all.sh
Executable file
66
scripts/compile-all.sh
Executable file
@@ -0,0 +1,66 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Get version from deno.json
|
||||||
|
VERSION=$(cat deno.json | grep -o '"version": *"[^"]*"' | cut -d'"' -f4)
|
||||||
|
BINARY_DIR="dist/binaries"
|
||||||
|
|
||||||
|
echo "================================================"
|
||||||
|
echo " SZCI Compilation Script"
|
||||||
|
echo " Version: ${VERSION}"
|
||||||
|
echo "================================================"
|
||||||
|
echo ""
|
||||||
|
echo "Compiling for all supported platforms..."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Clean up old binaries and create fresh directory
|
||||||
|
rm -rf "$BINARY_DIR"
|
||||||
|
mkdir -p "$BINARY_DIR"
|
||||||
|
echo "→ Cleaned old binaries from $BINARY_DIR"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Linux x86_64
|
||||||
|
echo "→ Compiling for Linux x86_64..."
|
||||||
|
deno compile --allow-all --no-check --output "$BINARY_DIR/szci-linux-x64" \
|
||||||
|
--target x86_64-unknown-linux-gnu mod.ts
|
||||||
|
echo " ✓ Linux x86_64 complete"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Linux ARM64
|
||||||
|
echo "→ Compiling for Linux ARM64..."
|
||||||
|
deno compile --allow-all --no-check --output "$BINARY_DIR/szci-linux-arm64" \
|
||||||
|
--target aarch64-unknown-linux-gnu mod.ts
|
||||||
|
echo " ✓ Linux ARM64 complete"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# macOS x86_64
|
||||||
|
echo "→ Compiling for macOS x86_64..."
|
||||||
|
deno compile --allow-all --no-check --output "$BINARY_DIR/szci-macos-x64" \
|
||||||
|
--target x86_64-apple-darwin mod.ts
|
||||||
|
echo " ✓ macOS x86_64 complete"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# macOS ARM64
|
||||||
|
echo "→ Compiling for macOS ARM64..."
|
||||||
|
deno compile --allow-all --no-check --output "$BINARY_DIR/szci-macos-arm64" \
|
||||||
|
--target aarch64-apple-darwin mod.ts
|
||||||
|
echo " ✓ macOS ARM64 complete"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Windows x86_64
|
||||||
|
echo "→ Compiling for Windows x86_64..."
|
||||||
|
deno compile --allow-all --no-check --output "$BINARY_DIR/szci-windows-x64.exe" \
|
||||||
|
--target x86_64-pc-windows-msvc mod.ts
|
||||||
|
echo " ✓ Windows x86_64 complete"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "================================================"
|
||||||
|
echo " Compilation Summary"
|
||||||
|
echo "================================================"
|
||||||
|
echo ""
|
||||||
|
ls -lh "$BINARY_DIR/" | tail -n +2
|
||||||
|
echo ""
|
||||||
|
echo "✓ All binaries compiled successfully!"
|
||||||
|
echo ""
|
||||||
|
echo "Binary location: $BINARY_DIR/"
|
||||||
|
echo ""
|
||||||
228
scripts/install-binary.js
Normal file
228
scripts/install-binary.js
Normal file
@@ -0,0 +1,228 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SZCI npm postinstall script
|
||||||
|
* Downloads the appropriate binary for the current platform from repository releases
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { platform, arch } from 'os';
|
||||||
|
import { existsSync, mkdirSync, writeFileSync, chmodSync, unlinkSync } from 'fs';
|
||||||
|
import { join, dirname } from 'path';
|
||||||
|
import { fileURLToPath } from 'url';
|
||||||
|
import https from 'https';
|
||||||
|
import { pipeline } from 'stream';
|
||||||
|
import { promisify } from 'util';
|
||||||
|
import { createWriteStream } from 'fs';
|
||||||
|
|
||||||
|
const __filename = fileURLToPath(import.meta.url);
|
||||||
|
const __dirname = dirname(__filename);
|
||||||
|
const streamPipeline = promisify(pipeline);
|
||||||
|
|
||||||
|
// Configuration
|
||||||
|
const REPO_BASE = 'https://code.foss.global/ship.zone/szci';
|
||||||
|
const VERSION = process.env.npm_package_version || '4.1.37';
|
||||||
|
|
||||||
|
function getBinaryInfo() {
|
||||||
|
const plat = platform();
|
||||||
|
const architecture = arch();
|
||||||
|
|
||||||
|
const platformMap = {
|
||||||
|
'darwin': 'macos',
|
||||||
|
'linux': 'linux',
|
||||||
|
'win32': 'windows'
|
||||||
|
};
|
||||||
|
|
||||||
|
const archMap = {
|
||||||
|
'x64': 'x64',
|
||||||
|
'arm64': 'arm64'
|
||||||
|
};
|
||||||
|
|
||||||
|
const mappedPlatform = platformMap[plat];
|
||||||
|
const mappedArch = archMap[architecture];
|
||||||
|
|
||||||
|
if (!mappedPlatform || !mappedArch) {
|
||||||
|
return { supported: false, platform: plat, arch: architecture };
|
||||||
|
}
|
||||||
|
|
||||||
|
let binaryName = `szci-${mappedPlatform}-${mappedArch}`;
|
||||||
|
if (plat === 'win32') {
|
||||||
|
binaryName += '.exe';
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
supported: true,
|
||||||
|
platform: mappedPlatform,
|
||||||
|
arch: mappedArch,
|
||||||
|
binaryName,
|
||||||
|
originalPlatform: plat
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function downloadFile(url, destination) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
console.log(`Downloading from: ${url}`);
|
||||||
|
|
||||||
|
// Follow redirects
|
||||||
|
const download = (url, redirectCount = 0) => {
|
||||||
|
if (redirectCount > 5) {
|
||||||
|
reject(new Error('Too many redirects'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
https.get(url, (response) => {
|
||||||
|
if (response.statusCode === 301 || response.statusCode === 302) {
|
||||||
|
console.log(`Following redirect to: ${response.headers.location}`);
|
||||||
|
download(response.headers.location, redirectCount + 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (response.statusCode !== 200) {
|
||||||
|
reject(new Error(`Failed to download: ${response.statusCode} ${response.statusMessage}`));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const totalSize = parseInt(response.headers['content-length'], 10);
|
||||||
|
let downloadedSize = 0;
|
||||||
|
let lastProgress = 0;
|
||||||
|
|
||||||
|
response.on('data', (chunk) => {
|
||||||
|
downloadedSize += chunk.length;
|
||||||
|
const progress = Math.round((downloadedSize / totalSize) * 100);
|
||||||
|
|
||||||
|
// Only log every 10% to reduce noise
|
||||||
|
if (progress >= lastProgress + 10) {
|
||||||
|
console.log(`Download progress: ${progress}%`);
|
||||||
|
lastProgress = progress;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const file = createWriteStream(destination);
|
||||||
|
|
||||||
|
pipeline(response, file, (err) => {
|
||||||
|
if (err) {
|
||||||
|
reject(err);
|
||||||
|
} else {
|
||||||
|
console.log('Download complete!');
|
||||||
|
resolve();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}).on('error', reject);
|
||||||
|
};
|
||||||
|
|
||||||
|
download(url);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
console.log('===========================================');
|
||||||
|
console.log(' SZCI - Binary Installation');
|
||||||
|
console.log('===========================================');
|
||||||
|
console.log('');
|
||||||
|
|
||||||
|
const binaryInfo = getBinaryInfo();
|
||||||
|
|
||||||
|
if (!binaryInfo.supported) {
|
||||||
|
console.error(`❌ Error: Unsupported platform/architecture: ${binaryInfo.platform}/${binaryInfo.arch}`);
|
||||||
|
console.error('');
|
||||||
|
console.error('Supported platforms:');
|
||||||
|
console.error(' • Linux (x64, arm64)');
|
||||||
|
console.error(' • macOS (x64, arm64)');
|
||||||
|
console.error(' • Windows (x64)');
|
||||||
|
console.error('');
|
||||||
|
console.error('If you believe your platform should be supported, please file an issue:');
|
||||||
|
console.error(' https://code.foss.global/ship.zone/szci/issues');
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`Platform: ${binaryInfo.platform} (${binaryInfo.originalPlatform})`);
|
||||||
|
console.log(`Architecture: ${binaryInfo.arch}`);
|
||||||
|
console.log(`Binary: ${binaryInfo.binaryName}`);
|
||||||
|
console.log(`Version: ${VERSION}`);
|
||||||
|
console.log('');
|
||||||
|
|
||||||
|
// Create dist/binaries directory if it doesn't exist
|
||||||
|
const binariesDir = join(__dirname, '..', 'dist', 'binaries');
|
||||||
|
if (!existsSync(binariesDir)) {
|
||||||
|
console.log('Creating binaries directory...');
|
||||||
|
mkdirSync(binariesDir, { recursive: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
const binaryPath = join(binariesDir, binaryInfo.binaryName);
|
||||||
|
|
||||||
|
// Check if binary already exists and skip download
|
||||||
|
if (existsSync(binaryPath)) {
|
||||||
|
console.log('✓ Binary already exists, skipping download');
|
||||||
|
} else {
|
||||||
|
// Construct download URL
|
||||||
|
// Try release URL first, fall back to raw branch if needed
|
||||||
|
const releaseUrl = `${REPO_BASE}/releases/download/v${VERSION}/${binaryInfo.binaryName}`;
|
||||||
|
const fallbackUrl = `${REPO_BASE}/raw/branch/master/dist/binaries/${binaryInfo.binaryName}`;
|
||||||
|
|
||||||
|
console.log('Downloading platform-specific binary...');
|
||||||
|
console.log('This may take a moment depending on your connection speed.');
|
||||||
|
console.log('');
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Try downloading from release
|
||||||
|
await downloadFile(releaseUrl, binaryPath);
|
||||||
|
} catch (err) {
|
||||||
|
console.log(`Release download failed: ${err.message}`);
|
||||||
|
console.log('Trying fallback URL...');
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Try fallback URL
|
||||||
|
await downloadFile(fallbackUrl, binaryPath);
|
||||||
|
} catch (fallbackErr) {
|
||||||
|
console.error(`❌ Error: Failed to download binary`);
|
||||||
|
console.error(` Primary URL: ${releaseUrl}`);
|
||||||
|
console.error(` Fallback URL: ${fallbackUrl}`);
|
||||||
|
console.error('');
|
||||||
|
console.error('This might be because:');
|
||||||
|
console.error('1. The release has not been created yet');
|
||||||
|
console.error('2. Network connectivity issues');
|
||||||
|
console.error('3. The version specified does not exist');
|
||||||
|
console.error('');
|
||||||
|
console.error('You can try:');
|
||||||
|
console.error('1. Installing from source: https://code.foss.global/ship.zone/szci');
|
||||||
|
console.error('2. Downloading the binary manually from the releases page');
|
||||||
|
console.error('3. Building from source with: deno task compile');
|
||||||
|
|
||||||
|
// Clean up partial download
|
||||||
|
if (existsSync(binaryPath)) {
|
||||||
|
unlinkSync(binaryPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`✓ Binary downloaded successfully`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// On Unix-like systems, ensure the binary is executable
|
||||||
|
if (binaryInfo.originalPlatform !== 'win32') {
|
||||||
|
try {
|
||||||
|
console.log('Setting executable permissions...');
|
||||||
|
chmodSync(binaryPath, 0o755);
|
||||||
|
console.log('✓ Binary permissions updated');
|
||||||
|
} catch (err) {
|
||||||
|
console.error(`⚠️ Warning: Could not set executable permissions: ${err.message}`);
|
||||||
|
console.error(' You may need to manually run:');
|
||||||
|
console.error(` chmod +x ${binaryPath}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('');
|
||||||
|
console.log('✅ SZCI installation completed successfully!');
|
||||||
|
console.log('');
|
||||||
|
console.log('You can now use SZCI by running:');
|
||||||
|
console.log(' szci --help');
|
||||||
|
console.log('');
|
||||||
|
console.log('===========================================');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run the installation
|
||||||
|
main().catch(err => {
|
||||||
|
console.error(`❌ Installation failed: ${err.message}`);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
2
test/assets/Dockerfile_hello_##version##
Normal file
2
test/assets/Dockerfile_hello_##version##
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
FROM mygroup/myrepo:sometag2
|
||||||
|
RUN apt-get update
|
||||||
@@ -1 +1,9 @@
|
|||||||
{}
|
{
|
||||||
|
"gitzone": {
|
||||||
|
"module": {
|
||||||
|
"githost": "code.foss.global",
|
||||||
|
"gitscope": "mygroup",
|
||||||
|
"gitrepo": "myrepo"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
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"
|
||||||
|
}
|
||||||
|
}
|
||||||
29
test/test.cloudly.ts
Normal file
29
test/test.cloudly.ts
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
// Disable TLS certificate validation for testing
|
||||||
|
Deno.env.set('NODE_TLS_REJECT_UNAUTHORIZED', '0');
|
||||||
|
Deno.env.set('SZCI_TEST', 'true');
|
||||||
|
Deno.env.set('CI_REPOSITORY_URL', 'https://yyyyyy:xxxxxxxx@gitlab.com/mygroup/myrepo.git');
|
||||||
|
|
||||||
|
import { CloudlyConnector } from '../ts/connector.cloudly/cloudlyconnector.ts';
|
||||||
|
import { Szci } from '../ts/szci.classes.szci.ts';
|
||||||
|
|
||||||
|
Deno.test({
|
||||||
|
name: 'should be able to announce a container to cloudly',
|
||||||
|
sanitizeResources: false,
|
||||||
|
sanitizeOps: false,
|
||||||
|
fn: async () => {
|
||||||
|
// Create a proper Szci instance for the connector
|
||||||
|
const szciInstance = new Szci();
|
||||||
|
await szciInstance.start();
|
||||||
|
|
||||||
|
const cloudlyConnector = new CloudlyConnector(szciInstance);
|
||||||
|
await cloudlyConnector.announceDockerContainer(
|
||||||
|
{
|
||||||
|
registryUrl: 'registry.losssless.com',
|
||||||
|
tag: 'testcontainer',
|
||||||
|
version: 'x.x.x',
|
||||||
|
labels: [],
|
||||||
|
},
|
||||||
|
'cloudly.lossless.one'
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
1
test/test.d.ts
vendored
1
test/test.d.ts
vendored
@@ -1 +0,0 @@
|
|||||||
import 'typings-test';
|
|
||||||
88
test/test.js
88
test/test.js
@@ -1,88 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
require("typings-test");
|
|
||||||
const should = require("should");
|
|
||||||
const path = require("path");
|
|
||||||
// set up environment
|
|
||||||
process.env.CI_BUILD_REPO = '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/');
|
|
||||||
};
|
|
||||||
const NpmciBuildDocker = require("../dist/npmci.build.docker");
|
|
||||||
const NpmciPublish = require("../dist/npmci.publish");
|
|
||||||
const NpmciTest = require("../dist/npmci.test");
|
|
||||||
const NpmciSsh = require("../dist/npmci.ssh");
|
|
||||||
let dockerfile1;
|
|
||||||
let dockerfile2;
|
|
||||||
let sortableArray;
|
|
||||||
describe('NPMCI', function () {
|
|
||||||
describe('build.docker', function () {
|
|
||||||
it('should return valid Dockerfiles', function () {
|
|
||||||
dockerfile1 = new NpmciBuildDocker.Dockerfile({ filePath: './Dockerfile', read: true });
|
|
||||||
dockerfile2 = new NpmciBuildDocker.Dockerfile({ filePath: './Dockerfile_sometag1', read: true });
|
|
||||||
should(dockerfile1.version).equal('latest');
|
|
||||||
should(dockerfile2.version).equal('sometag1');
|
|
||||||
});
|
|
||||||
it('should read a directory of Dockerfiles', function (done) {
|
|
||||||
NpmciBuildDocker.readDockerfiles()
|
|
||||||
.then(function (readDockerfilesArrayArg) {
|
|
||||||
should(readDockerfilesArrayArg[1].version).equal('sometag1');
|
|
||||||
sortableArray = readDockerfilesArrayArg;
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
it('should sort an array of Dockerfiles', function (done) {
|
|
||||||
NpmciBuildDocker.sortDockerfiles(sortableArray)
|
|
||||||
.then(function (sortedArrayArg) {
|
|
||||||
console.log(sortedArrayArg);
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
it('should correctly chain Dockerfile handling', function (done) {
|
|
||||||
NpmciBuildDocker.build()
|
|
||||||
.then(() => {
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
describe('.publish.docker', function () {
|
|
||||||
it('should publish all built Dockerfiles', function (done) {
|
|
||||||
NpmciPublish.publish('docker')
|
|
||||||
.then(() => {
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
describe('.test.npm', function () {
|
|
||||||
it('should source nvm using bash and install a specific node version, then test it', function (done) {
|
|
||||||
NpmciTest.test('legacy')
|
|
||||||
.then(() => {
|
|
||||||
return NpmciTest.test('lts');
|
|
||||||
})
|
|
||||||
.then(() => {
|
|
||||||
return NpmciTest.test('stable');
|
|
||||||
})
|
|
||||||
.then(() => {
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
describe('test.docker', function () {
|
|
||||||
it('should test dockerfiles', function (done) {
|
|
||||||
NpmciTest.test('docker')
|
|
||||||
.then(() => {
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
describe('npmci prepare ssh', function () {
|
|
||||||
it('should pick up SSH keys', function (done) {
|
|
||||||
NpmciSsh.ssh()
|
|
||||||
.then(() => {
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdCQUFxQjtBQUNyQixpQ0FBZ0M7QUFDaEMsNkJBQTRCO0FBRTVCLHFCQUFxQjtBQUNyQixPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsR0FBRyx1REFBdUQsQ0FBQTtBQUNuRixPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsR0FBRywyQkFBMkIsQ0FBQTtBQUN4RCxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUE7QUFDL0IsT0FBTyxDQUFDLEdBQUcsR0FBRztJQUNWLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBQyxTQUFTLENBQUMsQ0FBQTtBQUN6QyxDQUFDLENBQUE7QUFJRCwrREFBK0Q7QUFDL0Qsc0RBQXNEO0FBQ3RELGdEQUFnRDtBQUNoRCw4Q0FBOEM7QUFHOUMsSUFBSSxXQUF3QyxDQUFBO0FBQzVDLElBQUksV0FBd0MsQ0FBQTtBQUM1QyxJQUFJLGFBQTRDLENBQUE7QUFFaEQsUUFBUSxDQUFDLE9BQU8sRUFBQztJQUNiLFFBQVEsQ0FBQyxjQUFjLEVBQUM7UUFDcEIsRUFBRSxDQUFDLGlDQUFpQyxFQUFDO1lBQ2pDLFdBQVcsR0FBRyxJQUFJLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxFQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7WUFDckYsV0FBVyxHQUFHLElBQUksZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEVBQUMsUUFBUSxFQUFFLHVCQUF1QixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO1lBQzlGLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQzNDLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ2pELENBQUMsQ0FBQyxDQUFBO1FBRUYsRUFBRSxDQUFDLHdDQUF3QyxFQUFDLFVBQVMsSUFBSTtZQUNyRCxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUU7aUJBQzdCLElBQUksQ0FBQyxVQUFTLHVCQUFzRDtnQkFDakUsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQTtnQkFDNUQsYUFBYSxHQUFHLHVCQUF1QixDQUFBO2dCQUN2QyxJQUFJLEVBQUUsQ0FBQTtZQUNWLENBQUMsQ0FBQyxDQUFBO1FBQ1YsQ0FBQyxDQUFDLENBQUE7UUFFRixFQUFFLENBQUMscUNBQXFDLEVBQUMsVUFBUyxJQUFJO1lBQ2xELGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUM7aUJBQzFDLElBQUksQ0FBQyxVQUFTLGNBQTZDO2dCQUN4RCxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFBO2dCQUMzQixJQUFJLEVBQUUsQ0FBQTtZQUNWLENBQUMsQ0FBQyxDQUFBO1FBQ1YsQ0FBQyxDQUFDLENBQUE7UUFFRixFQUFFLENBQUMsNENBQTRDLEVBQUUsVUFBUyxJQUFJO1lBQzFELGdCQUFnQixDQUFDLEtBQUssRUFBRTtpQkFDbkIsSUFBSSxDQUFDO2dCQUNGLElBQUksRUFBRSxDQUFBO1lBQ1YsQ0FBQyxDQUFDLENBQUE7UUFDVixDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUMsQ0FBQyxDQUFBO0lBRUYsUUFBUSxDQUFDLGlCQUFpQixFQUFDO1FBQ3ZCLEVBQUUsQ0FBQyxzQ0FBc0MsRUFBQyxVQUFTLElBQUk7WUFDbkQsWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7aUJBQ3pCLElBQUksQ0FBQztnQkFDRixJQUFJLEVBQUUsQ0FBQTtZQUNWLENBQUMsQ0FBQyxDQUFBO1FBQ1YsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDLENBQUMsQ0FBQTtJQUVGLFFBQVEsQ0FBQyxXQUFXLEVBQUM7UUFDakIsRUFBRSxDQUFDLGdGQUFnRixFQUFDLFVBQVMsSUFBSTtZQUM3RixTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztpQkFDbkIsSUFBSSxDQUFDO2dCQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ2hDLENBQUMsQ0FBQztpQkFDRCxJQUFJLENBQUM7Z0JBQ0YsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDbkMsQ0FBQyxDQUFDO2lCQUNELElBQUksQ0FBQztnQkFDRixJQUFJLEVBQUUsQ0FBQTtZQUNWLENBQUMsQ0FBQyxDQUFBO1FBQ1YsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDLENBQUMsQ0FBQTtJQUVGLFFBQVEsQ0FBQyxhQUFhLEVBQUM7UUFDbkIsRUFBRSxDQUFDLHlCQUF5QixFQUFDLFVBQVMsSUFBSTtZQUN0QyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztpQkFDbkIsSUFBSSxDQUFDO2dCQUNGLElBQUksRUFBRSxDQUFBO1lBQ1YsQ0FBQyxDQUFDLENBQUE7UUFDVixDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUMsQ0FBQyxDQUFBO0lBRUYsUUFBUSxDQUFDLG1CQUFtQixFQUFDO1FBQ3pCLEVBQUUsQ0FBQyx5QkFBeUIsRUFBQyxVQUFTLElBQUk7WUFDdEMsUUFBUSxDQUFDLEdBQUcsRUFBRTtpQkFDVCxJQUFJLENBQUM7Z0JBQ0YsSUFBSSxFQUFFLENBQUE7WUFDVixDQUFDLENBQUMsQ0FBQTtRQUNWLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUMsQ0FBQSJ9
|
|
||||||
235
test/test.ts
235
test/test.ts
@@ -1,100 +1,159 @@
|
|||||||
import 'typings-test'
|
import { assertEquals, assertExists } from '@std/assert';
|
||||||
import * as should from 'should'
|
import * as path from '@std/path';
|
||||||
import * as path from 'path'
|
import * as smartpath from '@push.rocks/smartpath';
|
||||||
|
|
||||||
// set up environment
|
// Set up test environment with the NEW SZCI environment variables
|
||||||
process.env.CI_BUILD_REPO = 'https://yyyyyy:xxxxxxxx@gitlab.com/mygroup/myrepo.git'
|
Deno.env.set('SZCI_TEST', 'true');
|
||||||
process.env.NPMCI_SSHKEY_1 = 'hostString|somePrivKey|##'
|
Deno.env.set('SZCI_URL_CLOUDLY', 'localhost');
|
||||||
process.env.NPMTS_TEST = 'true'
|
Deno.env.set('CI_REPOSITORY_URL', 'https://yyyyyy:xxxxxxxx@gitlab.com/mygroup/myrepo.git');
|
||||||
process.cwd = () => {
|
Deno.env.set('CI_BUILD_TOKEN', 'kjlkjfiudofiufs');
|
||||||
return path.join(__dirname,'assets/')
|
Deno.env.set('SZCI_LOGIN_DOCKER', 'docker.io|someuser|somepass');
|
||||||
}
|
Deno.env.set('SZCI_SSHKEY_1', 'hostString|somePrivKey|##');
|
||||||
|
|
||||||
// require NPMCI files
|
// Get the test assets directory
|
||||||
import npmci = require('../dist/index')
|
const testAssetsDir = path.join(smartpath.get.dirnameFromImportMetaUrl(import.meta.url), 'assets/');
|
||||||
import NpmciBuildDocker = require('../dist/npmci.build.docker')
|
|
||||||
import NpmciPublish = require('../dist/npmci.publish')
|
|
||||||
import NpmciTest = require('../dist/npmci.test')
|
|
||||||
import NpmciSsh = require('../dist/npmci.ssh')
|
|
||||||
|
|
||||||
|
// Save original cwd and change to test assets
|
||||||
|
const originalCwd = Deno.cwd();
|
||||||
|
Deno.chdir(testAssetsDir);
|
||||||
|
|
||||||
let dockerfile1: NpmciBuildDocker.Dockerfile
|
import type { Dockerfile } from '../ts/manager.docker/mod.classes.dockerfile.ts';
|
||||||
let dockerfile2: NpmciBuildDocker.Dockerfile
|
import { Szci } from '../ts/szci.classes.szci.ts';
|
||||||
let sortableArray: NpmciBuildDocker.Dockerfile[]
|
import * as DockerfileModule from '../ts/manager.docker/mod.classes.dockerfile.ts';
|
||||||
|
|
||||||
describe('NPMCI',function(){
|
// ======
|
||||||
describe('build.docker',function(){
|
// Docker
|
||||||
it('should return valid Dockerfiles',function(){
|
// ======
|
||||||
dockerfile1 = new NpmciBuildDocker.Dockerfile({filePath: './Dockerfile', read: true})
|
|
||||||
dockerfile2 = new NpmciBuildDocker.Dockerfile({filePath: './Dockerfile_sometag1', read: true})
|
|
||||||
should(dockerfile1.version).equal('latest')
|
|
||||||
should(dockerfile2.version).equal('sometag1')
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should read a directory of Dockerfiles',function(done){
|
let dockerfile1: Dockerfile;
|
||||||
NpmciBuildDocker.readDockerfiles()
|
let dockerfile2: Dockerfile;
|
||||||
.then(function(readDockerfilesArrayArg: NpmciBuildDocker.Dockerfile[]){
|
let sortableArray: Dockerfile[];
|
||||||
should(readDockerfilesArrayArg[1].version).equal('sometag1')
|
|
||||||
sortableArray = readDockerfilesArrayArg
|
|
||||||
done()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should sort an array of Dockerfiles',function(done){
|
Deno.test('should return valid Dockerfiles', async () => {
|
||||||
NpmciBuildDocker.sortDockerfiles(sortableArray)
|
const szciInstance = new Szci();
|
||||||
.then(function(sortedArrayArg: NpmciBuildDocker.Dockerfile[]){
|
await szciInstance.start();
|
||||||
console.log(sortedArrayArg)
|
dockerfile1 = new DockerfileModule.Dockerfile(szciInstance.dockerManager, {
|
||||||
done()
|
filePath: './Dockerfile',
|
||||||
})
|
read: true,
|
||||||
})
|
});
|
||||||
|
dockerfile2 = new DockerfileModule.Dockerfile(szciInstance.dockerManager, {
|
||||||
|
filePath: './Dockerfile_sometag1',
|
||||||
|
read: true,
|
||||||
|
});
|
||||||
|
assertEquals(dockerfile1.version, 'latest');
|
||||||
|
assertEquals(dockerfile2.version, 'sometag1');
|
||||||
|
});
|
||||||
|
|
||||||
it('should correctly chain Dockerfile handling', function(done){
|
Deno.test('should read a directory of Dockerfiles', async () => {
|
||||||
NpmciBuildDocker.build()
|
const szciInstance = new Szci();
|
||||||
.then(() => {
|
await szciInstance.start();
|
||||||
done()
|
const readDockerfilesArray = await DockerfileModule.Dockerfile.readDockerfiles(
|
||||||
})
|
szciInstance.dockerManager
|
||||||
})
|
);
|
||||||
})
|
sortableArray = readDockerfilesArray;
|
||||||
|
|
||||||
describe('.publish.docker',function(){
|
// The test assets directory should have multiple Dockerfiles
|
||||||
it('should publish all built Dockerfiles',function(done){
|
assertExists(readDockerfilesArray, 'readDockerfilesArray should exist');
|
||||||
NpmciPublish.publish('docker')
|
assertEquals(readDockerfilesArray.length > 0, true, 'Should find at least one Dockerfile');
|
||||||
.then(() => {
|
|
||||||
done()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('.test.npm',function(){
|
// Find the sometag1 dockerfile
|
||||||
it('should source nvm using bash and install a specific node version, then test it',function(done){
|
const sometag1Dockerfile = readDockerfilesArray.find(df => df.version === 'sometag1');
|
||||||
NpmciTest.test('legacy')
|
assertExists(sometag1Dockerfile, 'Should find Dockerfile_sometag1');
|
||||||
.then(() => {
|
assertEquals(sometag1Dockerfile?.version, 'sometag1');
|
||||||
return NpmciTest.test('lts')
|
});
|
||||||
})
|
|
||||||
.then(() => {
|
|
||||||
return NpmciTest.test('stable')
|
|
||||||
})
|
|
||||||
.then(() => {
|
|
||||||
done()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('test.docker',function(){
|
Deno.test('should sort an array of Dockerfiles', async () => {
|
||||||
it('should test dockerfiles',function(done){
|
// Use the sortableArray from previous test, or create a new one if empty
|
||||||
NpmciTest.test('docker')
|
if (!sortableArray || sortableArray.length === 0) {
|
||||||
.then(() => {
|
const szciInstance = new Szci();
|
||||||
done()
|
await szciInstance.start();
|
||||||
})
|
sortableArray = await DockerfileModule.Dockerfile.readDockerfiles(szciInstance.dockerManager);
|
||||||
})
|
}
|
||||||
})
|
|
||||||
|
|
||||||
describe('npmci prepare ssh',function(){
|
const sortedArray = await DockerfileModule.Dockerfile.sortDockerfiles(sortableArray);
|
||||||
it('should pick up SSH keys',function(done){
|
assertExists(sortedArray, 'sortedArray should exist');
|
||||||
NpmciSsh.ssh()
|
console.log('Sorted dockerfiles:', sortedArray.map(df => df.cleanTag));
|
||||||
.then(() => {
|
});
|
||||||
done()
|
|
||||||
})
|
Deno.test({
|
||||||
})
|
name: 'should build all Dockerfiles',
|
||||||
})
|
// Allow resource leaks since smartshell creates background processes
|
||||||
})
|
sanitizeResources: false,
|
||||||
|
sanitizeOps: false,
|
||||||
|
fn: async () => {
|
||||||
|
const szciInstance = new Szci();
|
||||||
|
await szciInstance.start();
|
||||||
|
await szciInstance.dockerManager.handleCli({
|
||||||
|
_: ['docker', 'build'],
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
Deno.test({
|
||||||
|
name: 'should test all Dockerfiles',
|
||||||
|
// Allow resource leaks since smartshell creates background processes
|
||||||
|
sanitizeResources: false,
|
||||||
|
sanitizeOps: false,
|
||||||
|
fn: async () => {
|
||||||
|
const szciInstance = new Szci();
|
||||||
|
await szciInstance.start();
|
||||||
|
await szciInstance.dockerManager.handleCli({
|
||||||
|
_: ['docker', 'test'],
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
Deno.test({
|
||||||
|
name: 'should login docker daemon',
|
||||||
|
// Allow resource leaks since smartshell creates background processes
|
||||||
|
sanitizeResources: false,
|
||||||
|
sanitizeOps: false,
|
||||||
|
fn: async () => {
|
||||||
|
const szciInstance = new Szci();
|
||||||
|
await szciInstance.start();
|
||||||
|
await szciInstance.dockerManager.handleCli({
|
||||||
|
_: ['docker', 'login'],
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
// ===
|
||||||
|
// SSH
|
||||||
|
// ===
|
||||||
|
Deno.test('should prepare SSH keys', async () => {
|
||||||
|
// Ensure test mode is set so we don't actually write to disk
|
||||||
|
Deno.env.set('SZCI_TEST', 'true');
|
||||||
|
|
||||||
|
const szciModSsh = await import('../ts/mod_ssh/index.ts');
|
||||||
|
await szciModSsh.handleCli({
|
||||||
|
_: ['ssh', 'prepare'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// ====
|
||||||
|
// node
|
||||||
|
// ====
|
||||||
|
Deno.test({
|
||||||
|
name: 'should install a certain version of node',
|
||||||
|
// Allow resource leaks for this test since nvm creates background processes
|
||||||
|
sanitizeResources: false,
|
||||||
|
sanitizeOps: false,
|
||||||
|
fn: async () => {
|
||||||
|
const szciInstance = new Szci();
|
||||||
|
await szciInstance.start();
|
||||||
|
await szciInstance.nodejsManager.handleCli({
|
||||||
|
_: ['node', 'install', 'stable'],
|
||||||
|
});
|
||||||
|
await szciInstance.nodejsManager.handleCli({
|
||||||
|
_: ['node', 'install', 'lts'],
|
||||||
|
});
|
||||||
|
await szciInstance.nodejsManager.handleCli({
|
||||||
|
_: ['node', 'install', 'legacy'],
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
// Restore original working directory after all tests
|
||||||
|
Deno.test('reset paths', () => {
|
||||||
|
Deno.chdir(originalCwd);
|
||||||
|
});
|
||||||
|
|||||||
8
ts/00_commitinfo_data.ts
Normal file
8
ts/00_commitinfo_data.ts
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
/**
|
||||||
|
* autocreated commitinfo by @push.rocks/commitinfo
|
||||||
|
*/
|
||||||
|
export const commitinfo = {
|
||||||
|
name: '@ship.zone/szci',
|
||||||
|
version: '7.1.1',
|
||||||
|
description: 'Serve Zone CI - A tool to streamline Node.js and Docker workflows within CI environments, particularly GitLab CI, providing various CI/CD utilities. Powered by Deno with standalone executables.'
|
||||||
|
}
|
||||||
31
ts/connector.cloudly/cloudlyconnector.ts
Normal file
31
ts/connector.cloudly/cloudlyconnector.ts
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
import * as plugins from '../szci.plugins.ts';
|
||||||
|
|
||||||
|
import { Szci } from '../szci.classes.szci.ts';
|
||||||
|
import { logger } from '../szci.logging.ts';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* connects to cloudly
|
||||||
|
*/
|
||||||
|
export class CloudlyConnector {
|
||||||
|
public szciRef: Szci;
|
||||||
|
|
||||||
|
constructor(szciRefArg: Szci) {
|
||||||
|
this.szciRef = szciRefArg;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async announceDockerContainer(
|
||||||
|
optionsArg: plugins.tsclass.container.IContainer,
|
||||||
|
testCloudlyUrlArg?: string
|
||||||
|
) {
|
||||||
|
const cloudlyUrl = testCloudlyUrlArg || this.szciRef.szciConfig.getConfig().urlCloudly;
|
||||||
|
if (!cloudlyUrl) {
|
||||||
|
logger.log(
|
||||||
|
'warn',
|
||||||
|
'no cloudly url provided. Thus we cannot announce the newly built Dockerimage!'
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// lets push to cloudly here
|
||||||
|
}
|
||||||
|
}
|
||||||
89
ts/index.ts
89
ts/index.ts
@@ -1,86 +1,9 @@
|
|||||||
import * as plugins from './npmci.plugins'
|
import { Szci } from './szci.classes.szci.ts';
|
||||||
import * as paths from './npmci.paths'
|
|
||||||
let npmciInfo = new plugins.projectinfo.ProjectinfoNpm(paths.NpmciPackageRoot)
|
|
||||||
plugins.beautylog.log('npmci version: ' + npmciInfo.version)
|
|
||||||
|
|
||||||
import {build} from './npmci.build'
|
export const szciInstance = new Szci();
|
||||||
import {clean} from './npmci.clean'
|
|
||||||
import {command} from './npmci.command'
|
|
||||||
import {install} from './npmci.install'
|
|
||||||
import {publish} from './npmci.publish'
|
|
||||||
import {prepare} from './npmci.prepare'
|
|
||||||
import {test} from './npmci.test'
|
|
||||||
import {trigger} from './npmci.trigger'
|
|
||||||
import * as NpmciEnv from './npmci.env'
|
|
||||||
|
|
||||||
export {build} from './npmci.build'
|
export { Szci };
|
||||||
export {install} from './npmci.install';
|
|
||||||
export {publish} from './npmci.publish';
|
|
||||||
|
|
||||||
let smartcli = new plugins.smartcli.Smartcli()
|
export const runCli = async () => {
|
||||||
smartcli.addVersion(npmciInfo.version)
|
await szciInstance.start();
|
||||||
|
};
|
||||||
// build
|
|
||||||
smartcli.addCommand({
|
|
||||||
commandName: 'build'
|
|
||||||
}).then((argv) => {
|
|
||||||
build(argv._[1])
|
|
||||||
.then(NpmciEnv.configStore)
|
|
||||||
})
|
|
||||||
|
|
||||||
// clean
|
|
||||||
smartcli.addCommand({
|
|
||||||
commandName: 'clean'
|
|
||||||
}).then((argv) => {
|
|
||||||
clean()
|
|
||||||
.then(NpmciEnv.configStore)
|
|
||||||
})
|
|
||||||
|
|
||||||
// command
|
|
||||||
smartcli.addCommand({
|
|
||||||
commandName: 'command'
|
|
||||||
}).then((argv) => {
|
|
||||||
command()
|
|
||||||
.then(NpmciEnv.configStore)
|
|
||||||
})
|
|
||||||
|
|
||||||
// install
|
|
||||||
smartcli.addCommand({
|
|
||||||
commandName: 'install'
|
|
||||||
}).then((argv) => {
|
|
||||||
install(argv._[1])
|
|
||||||
.then(NpmciEnv.configStore)
|
|
||||||
})
|
|
||||||
|
|
||||||
// prepare
|
|
||||||
smartcli.addCommand({
|
|
||||||
commandName: 'prepare'
|
|
||||||
}).then((argv) => {
|
|
||||||
prepare(argv._[1])
|
|
||||||
.then(NpmciEnv.configStore)
|
|
||||||
})
|
|
||||||
|
|
||||||
// publish
|
|
||||||
smartcli.addCommand({
|
|
||||||
commandName: 'publish'
|
|
||||||
}).then((argv) => {
|
|
||||||
publish(argv._[1])
|
|
||||||
.then(NpmciEnv.configStore)
|
|
||||||
})
|
|
||||||
|
|
||||||
// test
|
|
||||||
smartcli.addCommand({
|
|
||||||
commandName: 'test'
|
|
||||||
}).then((argv) => {
|
|
||||||
test(argv._[1])
|
|
||||||
.then(NpmciEnv.configStore)
|
|
||||||
})
|
|
||||||
|
|
||||||
// trigger
|
|
||||||
smartcli.addCommand({
|
|
||||||
commandName: 'trigger'
|
|
||||||
}).then((argv) => {
|
|
||||||
trigger()
|
|
||||||
})
|
|
||||||
|
|
||||||
smartcli.startParse()
|
|
||||||
|
|||||||
78
ts/manager.docker/index.ts
Normal file
78
ts/manager.docker/index.ts
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
import { logger } from '../szci.logging.ts';
|
||||||
|
import { bash } from '../szci.bash.ts';
|
||||||
|
import { Szci } from '../szci.classes.szci.ts';
|
||||||
|
|
||||||
|
export class SzciDockerManager {
|
||||||
|
public szciRef: Szci;
|
||||||
|
|
||||||
|
constructor(szciArg: Szci) {
|
||||||
|
this.szciRef = szciArg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bridges SZCI_LOGIN_DOCKER* env vars to DOCKER_REGISTRY_N format for tsdocker,
|
||||||
|
* and handles GitLab CI registry auto-login.
|
||||||
|
*/
|
||||||
|
private bridgeEnvVars() {
|
||||||
|
const env = Deno.env.toObject();
|
||||||
|
|
||||||
|
// Bridge GitLab CI registry as DOCKER_REGISTRY_0
|
||||||
|
if (env['GITLAB_CI']) {
|
||||||
|
const ciJobToken = env['CI_JOB_TOKEN'];
|
||||||
|
if (!ciJobToken) {
|
||||||
|
logger.log('error', 'Running in GitLab CI, but no CI_JOB_TOKEN found!');
|
||||||
|
Deno.exit(1);
|
||||||
|
}
|
||||||
|
Deno.env.set('DOCKER_REGISTRY_0', `registry.gitlab.com|gitlab-ci-token|${ciJobToken}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bridge SZCI_LOGIN_DOCKER* → DOCKER_REGISTRY_N
|
||||||
|
let registryIndex = 1;
|
||||||
|
const sortedKeys = Object.keys(env)
|
||||||
|
.filter((key) => key.startsWith('SZCI_LOGIN_DOCKER'))
|
||||||
|
.sort();
|
||||||
|
for (const key of sortedKeys) {
|
||||||
|
Deno.env.set(`DOCKER_REGISTRY_${registryIndex}`, env[key]);
|
||||||
|
registryIndex++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle cli input by bridging env vars and delegating to tsdocker.
|
||||||
|
*/
|
||||||
|
public handleCli = async (argvArg: any) => {
|
||||||
|
if (argvArg._.length < 2) {
|
||||||
|
logger.log(
|
||||||
|
'info',
|
||||||
|
`>>szci docker ...<< cli arguments invalid... Please read the documentation.`
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.bridgeEnvVars();
|
||||||
|
|
||||||
|
const action: string = argvArg._[1];
|
||||||
|
const extraArgs = argvArg._.slice(2).join(' ');
|
||||||
|
|
||||||
|
switch (action) {
|
||||||
|
case 'build':
|
||||||
|
await bash(`npx @git.zone/tsdocker build ${extraArgs}`.trim());
|
||||||
|
break;
|
||||||
|
case 'login':
|
||||||
|
case 'prepare':
|
||||||
|
await bash(`npx @git.zone/tsdocker login ${extraArgs}`.trim());
|
||||||
|
break;
|
||||||
|
case 'test':
|
||||||
|
await bash(`npx @git.zone/tsdocker test ${extraArgs}`.trim());
|
||||||
|
break;
|
||||||
|
case 'push':
|
||||||
|
await bash(`npx @git.zone/tsdocker push ${extraArgs}`.trim());
|
||||||
|
break;
|
||||||
|
case 'pull':
|
||||||
|
await bash(`npx @git.zone/tsdocker pull ${extraArgs}`.trim());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
logger.log('error', `>>szci docker ...<< action >>${action}<< not supported`);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
71
ts/manager.git/index.ts
Normal file
71
ts/manager.git/index.ts
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
import { logger } from '../szci.logging.ts';
|
||||||
|
import * as plugins from './mod.plugins.ts';
|
||||||
|
import { bash, bashNoError } from '../szci.bash.ts';
|
||||||
|
import { Szci } from '../szci.classes.szci.ts';
|
||||||
|
|
||||||
|
export class SzciGitManager {
|
||||||
|
public szciRef: Szci;
|
||||||
|
|
||||||
|
constructor(szciRefArg: Szci) {
|
||||||
|
this.szciRef = szciRefArg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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', `szci git -> action >>${action}<< not supported!`);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logger.log('info', `szci git -> cli arguments invalid! Please read the documentation.`);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public mirror = async () => {
|
||||||
|
const githubToken = Deno.env.get("SZCI_GIT_GITHUBTOKEN");
|
||||||
|
const githubUser = Deno.env.get("SZCI_GIT_GITHUBGROUP") || this.szciRef.szciEnv.repo.user;
|
||||||
|
const githubRepo = Deno.env.get("SZCI_GIT_GITHUB") || this.szciRef.szciEnv.repo.repo;
|
||||||
|
if (
|
||||||
|
this.szciRef.szciConfig.getConfig().projectInfo.npm.packageJson.private === true ||
|
||||||
|
this.szciRef.szciConfig.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 SZCI_GIT_GITHUBTOKEN env var!`);
|
||||||
|
Deno.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 '../szci.plugins.ts';
|
||||||
82
ts/manager.nodejs/index.ts
Normal file
82
ts/manager.nodejs/index.ts
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
import * as plugins from '../szci.plugins.ts';
|
||||||
|
import * as paths from '../szci.paths.ts';
|
||||||
|
|
||||||
|
import { logger } from '../szci.logging.ts';
|
||||||
|
import { bash, bashNoError, nvmAvailable } from '../szci.bash.ts';
|
||||||
|
import { Szci } from '../szci.classes.szci.ts';
|
||||||
|
|
||||||
|
export class SzciNodeJsManager {
|
||||||
|
public szciRef: Szci;
|
||||||
|
|
||||||
|
constructor(szciRefArg: Szci) {
|
||||||
|
this.szciRef = szciRefArg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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', `>>szci node ...<< action >>${action}<< not supported`);
|
||||||
|
Deno.exit(1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logger.log(
|
||||||
|
'error',
|
||||||
|
`>>szci node ...<< cli arguments invalid... Please read the documentation.`
|
||||||
|
);
|
||||||
|
Deno.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 = '22';
|
||||||
|
} else if (versionArg === 'lts') {
|
||||||
|
version = '20';
|
||||||
|
} else if (versionArg === 'legacy') {
|
||||||
|
version = '18';
|
||||||
|
} 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.szciRef.szciConfig.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!');
|
||||||
|
}
|
||||||
|
}
|
||||||
194
ts/manager.npm/index.ts
Normal file
194
ts/manager.npm/index.ts
Normal file
@@ -0,0 +1,194 @@
|
|||||||
|
import * as plugins from './mod.plugins.ts';
|
||||||
|
import * as paths from '../szci.paths.ts';
|
||||||
|
|
||||||
|
import { logger } from '../szci.logging.ts';
|
||||||
|
import { bash, bashNoError, nvmAvailable } from '../szci.bash.ts';
|
||||||
|
import { Szci } from '../szci.classes.szci.ts';
|
||||||
|
|
||||||
|
export class SzciNpmManager {
|
||||||
|
public szciRef: Szci;
|
||||||
|
|
||||||
|
constructor(szciRefArg: Szci) {
|
||||||
|
this.szciRef = szciRefArg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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', `>>szci npm ...<< action >>${action}<< not supported`);
|
||||||
|
Deno.exit(1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logger.log(
|
||||||
|
'info',
|
||||||
|
`>>szci npm ...<< cli arguments invalid... Please read the documentation.`
|
||||||
|
);
|
||||||
|
Deno.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* authenticates npm with token from env var
|
||||||
|
*/
|
||||||
|
public async prepare() {
|
||||||
|
logger.log('info', 'running >>npm prepare<<');
|
||||||
|
const config = this.szciRef.szciConfig.getConfig();
|
||||||
|
let npmrcFileString: string = '';
|
||||||
|
await plugins.smartobject.forEachMinimatch(
|
||||||
|
Deno.env.toObject(),
|
||||||
|
'SZCI_TOKEN_NPM*',
|
||||||
|
(npmEnvArg: string) => {
|
||||||
|
if (!npmEnvArg) {
|
||||||
|
logger.log('note','found empty token...');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
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!');
|
||||||
|
Deno.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.SzciCacheDir} --global `);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* publish a package to npm
|
||||||
|
*/
|
||||||
|
public async publish() {
|
||||||
|
const buildPublishCommand = async () => {
|
||||||
|
let npmAccessCliString = ``;
|
||||||
|
let npmRegistryCliString = ``;
|
||||||
|
let publishVerdaccioAsWell = false;
|
||||||
|
const config = this.szciRef.szciConfig.getConfig();
|
||||||
|
const availableRegistries: string[] = [];
|
||||||
|
await plugins.smartobject.forEachMinimatch(
|
||||||
|
Deno.env.toObject(),
|
||||||
|
'SZCI_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!`);
|
||||||
|
Deno.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 ./.szci_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 '../szci.plugins.ts';
|
||||||
97
ts/mod_ssh/index.ts
Normal file
97
ts/mod_ssh/index.ts
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
import { logger } from '../szci.logging.ts';
|
||||||
|
import * as plugins from './mod.plugins.ts';
|
||||||
|
|
||||||
|
let sshInstance: plugins.smartssh.SshInstance;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface for CLI arguments
|
||||||
|
*/
|
||||||
|
interface ICliArgs {
|
||||||
|
_: string[];
|
||||||
|
[key: string]: unknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle SSH CLI commands
|
||||||
|
*/
|
||||||
|
export const handleCli = async (argvArg: ICliArgs): Promise<void> => {
|
||||||
|
if (argvArg._.length >= 2) {
|
||||||
|
const action = argvArg._[1];
|
||||||
|
switch (action) {
|
||||||
|
case 'prepare':
|
||||||
|
await prepare();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
logger.log('error', `action >>${action}<< not supported`);
|
||||||
|
Deno.exit(1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logger.log('error', `>>szci ssh ...<< please specify an action!`);
|
||||||
|
Deno.exit(1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if a string value is defined and not a placeholder
|
||||||
|
*/
|
||||||
|
const isValidValue = (value: string | undefined): boolean => {
|
||||||
|
return Boolean(value && value !== 'undefined' && value !== '##');
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks for ENV vars in form of SZCI_SSHKEY_* and deploys any found ones
|
||||||
|
*/
|
||||||
|
export const prepare = async (): Promise<void> => {
|
||||||
|
sshInstance = new plugins.smartssh.SshInstance();
|
||||||
|
|
||||||
|
// Get all env vars and filter for SSH keys
|
||||||
|
const envVars = Deno.env.toObject();
|
||||||
|
const sshKeyEnvVars = Object.entries(envVars).filter(([key]) =>
|
||||||
|
key.startsWith('SZCI_SSHKEY_')
|
||||||
|
);
|
||||||
|
|
||||||
|
// Process each SSH key env var
|
||||||
|
for (const [key, value] of sshKeyEnvVars) {
|
||||||
|
logger.log('info', `Processing SSH key from ${key}`);
|
||||||
|
addSshKeyFromEnvVar(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only write to disk if not in test mode
|
||||||
|
if (!Deno.env.get('SZCI_TEST')) {
|
||||||
|
try {
|
||||||
|
sshInstance.writeToDisk();
|
||||||
|
logger.log('ok', 'SSH keys written to disk');
|
||||||
|
} catch (error) {
|
||||||
|
logger.log('error', `Failed to write SSH keys: ${(error as Error).message}`);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logger.log('info', 'In test mode, so not storing SSH keys to disk!');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses an SSH key env var and adds it to the SSH instance
|
||||||
|
* Format: host|privKeyBase64|pubKeyBase64
|
||||||
|
*/
|
||||||
|
const addSshKeyFromEnvVar = (sshkeyEnvVarArg: string): void => {
|
||||||
|
const [host, privKeyBase64, pubKeyBase64] = sshkeyEnvVarArg.split('|');
|
||||||
|
const sshKey = new plugins.smartssh.SshKey();
|
||||||
|
|
||||||
|
logger.log('info', `Found SSH identity for ${host || 'unknown host'}`);
|
||||||
|
|
||||||
|
if (isValidValue(host)) {
|
||||||
|
logger.log('info', '---> host defined!');
|
||||||
|
sshKey.host = host;
|
||||||
|
}
|
||||||
|
if (isValidValue(privKeyBase64)) {
|
||||||
|
logger.log('info', '---> privKey defined!');
|
||||||
|
sshKey.privKeyBase64 = privKeyBase64;
|
||||||
|
}
|
||||||
|
if (isValidValue(pubKeyBase64)) {
|
||||||
|
logger.log('info', '---> pubKey defined!');
|
||||||
|
sshKey.pubKeyBase64 = pubKeyBase64;
|
||||||
|
}
|
||||||
|
|
||||||
|
sshInstance.addKey(sshKey);
|
||||||
|
};
|
||||||
1
ts/mod_ssh/mod.plugins.ts
Normal file
1
ts/mod_ssh/mod.plugins.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export * from '../szci.plugins.ts';
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
import * as plugins from './npmci.plugins'
|
|
||||||
|
|
||||||
let nvmSourceString: string = ''
|
|
||||||
export let nvmAvailable: boolean = false
|
|
||||||
let checkNvm = () => {
|
|
||||||
if (plugins.shelljs.exec(`bash -c "source /usr/local/nvm/nvm.sh"`,{silent: true}).code === 0) {
|
|
||||||
nvmSourceString = `source /usr/local/nvm/nvm.sh && `
|
|
||||||
nvmAvailable = true
|
|
||||||
} else if (plugins.shelljs.exec(`bash -c "source ~/.nvm/nvm.sh"`,{silent: true}).code === 0) {
|
|
||||||
nvmSourceString = `source ~/.nvm/nvm.sh && `
|
|
||||||
nvmAvailable = true
|
|
||||||
};
|
|
||||||
}
|
|
||||||
checkNvm()
|
|
||||||
|
|
||||||
export let bash = (commandArg: string, retryArg = 2, bareArg = false): string => {
|
|
||||||
let exitCode: number
|
|
||||||
let stdOut: string
|
|
||||||
let execResult
|
|
||||||
if (!process.env.NPMTS_TEST) { // NPMTS_TEST is used during testing
|
|
||||||
for (let i = 0; i <= retryArg; i++) {
|
|
||||||
if (!bareArg) {
|
|
||||||
execResult = plugins.shelljs.exec(
|
|
||||||
`bash -c "${nvmSourceString} ${commandArg}"`
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
execResult = plugins.shelljs.exec(commandArg)
|
|
||||||
}
|
|
||||||
exitCode = execResult.code
|
|
||||||
stdOut = execResult.stdout
|
|
||||||
if (exitCode !== 0 && i === retryArg) {
|
|
||||||
process.exit(1)
|
|
||||||
} else if (exitCode === 0) {
|
|
||||||
i = retryArg + 1 // if everything works out ok retrials are not wanted
|
|
||||||
} else {
|
|
||||||
plugins.beautylog.warn('Something went wrong! Exit Code: ' + exitCode.toString())
|
|
||||||
plugins.beautylog.info('Retry ' + (i + 1).toString() + ' of ' + retryArg.toString())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
plugins.beautylog.log('ShellExec would be: ' + commandArg)
|
|
||||||
}
|
|
||||||
return stdOut
|
|
||||||
}
|
|
||||||
|
|
||||||
export let bashBare = (commandArg, retryArg = 2) => {
|
|
||||||
return bash(commandArg, retryArg, true)
|
|
||||||
}
|
|
||||||
@@ -1,293 +0,0 @@
|
|||||||
import * as plugins from './npmci.plugins'
|
|
||||||
import * as paths from './npmci.paths'
|
|
||||||
import * as NpmciEnv from './npmci.env'
|
|
||||||
import {bashBare} from './npmci.bash'
|
|
||||||
|
|
||||||
/**
|
|
||||||
* builds a cwd of Dockerfiles by triggering a promisechain
|
|
||||||
*/
|
|
||||||
export let build = function(){
|
|
||||||
let done = plugins.q.defer()
|
|
||||||
readDockerfiles()
|
|
||||||
.then(sortDockerfiles)
|
|
||||||
.then(mapDockerfiles)
|
|
||||||
.then(buildDockerfiles)
|
|
||||||
.then(pushDockerfiles)
|
|
||||||
.then(() => {
|
|
||||||
done.resolve()
|
|
||||||
})
|
|
||||||
return done.promise
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* creates instance of class Dockerfile for all Dockerfiles in cwd
|
|
||||||
* @returns Promise<Dockerfile[]>
|
|
||||||
*/
|
|
||||||
export let readDockerfiles = function(): plugins.q.Promise<Dockerfile[]>{
|
|
||||||
let done = plugins.q.defer<Dockerfile[]>()
|
|
||||||
let readDockerfilesArray: Dockerfile[] = []
|
|
||||||
plugins.gulp.src('./Dockerfile*')
|
|
||||||
.pipe(plugins.through2.obj(function(file,enc,cb){
|
|
||||||
let myDockerfile = new Dockerfile({
|
|
||||||
filePath: file.path,
|
|
||||||
read: true
|
|
||||||
})
|
|
||||||
readDockerfilesArray.push(myDockerfile)
|
|
||||||
cb(null,file)
|
|
||||||
},function(){
|
|
||||||
done.resolve(readDockerfilesArray)
|
|
||||||
}))
|
|
||||||
return done.promise
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* sorts Dockerfiles into a dependency chain
|
|
||||||
* @param sortableArrayArg an array of instances of class Dockerfile
|
|
||||||
* @returns Promise<Dockerfile[]>
|
|
||||||
*/
|
|
||||||
export let sortDockerfiles = function(sortableArrayArg: Dockerfile[]): plugins.q.Promise<Dockerfile[]>{
|
|
||||||
let done = plugins.q.defer<Dockerfile[]>()
|
|
||||||
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) {
|
|
||||||
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 = function(sortedArray: Dockerfile[]): plugins.q.Promise<Dockerfile[]>{
|
|
||||||
let done = plugins.q.defer<Dockerfile[]>()
|
|
||||||
sortedArray.forEach((dockerfileArg) => {
|
|
||||||
if (dockerfileArg.localBaseImageDependent) {
|
|
||||||
sortedArray.forEach((dockfile2: Dockerfile) => {
|
|
||||||
if (dockfile2.cleanTag === dockerfileArg.baseImage) {
|
|
||||||
dockerfileArg.localBaseDockerfile = dockfile2
|
|
||||||
}
|
|
||||||
})
|
|
||||||
};
|
|
||||||
})
|
|
||||||
done.resolve(sortedArray)
|
|
||||||
return done.promise
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* builds the correspoding real docker image for each Dockerfile class instance
|
|
||||||
*/
|
|
||||||
export let buildDockerfiles = (sortedArrayArg: Dockerfile[]) => {
|
|
||||||
let done = plugins.q.defer()
|
|
||||||
sortedArrayArg.forEach(function(dockerfileArg){
|
|
||||||
dockerfileArg.build()
|
|
||||||
})
|
|
||||||
done.resolve(sortedArrayArg)
|
|
||||||
return done.promise
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* pushes the real Dockerfile images to a Docker registry
|
|
||||||
*/
|
|
||||||
export let pushDockerfiles = function(sortedArrayArg: Dockerfile[]){
|
|
||||||
let done = plugins.q.defer()
|
|
||||||
sortedArrayArg.forEach(function(dockerfileArg){
|
|
||||||
dockerfileArg.push(NpmciEnv.buildStage)
|
|
||||||
})
|
|
||||||
done.resolve(sortedArrayArg)
|
|
||||||
return done.promise
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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 = (sortableArrayArg: Dockerfile[],registryArg = 'registry.gitlab.com') => {
|
|
||||||
let done = plugins.q.defer()
|
|
||||||
sortableArrayArg.forEach((dockerfileArg) => {
|
|
||||||
dockerfileArg.pull(registryArg)
|
|
||||||
})
|
|
||||||
done.resolve(sortableArrayArg)
|
|
||||||
return done.promise
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* tests all Dockerfiles in by calling class Dockerfile.test();
|
|
||||||
* @param sortedArrayArg Dockerfile[] that contains all Dockerfiles in cwd
|
|
||||||
*/
|
|
||||||
export let testDockerfiles = (sortedArrayArg: Dockerfile[]) => {
|
|
||||||
let done = plugins.q.defer()
|
|
||||||
sortedArrayArg.forEach(function(dockerfileArg){
|
|
||||||
dockerfileArg.test()
|
|
||||||
})
|
|
||||||
done.resolve(sortedArrayArg)
|
|
||||||
return done.promise
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* class Dockerfile represents a Dockerfile on disk in npmci
|
|
||||||
*/
|
|
||||||
export class Dockerfile {
|
|
||||||
filePath: string
|
|
||||||
repo: string
|
|
||||||
version: string
|
|
||||||
cleanTag: string
|
|
||||||
buildTag: string
|
|
||||||
testTag: 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.testTag = dockerTag('registry.gitlab.com',this.repo,this.version,'test')
|
|
||||||
this.releaseTag = dockerTag(NpmciEnv.dockerRegistry,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
|
|
||||||
*/
|
|
||||||
build() {
|
|
||||||
let done = plugins.q.defer()
|
|
||||||
plugins.beautylog.info('now building Dockerfile for ' + this.cleanTag)
|
|
||||||
bashBare('docker build -t ' + this.buildTag + ' -f ' + this.filePath + ' .')
|
|
||||||
NpmciEnv.dockerFilesBuilt.push(this)
|
|
||||||
done.resolve()
|
|
||||||
return done.promise
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* pushes the Dockerfile to a registry
|
|
||||||
*/
|
|
||||||
push(stageArg) {
|
|
||||||
let done = plugins.q.defer()
|
|
||||||
let pushTag
|
|
||||||
switch (stageArg) {
|
|
||||||
case 'release':
|
|
||||||
pushTag = this.releaseTag
|
|
||||||
break
|
|
||||||
case 'test':
|
|
||||||
default:
|
|
||||||
pushTag = this.testTag
|
|
||||||
break
|
|
||||||
}
|
|
||||||
bashBare('docker tag ' + this.buildTag + ' ' + pushTag)
|
|
||||||
bashBare('docker push ' + pushTag)
|
|
||||||
done.resolve()
|
|
||||||
return done.promise
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* pulls the Dockerfile from a registry
|
|
||||||
*/
|
|
||||||
pull(registryArg: string) {
|
|
||||||
let pullTag = this.testTag
|
|
||||||
bashBare('docker pull ' + pullTag)
|
|
||||||
bashBare('docker tag ' + pullTag + ' ' + this.buildTag)
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* tests the Dockerfile;
|
|
||||||
*/
|
|
||||||
test() {
|
|
||||||
let testFile: string = plugins.path.join(paths.NpmciTestDir,'test_' + this.version + '.sh')
|
|
||||||
let testFileExists: boolean = plugins.smartfile.fs.fileExistsSync(testFile)
|
|
||||||
if (testFileExists) {
|
|
||||||
bashBare('docker run --name npmci_test_container ' + this.buildTag + ' mkdir /npmci_test')
|
|
||||||
bashBare('docker cp ' + testFile + ' npmci_test_container:/npmci_test/test.sh')
|
|
||||||
bashBare('docker commit npmci_test_container npmci_test_image')
|
|
||||||
bashBare('docker run npmci_test_image sh /npmci_test/test.sh')
|
|
||||||
bashBare('docker rm npmci_test_container')
|
|
||||||
bashBare('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
|
|
||||||
*/
|
|
||||||
getId() {
|
|
||||||
let containerId = bashBare('docker inspect --type=image --format=\"{{.Id}}\" ' + this.buildTag)
|
|
||||||
return containerId
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
export let dockerFileVersion = function(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
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
export let dockerBaseImage = function(dockerfileContentArg: string){
|
|
||||||
let baseImageRegex = /FROM\s([a-zA-z0-9\/\-\:]*)\n?/
|
|
||||||
let regexResultArray = baseImageRegex.exec(dockerfileContentArg)
|
|
||||||
return regexResultArray[1]
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
export let dockerTag = function(registryArg: string,repoArg: string,versionArg: string,suffixArg?: string): string{
|
|
||||||
let tagString: string
|
|
||||||
let registry = registryArg
|
|
||||||
let repo = repoArg
|
|
||||||
let version = versionArg
|
|
||||||
if (suffixArg) {
|
|
||||||
version = versionArg + '_' + suffixArg
|
|
||||||
};
|
|
||||||
tagString = registry + '/' + repo + ':' + 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,22 +0,0 @@
|
|||||||
import * as plugins from './npmci.plugins'
|
|
||||||
import {bash} from './npmci.bash'
|
|
||||||
import * as env from './npmci.env'
|
|
||||||
import * as buildDocker from './npmci.build.docker'
|
|
||||||
|
|
||||||
/**
|
|
||||||
* defines possible build services
|
|
||||||
*/
|
|
||||||
export type TBuildService = 'docker';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* builds for a specific service
|
|
||||||
*/
|
|
||||||
export let build = function(commandArg): plugins.q.Promise<any> {
|
|
||||||
switch (commandArg) {
|
|
||||||
case 'docker':
|
|
||||||
return buildDocker.build()
|
|
||||||
default:
|
|
||||||
plugins.beautylog.log('build target ' + commandArg + ' not recognised!')
|
|
||||||
};
|
|
||||||
return
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
import * as plugins from './npmci.plugins'
|
|
||||||
import * as paths from './npmci.paths'
|
|
||||||
|
|
||||||
/**
|
|
||||||
* cleans npmci config files
|
|
||||||
*/
|
|
||||||
export let clean = () => {
|
|
||||||
let done = plugins.q.defer()
|
|
||||||
plugins.smartfile.fs.removeSync(paths.NpmciPackageConfig)
|
|
||||||
done.resolve()
|
|
||||||
return done.promise
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
import * as plugins from './npmci.plugins'
|
|
||||||
import {bash} from './npmci.bash'
|
|
||||||
|
|
||||||
export let command = () => {
|
|
||||||
let done = plugins.q.defer()
|
|
||||||
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 + ' ' }
|
|
||||||
}
|
|
||||||
bash(wrappedCommand)
|
|
||||||
done.resolve()
|
|
||||||
return done.promise
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
import * as q from 'q'
|
|
||||||
|
|
||||||
import * as plugins from './npmci.plugins'
|
|
||||||
import * as paths from './npmci.paths'
|
|
||||||
|
|
||||||
export interface INpmciOptions {
|
|
||||||
globalNpmTools: string[]
|
|
||||||
}
|
|
||||||
|
|
||||||
export let getConfig = () => {
|
|
||||||
let done = q.defer<INpmciOptions>()
|
|
||||||
let npmciNpmextra = new plugins.npmextra.Npmextra(paths.cwd)
|
|
||||||
let defaultConfig: INpmciOptions = {
|
|
||||||
globalNpmTools: []
|
|
||||||
}
|
|
||||||
let npmciConfig = npmciNpmextra.dataFor<INpmciOptions>('npmci', defaultConfig)
|
|
||||||
done.resolve(npmciConfig)
|
|
||||||
return done.promise
|
|
||||||
}
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
import * as plugins from './npmci.plugins'
|
|
||||||
import * as paths from './npmci.paths'
|
|
||||||
import {GitRepo} from 'smartstring'
|
|
||||||
import {Dockerfile} from './npmci.build.docker'
|
|
||||||
|
|
||||||
export let repo: GitRepo
|
|
||||||
if (process.env.CI_BUILD_REPO) repo = new GitRepo(process.env.CI_BUILD_REPO)
|
|
||||||
|
|
||||||
export let buildStage: string = process.env.CI_BUILD_STAGE
|
|
||||||
|
|
||||||
// handling config between commands
|
|
||||||
export let dockerRegistry: string // will be set by npmci.prepare
|
|
||||||
export let setDockerRegistry = (dockerRegistryArg: string) => {
|
|
||||||
dockerRegistry = dockerRegistryArg
|
|
||||||
}
|
|
||||||
export let dockerFilesBuilt: Dockerfile[] = []
|
|
||||||
export let dockerFiles: Dockerfile[] = []
|
|
||||||
export let config = {
|
|
||||||
dockerRegistry: undefined, // this will be set later on store
|
|
||||||
dockerFilesBuilt: dockerFilesBuilt,
|
|
||||||
dockerFiles: dockerFiles,
|
|
||||||
project: undefined
|
|
||||||
}
|
|
||||||
|
|
||||||
export let configStore = () => {
|
|
||||||
config.dockerRegistry = dockerRegistry
|
|
||||||
plugins.smartfile.memory.toFsSync(
|
|
||||||
JSON.stringify(config),
|
|
||||||
paths.NpmciPackageConfig
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
let configLoad = () => {
|
|
||||||
// internal config to transfer information in between npmci shell calls
|
|
||||||
try {
|
|
||||||
plugins.lodash.assign(config,plugins.smartfile.fs.toObjectSync(paths.NpmciPackageConfig,'json'))
|
|
||||||
}
|
|
||||||
catch (err) {
|
|
||||||
configStore()
|
|
||||||
plugins.beautylog.log('config initialized!')
|
|
||||||
}
|
|
||||||
|
|
||||||
// project config
|
|
||||||
try {
|
|
||||||
if (!config.project) {
|
|
||||||
config.project = plugins.smartfile.fs.toObjectSync(paths.NpmciProjectDir,'npmci.json')
|
|
||||||
plugins.beautylog.ok('project config found!')
|
|
||||||
};
|
|
||||||
}
|
|
||||||
catch (err) {
|
|
||||||
config.project = {}
|
|
||||||
plugins.beautylog.log('no project config found, so proceeding with default behaviour!')
|
|
||||||
}
|
|
||||||
|
|
||||||
config.dockerRegistry ? dockerRegistry = config.dockerRegistry : void(0)
|
|
||||||
config.dockerFilesBuilt ? dockerFilesBuilt = config.dockerFilesBuilt : void(0)
|
|
||||||
}
|
|
||||||
configLoad()
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
import * as plugins from './npmci.plugins'
|
|
||||||
import * as configModule from './npmci.config'
|
|
||||||
import { bash } from './npmci.bash'
|
|
||||||
import { nvmAvailable } from './npmci.bash'
|
|
||||||
export let install = (versionArg) => {
|
|
||||||
let done = plugins.q.defer()
|
|
||||||
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 (nvmAvailable) {
|
|
||||||
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!')
|
|
||||||
};
|
|
||||||
bash('node -v')
|
|
||||||
bash('npm -v')
|
|
||||||
|
|
||||||
// lets look for further config
|
|
||||||
configModule.getConfig()
|
|
||||||
.then(config => {
|
|
||||||
for (let npmTool of config.globalNpmTools) {
|
|
||||||
let whichOutput = bash(`which ${npmTool}`)
|
|
||||||
let toolAvailable: boolean = !(/not found/.test(whichOutput))
|
|
||||||
if (toolAvailable) {
|
|
||||||
plugins.beautylog.log(`Tool ${npmTool} is available`)
|
|
||||||
} else {
|
|
||||||
plugins.beautylog.info(`globally installing ${npmTool} from npm`)
|
|
||||||
bash(`npm install -q -g ${npmTool}`)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
done.resolve()
|
|
||||||
})
|
|
||||||
return done.promise
|
|
||||||
}
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
import * as plugins from './npmci.plugins'
|
|
||||||
|
|
||||||
export let cwd = process.cwd()
|
|
||||||
|
|
||||||
export let NpmciPackageRoot = plugins.path.join(__dirname,'../')
|
|
||||||
export let NpmciPackageConfig = plugins.path.join(NpmciPackageRoot,'./config.json')
|
|
||||||
export let NpmciProjectDir = cwd
|
|
||||||
export let NpmciTestDir = plugins.path.join(cwd,'./test')
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
export import beautylog = require('beautylog')
|
|
||||||
export let gulp = require('gulp')
|
|
||||||
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('q')
|
|
||||||
export let request = require('request')
|
|
||||||
export import shelljs = require('shelljs')
|
|
||||||
export import smartcli = require('smartcli')
|
|
||||||
export import smartfile = require('smartfile')
|
|
||||||
export import smartparam = require('smartparam')
|
|
||||||
export import smartsocket = require('smartsocket')
|
|
||||||
export import smartssh = require('smartssh')
|
|
||||||
export import smartstring = require('smartstring')
|
|
||||||
export import through2 = require('through2')
|
|
||||||
@@ -1,93 +0,0 @@
|
|||||||
import * as plugins from './npmci.plugins'
|
|
||||||
import {bash} from './npmci.bash'
|
|
||||||
import * as env from './npmci.env'
|
|
||||||
import * as sshModule from './npmci.ssh'
|
|
||||||
|
|
||||||
|
|
||||||
// types
|
|
||||||
|
|
||||||
/**
|
|
||||||
* defines possible prepare services
|
|
||||||
*/
|
|
||||||
export type TPrepService = 'npm' | 'docker' | 'docker-gitlab' | 'ssh';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* authenticates npm with token from env var
|
|
||||||
*/
|
|
||||||
let npm = function(){
|
|
||||||
let done = plugins.q.defer()
|
|
||||||
|
|
||||||
let npmrcPrefix: string = '//registry.npmjs.org/:_authToken='
|
|
||||||
let npmToken: string = 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')
|
|
||||||
done.resolve()
|
|
||||||
return done.promise
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* logs in docker
|
|
||||||
*/
|
|
||||||
let docker = function(){
|
|
||||||
let done = plugins.q.defer()
|
|
||||||
env.setDockerRegistry('docker.io')
|
|
||||||
let dockerRegex = /^([a-zA-Z0-9\.]*)\|([a-zA-Z0-9\.]*)/
|
|
||||||
if (!process.env.NPMCI_LOGIN_DOCKER) {
|
|
||||||
plugins.beautylog.error('You have to specify Login Data to the Docker Registry')
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
plugins.shelljs.exec('docker login -u gitlab-ci-token -p ' + process.env.CI_BUILD_TOKEN + ' ' + 'registry.gitlab.com') // Always also login to GitLab Registry
|
|
||||||
let dockerRegexResultArray = dockerRegex.exec(process.env.NPMCI_LOGIN_DOCKER)
|
|
||||||
let username = dockerRegexResultArray[1]
|
|
||||||
let password = dockerRegexResultArray[2]
|
|
||||||
plugins.shelljs.exec('docker login -u ' + username + ' -p ' + password)
|
|
||||||
done.resolve()
|
|
||||||
return done.promise
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* prepare docker for gitlab registry
|
|
||||||
*/
|
|
||||||
let dockerGitlab = function(){
|
|
||||||
let done = plugins.q.defer()
|
|
||||||
env.setDockerRegistry('registry.gitlab.com')
|
|
||||||
plugins.shelljs.exec('docker login -u gitlab-ci-token -p ' + process.env.CI_BUILD_TOKEN + ' ' + 'registry.gitlab.com')
|
|
||||||
done.resolve()
|
|
||||||
return done.promise
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* prepare ssh
|
|
||||||
*/
|
|
||||||
let ssh = function(){
|
|
||||||
let done = plugins.q.defer()
|
|
||||||
sshModule.ssh()
|
|
||||||
.then(done.resolve)
|
|
||||||
return done.promise
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* the main exported prepare function
|
|
||||||
* @param servieArg describes the service to prepare
|
|
||||||
*/
|
|
||||||
export let prepare = function(serviceArg: TPrepService){
|
|
||||||
switch (serviceArg) {
|
|
||||||
case 'npm':
|
|
||||||
return npm()
|
|
||||||
case 'docker':
|
|
||||||
return docker()
|
|
||||||
case 'docker-gitlab':
|
|
||||||
return dockerGitlab()
|
|
||||||
case 'ssh':
|
|
||||||
return ssh()
|
|
||||||
default:
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
import * as plugins from './npmci.plugins'
|
|
||||||
import {prepare} from './npmci.prepare'
|
|
||||||
import {bash} from './npmci.bash'
|
|
||||||
import * as NpmciEnv from './npmci.env'
|
|
||||||
import * as NpmciBuildDocker from './npmci.build.docker'
|
|
||||||
|
|
||||||
/**
|
|
||||||
* type of supported services
|
|
||||||
*/
|
|
||||||
export type TPubService = 'npm' | 'docker';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* the main exported publish function.
|
|
||||||
* @param pubServiceArg references targeted service to publish to
|
|
||||||
*/
|
|
||||||
export let publish = (pubServiceArg: TPubService = 'npm') => {
|
|
||||||
switch (pubServiceArg) {
|
|
||||||
case 'npm':
|
|
||||||
return publishNpm()
|
|
||||||
case 'docker':
|
|
||||||
return publishDocker()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* tries to publish current cwd to NPM registry
|
|
||||||
*/
|
|
||||||
let publishNpm = function(){
|
|
||||||
let done = plugins.q.defer()
|
|
||||||
prepare('npm')
|
|
||||||
.then(function(){
|
|
||||||
bash('npm publish')
|
|
||||||
plugins.beautylog.ok('Done!')
|
|
||||||
done.resolve()
|
|
||||||
})
|
|
||||||
return done.promise
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* tries to pubish current cwd to Docker registry
|
|
||||||
*/
|
|
||||||
let publishDocker = function(){
|
|
||||||
let done = plugins.q.defer()
|
|
||||||
NpmciBuildDocker.readDockerfiles()
|
|
||||||
.then(NpmciBuildDocker.pullDockerfileImages)
|
|
||||||
.then(NpmciBuildDocker.pushDockerfiles)
|
|
||||||
.then(done.resolve)
|
|
||||||
return done.promise
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
import * as plugins from './npmci.plugins'
|
|
||||||
|
|
||||||
/**
|
|
||||||
* servezoneRegex is the regex that parses the servezone connection data
|
|
||||||
* parses strings in the form of "servezone.example.com|3000|somepassword"
|
|
||||||
*/
|
|
||||||
let servezoneRegex = /^(.*)\|(.*)\|(.*)/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* holds the results of the parsed servezone env string
|
|
||||||
*/
|
|
||||||
let servezoneRegexResultArray = servezoneRegex.exec(process.env.NPMCI_SERVEZONE)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* the data object that is used for the smartsocket client object
|
|
||||||
*/
|
|
||||||
let smartsocketClientConstructorOptions = {
|
|
||||||
alias: 'npmci',
|
|
||||||
password: servezoneRegexResultArray[3],
|
|
||||||
port: parseInt(servezoneRegexResultArray[2]),
|
|
||||||
role: 'ci',
|
|
||||||
url: servezoneRegexResultArray[1]
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* the main run function to submit a service to a servezone
|
|
||||||
*/
|
|
||||||
export let run = (configArg) => {
|
|
||||||
new plugins.smartsocket.SmartsocketClient(
|
|
||||||
smartsocketClientConstructorOptions
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
import * as plugins from './npmci.plugins'
|
|
||||||
|
|
||||||
let sshRegex = /^(.*)\|(.*)\|(.*)/
|
|
||||||
let sshInstance: plugins.smartssh.SshInstance
|
|
||||||
|
|
||||||
/**
|
|
||||||
* checks for ENV vars in form of NPMCI_SSHKEY_* and deploys any found ones
|
|
||||||
*/
|
|
||||||
export let ssh = () => {
|
|
||||||
let done = plugins.q.defer()
|
|
||||||
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!')
|
|
||||||
};
|
|
||||||
done.resolve()
|
|
||||||
return done.promise
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gets called for each found SSH ENV Var and deploys it
|
|
||||||
*/
|
|
||||||
let evaluateSshEnv = (sshkeyEnvVarArg) => {
|
|
||||||
let resultArray = sshRegex.exec(sshkeyEnvVarArg)
|
|
||||||
let sshKey = new plugins.smartssh.SshKey()
|
|
||||||
plugins.beautylog.info('Found SSH identity for ' + resultArray[1])
|
|
||||||
if (notUndefined(resultArray[1])) {
|
|
||||||
plugins.beautylog.log('---> host defined!')
|
|
||||||
sshKey.host = resultArray[1]
|
|
||||||
}
|
|
||||||
if (notUndefined(resultArray[2])) {
|
|
||||||
plugins.beautylog.log('---> privKey defined!')
|
|
||||||
sshKey.privKeyBase64 = resultArray[2]
|
|
||||||
};
|
|
||||||
if (notUndefined(resultArray[3])) {
|
|
||||||
'---> pubKey defined!'
|
|
||||||
sshKey.pubKeyBase64 = resultArray[3]
|
|
||||||
};
|
|
||||||
|
|
||||||
sshInstance.addKey(sshKey)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* checks if not undefined
|
|
||||||
*/
|
|
||||||
let notUndefined = (stringArg: string) => {
|
|
||||||
return (stringArg && stringArg !== 'undefined' && stringArg !== '##')
|
|
||||||
}
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
import * as plugins from './npmci.plugins'
|
|
||||||
import {bash} from './npmci.bash'
|
|
||||||
import {install} from './npmci.install'
|
|
||||||
import * as env from './npmci.env'
|
|
||||||
import * as NpmciBuildDocker from './npmci.build.docker'
|
|
||||||
|
|
||||||
export let test = (versionArg) => {
|
|
||||||
let done = plugins.q.defer()
|
|
||||||
if (versionArg === 'docker') {
|
|
||||||
testDocker()
|
|
||||||
.then(() => {
|
|
||||||
done.resolve()
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
install(versionArg)
|
|
||||||
.then(npmDependencies)
|
|
||||||
.then(npmTest)
|
|
||||||
.then(() => {
|
|
||||||
done.resolve()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return done.promise
|
|
||||||
}
|
|
||||||
|
|
||||||
let npmDependencies = function(){
|
|
||||||
let done = plugins.q.defer()
|
|
||||||
plugins.beautylog.info('now installing dependencies:')
|
|
||||||
bash('npm install')
|
|
||||||
done.resolve()
|
|
||||||
return done.promise
|
|
||||||
}
|
|
||||||
|
|
||||||
let npmTest = () => {
|
|
||||||
let done = plugins.q.defer()
|
|
||||||
plugins.beautylog.info('now starting tests:')
|
|
||||||
bash('npm test')
|
|
||||||
done.resolve()
|
|
||||||
return done.promise
|
|
||||||
}
|
|
||||||
|
|
||||||
let testDocker = function(){
|
|
||||||
let done = plugins.q.defer()
|
|
||||||
NpmciBuildDocker.readDockerfiles()
|
|
||||||
.then(NpmciBuildDocker.pullDockerfileImages)
|
|
||||||
.then(NpmciBuildDocker.testDockerfiles)
|
|
||||||
.then(done.resolve)
|
|
||||||
return done.promise
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
import * as plugins from './npmci.plugins'
|
|
||||||
import { prepare } from './npmci.prepare'
|
|
||||||
import { bash } from './npmci.bash'
|
|
||||||
|
|
||||||
let triggerValueRegex = /^([a-zA-Z0-9\.]*)\|([a-zA-Z0-9\.]*)\|([a-zA-Z0-9\.]*)\|([a-zA-Z0-9\.]*)\|?([a-zA-Z0-9\.\-\/]*)/
|
|
||||||
|
|
||||||
export let trigger = function () {
|
|
||||||
let done = plugins.q.defer()
|
|
||||||
plugins.beautylog.info('now running triggers')
|
|
||||||
plugins.smartparam.forEachMinimatch(process.env, 'NPMCI_TRIGGER_*', evaluateTrigger)
|
|
||||||
done.resolve()
|
|
||||||
return done.promise
|
|
||||||
}
|
|
||||||
|
|
||||||
let evaluateTrigger = (triggerEnvVarArg) => {
|
|
||||||
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 } })
|
|
||||||
}
|
|
||||||
96
ts/szci.bash.ts
Normal file
96
ts/szci.bash.ts
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
import { logger } from './szci.logging.ts';
|
||||||
|
import * as plugins from './szci.plugins.ts';
|
||||||
|
import * as paths from './szci.paths.ts';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wether nvm is available or not
|
||||||
|
*/
|
||||||
|
export let nvmAvailable = plugins.smartpromise.defer<boolean>();
|
||||||
|
/**
|
||||||
|
* the smartshell instance for szci
|
||||||
|
*/
|
||||||
|
const szciSmartshell = new plugins.smartshell.Smartshell({
|
||||||
|
executor: 'bash',
|
||||||
|
sourceFilePaths: [],
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check for tools.
|
||||||
|
*/
|
||||||
|
const checkToolsAvailable = async () => {
|
||||||
|
// check for nvm
|
||||||
|
if (!Deno.env.get('SZCI_TEST')) {
|
||||||
|
if (
|
||||||
|
(await szciSmartshell.execSilent(`bash -c "source /usr/local/nvm/nvm.sh"`)).exitCode === 0
|
||||||
|
) {
|
||||||
|
szciSmartshell.shellEnv.addSourceFiles([`/usr/local/nvm/nvm.sh`]);
|
||||||
|
nvmAvailable.resolve(true);
|
||||||
|
} else if (
|
||||||
|
(await szciSmartshell.execSilent(`bash -c "source ~/.nvm/nvm.sh"`)).exitCode === 0
|
||||||
|
) {
|
||||||
|
szciSmartshell.shellEnv.addSourceFiles([`~/.nvm/nvm.sh`]);
|
||||||
|
nvmAvailable.resolve(true);
|
||||||
|
} else {
|
||||||
|
nvmAvailable.resolve(false);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
nvmAvailable.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
|
||||||
|
*/
|
||||||
|
export let bash = async (commandArg: string, retryArg: number = 2): Promise<string> => {
|
||||||
|
await nvmAvailable.promise; // make sure nvm check has run
|
||||||
|
let execResult!: plugins.smartshell.IExecResult;
|
||||||
|
|
||||||
|
// determine if we fail
|
||||||
|
let failOnError: boolean = true;
|
||||||
|
if (retryArg === -1) {
|
||||||
|
failOnError = false;
|
||||||
|
retryArg = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Deno.env.get('SZCI_TEST')) {
|
||||||
|
// SZCI_TEST is used during testing
|
||||||
|
for (let i = 0; i <= retryArg; i++) {
|
||||||
|
if (Deno.env.get('DEBUG_SZCI') === 'true') {
|
||||||
|
console.log(commandArg);
|
||||||
|
}
|
||||||
|
execResult = await szciSmartshell.exec(commandArg);
|
||||||
|
|
||||||
|
// determine how bash reacts to error and success
|
||||||
|
if (execResult.exitCode !== 0 && i === retryArg) {
|
||||||
|
// something went wrong and retries are exhausted
|
||||||
|
if (failOnError) {
|
||||||
|
logger.log('error', 'something went wrong and retries are exhausted');
|
||||||
|
Deno.exit(1);
|
||||||
|
}
|
||||||
|
} else if (execResult.exitCode === 0) {
|
||||||
|
// everything went fine, or no error wanted
|
||||||
|
i = retryArg + 1; // retry +1 breaks for loop, if everything works out ok retrials are not wanted
|
||||||
|
} else {
|
||||||
|
logger.log('warn', 'Something went wrong! Exit Code: ' + execResult.exitCode.toString());
|
||||||
|
logger.log('info', 'Retry ' + (i + 1).toString() + ' of ' + retryArg.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logger.log('info', 'ShellExec would be: ' + commandArg);
|
||||||
|
execResult = {
|
||||||
|
exitCode: 0,
|
||||||
|
stdout: 'testOutput',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return execResult.stdout;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* bashNoError allows executing stuff without throwing an error
|
||||||
|
*/
|
||||||
|
export let bashNoError = async (commandArg: string): Promise<string> => {
|
||||||
|
return await bash(commandArg, -1);
|
||||||
|
};
|
||||||
58
ts/szci.classes.szci.ts
Normal file
58
ts/szci.classes.szci.ts
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
import * as plugins from './szci.plugins.ts';
|
||||||
|
|
||||||
|
|
||||||
|
// env
|
||||||
|
import { SzciEnv } from './szci.classes.szcienv.ts';
|
||||||
|
import { SzciInfo } from './szci.classes.szciinfo.ts';
|
||||||
|
import { SzciCli } from './szci.classes.szcicli.ts';
|
||||||
|
import { SzciConfig } from './szci.classes.szciconfig.ts';
|
||||||
|
|
||||||
|
// connectors
|
||||||
|
import { CloudlyConnector } from './connector.cloudly/cloudlyconnector.ts';
|
||||||
|
|
||||||
|
// managers
|
||||||
|
import { SzciDockerManager } from './manager.docker/index.ts';
|
||||||
|
import { SzciGitManager } from './manager.git/index.ts';
|
||||||
|
import { SzciNodeJsManager } from './manager.nodejs/index.ts';
|
||||||
|
import { SzciNpmManager } from './manager.npm/index.ts';
|
||||||
|
|
||||||
|
export class Szci {
|
||||||
|
public analytics: plugins.smartanalytics.Analytics;
|
||||||
|
public cloudlyConnector!: CloudlyConnector;
|
||||||
|
|
||||||
|
public szciEnv!: SzciEnv;
|
||||||
|
public szciInfo!: SzciInfo;
|
||||||
|
public szciConfig!: SzciConfig;
|
||||||
|
public szciCli!: SzciCli;
|
||||||
|
|
||||||
|
// managers
|
||||||
|
public dockerManager!: SzciDockerManager;
|
||||||
|
public gitManager!: SzciGitManager;
|
||||||
|
public nodejsManager!: SzciNodeJsManager;
|
||||||
|
public npmManager!: SzciNpmManager;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.analytics = new plugins.smartanalytics.Analytics({
|
||||||
|
apiEndPoint: 'https://pubapi.lossless.one/analytics',
|
||||||
|
projectId: 'gitzone',
|
||||||
|
appName: 'szci',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public async start() {
|
||||||
|
this.cloudlyConnector = new CloudlyConnector(this);
|
||||||
|
this.szciEnv = new SzciEnv(this);
|
||||||
|
this.szciInfo = new SzciInfo(this);
|
||||||
|
await this.szciInfo.printToConsole();
|
||||||
|
this.szciCli = new SzciCli(this);
|
||||||
|
this.szciConfig = new SzciConfig(this);
|
||||||
|
await this.szciConfig.init();
|
||||||
|
|
||||||
|
// managers
|
||||||
|
this.dockerManager = new SzciDockerManager(this);
|
||||||
|
this.gitManager = new SzciGitManager(this);
|
||||||
|
this.nodejsManager = new SzciNodeJsManager(this);
|
||||||
|
this.npmManager = new SzciNpmManager(this);
|
||||||
|
this.szciCli.startParse();
|
||||||
|
}
|
||||||
|
}
|
||||||
68
ts/szci.classes.szcicli.ts
Normal file
68
ts/szci.classes.szcicli.ts
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
import { logger } from './szci.logging.ts';
|
||||||
|
import * as plugins from './szci.plugins.ts';
|
||||||
|
import * as paths from './szci.paths.ts';
|
||||||
|
import { Szci } from './szci.classes.szci.ts';
|
||||||
|
|
||||||
|
export class SzciCli {
|
||||||
|
public szciRef: Szci;
|
||||||
|
public smartcli: plugins.smartcli.Smartcli;
|
||||||
|
|
||||||
|
constructor(szciArg: Szci) {
|
||||||
|
this.szciRef = szciArg;
|
||||||
|
this.smartcli = new plugins.smartcli.Smartcli();
|
||||||
|
this.smartcli.addVersion(this.szciRef.szciInfo.version);
|
||||||
|
|
||||||
|
// docker
|
||||||
|
this.smartcli.addCommand('docker').subscribe(
|
||||||
|
async (argvArg) => {
|
||||||
|
await this.szciRef.dockerManager.handleCli(argvArg);
|
||||||
|
},
|
||||||
|
(err) => {
|
||||||
|
console.log(err);
|
||||||
|
Deno.exit(1);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// git
|
||||||
|
this.smartcli.addCommand('git').subscribe(
|
||||||
|
async (argvArg) => {
|
||||||
|
await this.szciRef.gitManager.handleCli(argvArg);
|
||||||
|
},
|
||||||
|
(err) => {
|
||||||
|
console.log(err);
|
||||||
|
Deno.exit(1);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// node
|
||||||
|
this.smartcli.addCommand('node').subscribe(
|
||||||
|
async (argvArg) => {
|
||||||
|
await this.szciRef.nodejsManager.handleCli(argvArg);
|
||||||
|
},
|
||||||
|
(err) => {
|
||||||
|
console.log(err);
|
||||||
|
Deno.exit(1);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// npm
|
||||||
|
this.smartcli.addCommand('npm').subscribe(
|
||||||
|
async (argvArg) => {
|
||||||
|
await this.szciRef.npmManager.handleCli(argvArg);
|
||||||
|
},
|
||||||
|
(err) => {
|
||||||
|
console.log(err);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// ssh
|
||||||
|
this.smartcli.addCommand('ssh').subscribe(async (argvArg) => {
|
||||||
|
const modSsh = await import('./mod_ssh/index.ts');
|
||||||
|
await modSsh.handleCli(argvArg);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public startParse = () => {
|
||||||
|
this.smartcli.startParse();
|
||||||
|
};
|
||||||
|
}
|
||||||
63
ts/szci.classes.szciconfig.ts
Normal file
63
ts/szci.classes.szciconfig.ts
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
import * as plugins from './szci.plugins.ts';
|
||||||
|
import * as paths from './szci.paths.ts';
|
||||||
|
|
||||||
|
import { logger } from './szci.logging.ts';
|
||||||
|
import { Szci } from './szci.classes.szci.ts';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* the main config interface for szci
|
||||||
|
*/
|
||||||
|
export interface ISzciOptions {
|
||||||
|
projectInfo: plugins.projectinfo.ProjectInfo;
|
||||||
|
|
||||||
|
// npm
|
||||||
|
npmGlobalTools: string[];
|
||||||
|
npmAccessLevel?: 'private' | 'public';
|
||||||
|
npmRegistryUrl: string;
|
||||||
|
|
||||||
|
// urls
|
||||||
|
urlCloudly?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* a config class for Szci
|
||||||
|
*/
|
||||||
|
export class SzciConfig {
|
||||||
|
public szciRef: Szci;
|
||||||
|
|
||||||
|
public szciNpmextra!: plugins.npmextra.Npmextra;
|
||||||
|
public kvStorage!: plugins.npmextra.KeyValueStore;
|
||||||
|
public szciQenv!: plugins.qenv.Qenv;
|
||||||
|
|
||||||
|
private configObject!: ISzciOptions;
|
||||||
|
|
||||||
|
constructor(szciRefArg: Szci) {
|
||||||
|
this.szciRef = szciRefArg;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async init() {
|
||||||
|
this.szciNpmextra = new plugins.npmextra.Npmextra(paths.cwd);
|
||||||
|
this.kvStorage = new plugins.npmextra.KeyValueStore({
|
||||||
|
typeArg: 'userHomeDir',
|
||||||
|
identityArg: `.szci_${this.szciRef.szciEnv.repo.user}_${this.szciRef.szciEnv.repo.repo}`,
|
||||||
|
});
|
||||||
|
this.szciQenv = new plugins.qenv.Qenv(
|
||||||
|
paths.SzciProjectDir,
|
||||||
|
paths.SzciProjectNogitDir,
|
||||||
|
false
|
||||||
|
);
|
||||||
|
|
||||||
|
this.configObject = {
|
||||||
|
projectInfo: new plugins.projectinfo.ProjectInfo(paths.cwd),
|
||||||
|
npmGlobalTools: [],
|
||||||
|
npmAccessLevel: 'private',
|
||||||
|
npmRegistryUrl: 'registry.npmjs.org',
|
||||||
|
urlCloudly: await this.szciQenv.getEnvVarOnDemand('SZCI_URL_CLOUDLY'),
|
||||||
|
};
|
||||||
|
this.configObject = this.szciNpmextra.dataFor<ISzciOptions>('@ship.zone/szci', this.configObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
public getConfig(): ISzciOptions {
|
||||||
|
return this.configObject;
|
||||||
|
}
|
||||||
|
}
|
||||||
25
ts/szci.classes.szcienv.ts
Normal file
25
ts/szci.classes.szcienv.ts
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
import * as plugins from './szci.plugins.ts';
|
||||||
|
import { Szci } from './szci.classes.szci.ts';
|
||||||
|
|
||||||
|
export class SzciEnv {
|
||||||
|
public szciRef: Szci;
|
||||||
|
|
||||||
|
public repoString: string;
|
||||||
|
public repo: plugins.smartstring.GitRepo;
|
||||||
|
|
||||||
|
constructor(szciRefArg: Szci) {
|
||||||
|
this.szciRef = szciRefArg;
|
||||||
|
|
||||||
|
// Determine repo string from environment
|
||||||
|
let repoUrl: string | undefined;
|
||||||
|
if (Deno.env.get("GITLAB_CI")) {
|
||||||
|
repoUrl = Deno.env.get("CI_REPOSITORY_URL");
|
||||||
|
}
|
||||||
|
if (!repoUrl && Deno.env.get("SZCI_COMPUTED_REPOURL")) {
|
||||||
|
repoUrl = Deno.env.get("SZCI_COMPUTED_REPOURL");
|
||||||
|
}
|
||||||
|
|
||||||
|
this.repoString = repoUrl || 'https://undefined:undefined@github.com/undefined/undefined.git';
|
||||||
|
this.repo = new plugins.smartstring.GitRepo(this.repoString);
|
||||||
|
}
|
||||||
|
}
|
||||||
18
ts/szci.classes.szciinfo.ts
Normal file
18
ts/szci.classes.szciinfo.ts
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
import * as plugins from './szci.plugins.ts';
|
||||||
|
import * as paths from './szci.paths.ts';
|
||||||
|
import { logger } from './szci.logging.ts';
|
||||||
|
import { Szci } from './szci.classes.szci.ts';
|
||||||
|
import denoConfig from '../deno.json' with { type: 'json' };
|
||||||
|
|
||||||
|
export class SzciInfo {
|
||||||
|
public szciRef: Szci;
|
||||||
|
public version = denoConfig.version;
|
||||||
|
|
||||||
|
constructor(szciArg: Szci) {
|
||||||
|
this.szciRef = szciArg;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async printToConsole() {
|
||||||
|
await logger.log('info', `szci version: ${this.version}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
14
ts/szci.logging.ts
Normal file
14
ts/szci.logging.ts
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import * as plugins from './szci.plugins.ts';
|
||||||
|
|
||||||
|
export const logger = new plugins.smartlog.Smartlog({
|
||||||
|
logContext: {
|
||||||
|
company: 'Some Company',
|
||||||
|
companyunit: 'Some Unit',
|
||||||
|
containerName: 'Some ContainerName',
|
||||||
|
environment: 'test',
|
||||||
|
runtime: 'deno',
|
||||||
|
zone: 'Some Zone',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
logger.addLogDestination(new plugins.smartlogDestinationLocal.DestinationLocal());
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user