@goodcastle/ci-scripts

    1.2.1 • Public • Published

    Reaction Commerce CI Scripts

    Scripts we use across many repositories during continuous integration.

    How to use in circleci

    In your .circleci/config.yml, in your appropriate job step, add a run command:

    jobs:
      lint:
        <<: *defaults
        steps:
          - checkout
          - setup_remote_docker:
              docker_layer_caching: true
          - run:
              name: Run Lint Suite
              # pin the current latest version explicitly, 1.8.4 for example only
              command: npx --quiet --package @reactioncommerce/ci-scripts@1.8.4 lint-shell-scripts

    Note: Most docker-* scripts as well as lint-dockerfiles require the setup_remote_docker circleci job step as a prerequisite. Be sure your config.yml has that when it's needed.

    If you run a bunch of these and want to DRY it up, try this flavor with an environment variable:

    # The following stanza defines a map named defaults with a variable that may be
    # inserted using the YAML merge (<<: *) key later in the file to save some
    # typing. See http://yaml.org/type/merge.html for details.
    defaults: &defaults
      docker:
        - image: circleci/node:12-stretch
      environment:
        CI_SCRIPTS: 'npx --quiet --package @reactioncommerce/ci-scripts@1.8.4'
    jobs:
      docker-build-tag-push:
        <<: *defaults
        steps:
          - checkout
          - setup_remote_docker:
              docker_layer_caching: true
          - run:
              name: 'docker: catalog-publisher'
              command: |
                ${CI_SCRIPTS} docker-labels >> Dockerfile
                ${CI_SCRIPTS} build-metadata
                ${CI_SCRIPTS} docker-build-tag-push . reactioncommerce/catalog-publisher

    How to add new scripts

    • Put your script file in the repo root. Use a filename extension. It makes editor syntax highlighting and linting "just work" sometimes.
    • chmod 755 your-script.sh
    • Add an entry to the package.json "bin" property mapping "name-without-extension": "./name-with-extension.sh",
    • Commit, being sure to prefix your commit message with feat: so semantic release publishes a new minor version properly
    • Notes on filename extensions vs no extensions
      • In the package.json bin keys, we omit the extension. This is slightly nicer as a command line interface. It's just a logical script name.
      • When launching via npx on the command line during CI, it's no extension
      • In the repo root dir, we do use the extension since this is nicer for editor syntax detection, development tools, etc.
      • So in package.json bin it's no extension for the key but yes extension for the value
      • When calling one ci-script from another ci-script it's no extension because these run from the node_modules/.bin directory which only contains no-extension files which npm picks up from package.json bin key.

    How to troubleshoot script errors

    • Launch the docker image your CI job uses locally
      • For example
        • docker run --rm -it circleci/node:12 bash
    • Install ci-scripts in /tmp so you can debug
    • cd /tmp && npm install @reactioncommerce/ci-scripts
    • Run with debugging
    • bash -x ./node_modules/@reactioncommerce/ci-scripts/script-you-want-to-debug.sh

    Implementation Notes

    • Scripts should operate on their current working directory (inherited from the parent process)
      • Meaning the calling code should cd into the root of their project git repository (which happens by default on circleci) then invoke the scripts from this repo
    • Scripts should enumerate files with git ls-files
    • Shell scripts should be formatted with shfmt
    • If you need to call another ci-script from your own ci-script, use this pattern
      1. Make a variable for the directory the script lives in, which is node_modules/.bin when running via npx
      • ci_scripts_dir="$(dirname "${BASH_SOURCE[0]}")"
      1. Reference sibling scripts with no extension
      • ./some-other-script

    Install

    npm i @goodcastle/ci-scripts

    DownloadsWeekly Downloads

    31

    Version

    1.2.1

    License

    Apache-2.0

    Unpacked Size

    41.9 kB

    Total Files

    24

    Last publish

    Collaborators

    • goodcastle