# @ship.zone/npmci A tool to enhance Node.js and Docker workflows within GitLab CI, providing various CI/CD utilities. ## Install To install `@ship.zone/npmci`, you can use npm or yarn: ```sh # Using npm npm install @ship.zone/npmci # Using yarn yarn add @ship.zone/npmci ``` ## Usage `npmci` is designed to streamline CI/CD processes, particularly in Docker and Node.js environments. The following sections illustrate its usage in various scenarios, from handling Node versions to building Docker images and more. ### 1. Integration with GitLab CI, GitHub CI, and Gitea CI #### GitLab CI An example of integrating `npmci` into a GitLab CI configuration could look like this: ```yaml image: hosttoday/ht-docker-node:npmci stages: - prepare - build - test - deploy default: before_script: - npmci node install stable - npmci npm install prepare: stage: prepare script: - npmci prepare npm - npmci prepare docker build: stage: build script: - npmci docker build test: stage: test script: - npmci npm test deploy: stage: deploy script: - npmci publish npm - npmci docker push environment: name: production url: http://example.com ``` #### GitHub Actions Similarly, you can set up `npmci` in GitHub Actions: ```yaml name: CI Pipeline on: push: branches: - main jobs: prepare: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up Node.js uses: actions/setup-node@v2 with: node-version: '14' - run: npm install -g @ship.zone/npmci - run: npmci node install stable - run: npmci npm install build: runs-on: ubuntu-latest needs: prepare steps: - run: npmci docker build test: runs-on: ubuntu-latest needs: build steps: - run: npmci npm test deploy: runs-on: ubuntu-latest needs: test steps: - run: npmci publish npm - run: npmci docker push ``` #### Gitea CI Lastly, for Gitea CI: ```yaml image: hosttoday/ht-docker-node:npmci pipelines: default: - step: name: Prepare image: hosttoday/ht-docker-node:npmci commands: - npmci node install stable - npmci npm install - npmci prepare npm - npmci prepare docker - step: name: Build image: hosttoday/ht-docker-node:npmci commands: - npmci docker build - step: name: Test image: hosttoday/ht-docker-node:npmci commands: - npmci npm test - step: name: Deploy image: hosttoday/ht-docker-node:npmci commands: - npmci publish npm - npmci docker push ``` ### 2. Handle Node Versions One of the core features of `npmci` is managing Node versions in your CI environment. You can specify which version of Node to install: ```typescript import { Npmci } from '@ship.zone/npmci'; async function manageNodeVersions() { const npmciInstance = new Npmci(); await npmciInstance.start(); await npmciInstance.nodejsManager.handleCli({ _: ['node', 'install', 'stable'] // Installs the latest stable version }); await npmciInstance.nodejsManager.handleCli({ _: ['node', 'install', 'lts'] // Installs the Long-Term Support (LTS) version }); await npmciInstance.nodejsManager.handleCli({ _: ['node', 'install', 'legacy'] // Installs a legacy version }); await npmciInstance.nodejsManager.handleCli({ _: ['node', 'install', '14.17.0'] // Install a specific version of Node }); } manageNodeVersions().then(() => console.log('Node versions managed successfully.')); ``` ### 3. Handling npm and Yarn Tasks `npmci` provides numerous utilities to streamline npm and yarn workflow tasks within a CI/CD pipeline. ```typescript import { Npmci } from '@ship.zone/npmci'; async function manageNpmTasks() { const npmciInstance = new Npmci(); await npmciInstance.start(); await npmciInstance.npmManager.handleCli({ _: ['npm', 'install'] }); // Installs dependencies await npmciInstance.npmManager.handleCli({ _: ['npm', 'test'] }); // Runs tests await npmciInstance.npmManager.handleCli({ _: ['npm', 'publish'] }); // Publishes the package } manageNpmTasks().then(() => console.log('Npm tasks handled successfully.')); ``` ### 4. Docker Task Handling `npmci` simplifies Docker operations, particularly in building, testing, and publishing Docker images. **Prepare Docker Environment:** ```typescript import { Npmci } from '@ship.zone/npmci'; async function prepareDocker() { const npmciInstance = new Npmci(); await npmciInstance.start(); await npmciInstance.dockerManager.handleCli({ _: ['docker', 'prepare'] }); // Prepares Docker environment } prepareDocker().then(() => console.log('Docker environment prepared successfully.')); ``` **Building Docker Images:** ```typescript import { Npmci } from '@ship.zone/npmci'; async function buildDockerImages() { const npmciInstance = new Npmci(); await npmciInstance.start(); await npmciInstance.dockerManager.handleCli({ _: ['docker', 'build'] }); // Builds Docker images } buildDockerImages().then(() => console.log('Docker images built successfully.')); ``` **Testing Docker Images:** ```typescript import { Npmci } from '@ship.zone/npmci'; async function testDockerImages() { const npmciInstance = new Npmci(); await npmciInstance.start(); await npmciInstance.dockerManager.handleCli({ _: ['docker', 'test'] }); // Tests Docker images } testDockerImages().then(() => console.log('Docker images tested successfully.')); ``` **Publishing Docker Images:** ```typescript import { Npmci } from '@ship.zone/npmci'; async function pushDockerImages() { const npmciInstance = new Npmci(); await npmciInstance.start(); await npmciInstance.dockerManager.handleCli({ _: ['docker', 'push'] }); // Pushes Docker images to registry } pushDockerImages().then(() => console.log('Docker images pushed successfully.')); ``` ### 5. Managing Docker Registries `npmci` can handle multiple Docker registries and allows for easy integration within your CI pipeline. **Logging in to Docker Registries:** ```typescript import { Npmci } from '@ship.zone/npmci'; async function loginToDockerRegistries() { const npmciInstance = new Npmci(); await npmciInstance.start(); await npmciInstance.dockerManager.handleCli({ _: ['docker', 'login'] }); // Logs into all configured Docker registries } loginToDockerRegistries().then(() => console.log('Logged into Docker registries.')); ``` **Pulling Docker Images:** ```typescript import { Npmci } from '@ship.zone/npmci'; async function pullDockerImages() { const npmciInstance = new Npmci(); await npmciInstance.start(); await npmciInstance.dockerManager.handleCli({ _: ['docker', 'pull', 'registry.gitlab.com/mygroup/myrepo'] }); // Pulls Docker images from a registry } pullDockerImages().then(() => console.log('Docker images pulled successfully.')); ``` ### 6. SSH Key Management `npmci` also simplifies the management of SSH keys, which is crucial for accessing private repositories and servers. **Preparing SSH Keys:** ```typescript import { Npmci } from '@ship.zone/npmci'; async function prepareSshKeys() { const npmciInstance = new Npmci(); await npmciInstance.start(); await npmciInstance.sshManager.handleCli({ _: ['ssh', 'prepare'] }); // Prepares SSH keys from environment variables } prepareSshKeys().then(() => console.log('SSH keys prepared successfully.')); ``` ### 7. Cloudron Integration For users deploying applications on Cloudron, `npmci` provides a set of utilities for automating Cloudron tasks. **Deploying to Cloudron:** ```typescript import { Npmci } from '@ship.zone/npmci'; async function deployToCloudron() { const npmciInstance = new Npmci(); await npmciInstance.start(); await npmciInstance.cloudronManager.handleCli({ _: ['cloudron', 'deploy'] }); // Deploys application to Cloudron platform } deployToCloudron().then(() => console.log('Deployment to Cloudron completed.')); ``` **Preparing Cloudron Manifest:** Before deployment, replace version placeholders in the Cloudron Manifest: ```typescript import { Npmci } from '@ship.zone/npmci'; import * as fs from 'fs'; import * as path from 'path'; async function prepareCloudronManifest(version: string) { const manifestPath = path.join(process.cwd(), "CloudronManifest.json"); let manifestFile = fs.readFileSync(manifestPath, { encoding: 'utf-8' }); manifestFile = manifestFile.replace(/##version##/g, version); fs.writeFileSync(manifestPath, manifestFile); console.log('CloudronManifest prepared'); } async function deployWithPreparedManifest() { const npmciInstance = new Npmci(); await npmciInstance.start(); await prepareCloudronManifest('1.0.0'); await npmciInstance.cloudronManager.handleCli({ _: ['cloudron', 'deploy'] }); // Deploys application to Cloudron platform } deployWithPreparedManifest().then(() => console.log('Deployment to Cloudron with manifest preparation completed.')); ``` ### 8. Webhook Triggers `npmci` supports webhook triggers, allowing you to trigger builds and other activities based on various conditions. **Triggering Webhooks:** ```typescript import { Npmci } from '@ship.zone/npmci'; async function triggerWebhooks() { const npmciInstance = new Npmci(); await npmciInstance.start(); await npmciInstance.triggerManager.handleCli({ _: ['trigger'] }); // Triggers webhooks based on environment variables } triggerWebhooks().then(() => console.log('Webhooks triggered successfully.')); ``` ### 9. Using the bash Helper `npmci` includes a bash helper for executing commands within a bash shell, useful for various custom tasks. **Using bash to Execute Commands:** ```typescript import { bash } from '@ship.zone/npmci'; async function runCustomBashCommand(command: string) { const output = await bash(command); console.log('Command output:', output); } runCustomBashCommand('echo Hello World').then(() => console.log('Custom command executed successfully.')); ``` ### Full Features and Use Cases Below is a comprehensive set of features and use cases supported by `npmci`. This section ensures you can take full advantage of the library's capabilities in multiple scenarios. ### Comprehensive Docker Workflow **Step-by-step Docker Image Handling:** 1. **Detect and Build All Dockerfiles:** ```typescript import { Npmci } from '@ship.zone/npmci'; async function detectAndBuildDockerfiles() { const npmciInstance = new Npmci(); await npmciInstance.start(); const dockerfiles = await npmciInstance.dockerManager.getDockerfiles(); console.log('Dockerfiles detected:', dockerfiles.map(d => d.filePath)); await npmciInstance.dockerManager.handleCli({ _: ['docker', 'build'] }); console.log('Dockerfiles built successfully.'); } detectAndBuildDockerfiles().then(() => console.log('Docker detection and build process completed.')); ``` 2. **Test All Dockerfiles:** ```typescript import { Npmci } from '@ship.zone/npmci'; async function testAllDockerfiles() { const npmciInstance = new Npmci(); await npmciInstance.start(); await npmciInstance.dockerManager.handleCli({ _: ['docker', 'test'] }); console.log('Dockerfiles tested successfully.'); } testAllDockerfiles().then(() => console.log('Docker testing process completed.')); ``` 3. **Push Dockerfiles to a Registry:** ```typescript import { Npmci } from '@ship.zone/npmci'; async function pushDockerfilesToRegistry() { const npmciInstance = new Npmci(); await npmciInstance.start(); await npmciInstance.dockerManager.handleCli({ _: ['docker', 'push'] }); console.log('Dockerfiles pushed to registry successfully.'); } pushDockerfilesToRegistry().then(() => console.log('Docker push process completed.')); ``` **Dockerfile Class Example:** Here's a snippet showcasing how the `Dockerfile` class can be used to handle Dockerfile-specific operations: ```typescript import { Dockerfile } from '@ship.zone/npmci'; async function handleDockerfileOperations() { // Initialize Dockerfile instances const dockerfile1 = new Dockerfile(/* required parameters */); const dockerfile2 = new Dockerfile(/* required parameters */); // Read and sort Dockerfiles const dockerfiles = await Dockerfile.readDockerfiles(/* required parameters */); const sortedDockerfiles = await Dockerfile.sortDockerfiles(dockerfiles); // Build and Test Dockerfiles await Dockerfile.buildDockerfiles(sortedDockerfiles); await Dockerfile.testDockerfiles(sortedDockerfiles); // Push Dockerfile images to a registry for (const dockerfile of sortedDockerfiles) { await dockerfile.push(/* registry and tag parameters */); } console.log('Dockerfile operations completed successfully.'); } handleDockerfileOperations().then(() => console.log('Dockerfile processing flow completed.')); ``` This completes the comprehensive guide to `@ship.zone/npmci`. With the examples and explanations provided, you should be able to harness the full power and flexibility of the library to streamline your CI/CD processes effectively. undefined