diff --git a/.circleci/config.yml b/.circleci/config.yml index f263a26..6332edd 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,71 +1,22 @@ -# https://circleci.com/docs/2.0/config-intro/ - version: 2.1 - orbs: - node: circleci/node@5.0.0 - + continuation: circleci/continuation@0.3 + node: circleci/node@5.0 +setup: true jobs: - js-build: - docker: - - image: cimg/node:14.18 + generate-config: + executor: node/default steps: - checkout - - node/install-packages + - node/install-packages: + app-dir: .circleci/dynamic - run: - name: Running JS linting and unit test - command: | - npm run lint:js - npm run test:js - - php-lint: - docker: - - image: cimg/php:8.1 - steps: - - checkout - - run: - name: Linting PHP - command: | - composer i - composer lint - - php-test: - parameters: - php-version-number: - type: string - docker: - - image: cimg/php:<< parameters.php-version-number >> - steps: - - checkout - - run: - name: Testing PHP - command: | - composer i - composer test - - e2e-test: - machine: - image: ubuntu-2004:202111-02 - steps: - - checkout - - node/install-packages - - run: - name: Running e2e tests - command: | - npm run wp-env start - npm run test:e2e - - store_artifacts: - path: artifacts - + name: Generate config + command: npm start + working_directory: .circleci/dynamic + - continuation/continue: + configuration_path: .circleci/dynamic/dynamicConfig.yml workflows: - test-flow: + dynamic-workflow: jobs: - - js-build - - php-lint - - php-test: - requires: - - php-lint - matrix: - parameters: - php-version-number: [ '7.3', '7.4', '8.0', '8.1' ] - - e2e-test + - generate-config diff --git a/.circleci/dynamic/index.ts b/.circleci/dynamic/index.ts new file mode 100644 index 0000000..6e796c3 --- /dev/null +++ b/.circleci/dynamic/index.ts @@ -0,0 +1,103 @@ +import * as fs from "fs"; +import CircleCI from "@circleci/circleci-config-sdk"; + +const config = new CircleCI.Config(); +const workflow = new CircleCI.Workflow("test-lint"); +config.addWorkflow(workflow); + +const phpVersionParameterName = "php-version-number"; +const orbManifest: CircleCI.types.orb.OrbImportManifest = { + jobs: {}, + commands: { + "install-packages": new CircleCI.parameters.CustomParametersList(), + }, + executors: {}, +}; + +const nodeOrb = new CircleCI.orb.OrbImport( + "node", + "circleci", + "node", + "5.0", + undefined, + orbManifest +); +const phpOrb = new CircleCI.orb.OrbImport( + "php", + "circleci", + "php", + "1.1", + undefined, + orbManifest +); + +config.importOrb(nodeOrb); +config.importOrb(phpOrb); + +[ + new CircleCI.Job( + "js-build", + new CircleCI.executors.DockerExecutor("cimg/node:14.18"), + [ + new CircleCI.commands.Checkout(), + new CircleCI.reusable.ReusedCommand(nodeOrb.commands["install-packages"]), + new CircleCI.commands.Run({ + name: "Running JS linting and unit test", + command: `npm run lint:js \n npm run test:js`, + }), + ] + ), + new CircleCI.Job( + "php-lint", + new CircleCI.executors.DockerExecutor("cimg/php:8.1"), + [ + new CircleCI.commands.Checkout(), + new CircleCI.reusable.ReusedCommand(phpOrb.commands["install-packages"]), + new CircleCI.commands.Run({ command: "composer lint" }), + ] + ), + new CircleCI.reusable.ParameterizedJob( + "php-test", + new CircleCI.reusable.ReusableExecutor( + "php", + new CircleCI.executors.DockerExecutor( + "cimg/php:<< parameters.php-version-number >>" + ), + new CircleCI.parameters.CustomParametersList([ + new CircleCI.parameters.CustomParameter( + phpVersionParameterName, + CircleCI.mapping.ParameterSubtype.STRING + ), + ]) + ).executor + ) + .defineParameter(phpVersionParameterName, CircleCI.mapping.ParameterSubtype.STRING) + .addStep(new CircleCI.commands.Checkout()) + .addStep( + new CircleCI.reusable.ReusedCommand(phpOrb.commands["install-packages"]) + ) + .addStep(new CircleCI.commands.Run({ command: "composer test" })), + new CircleCI.Job( + "e2e-test", + new CircleCI.executors.MachineExecutor("large", "ubuntu-2004:202111-02"), + [ + new CircleCI.commands.Checkout(), + new CircleCI.reusable.ReusedCommand(nodeOrb.commands["install-packages"]), + new CircleCI.commands.Run({ + name: "Running e2e tests", + command: "npm run wp-env start && npm run test:e2e", + }), + new CircleCI.commands.StoreArtifacts({ path: "artifacts" }), + ] + ), +].forEach((job) => { + config.addJob(job); + workflow.addJob( + job, + job.name === "php-test" + ? { matrix: { [phpVersionParameterName]: ["7.3", "7.4", "8.0", "8.1"] } } + : undefined + ); +}); + +fs.writeFile("./dynamicConfig.yml", config.stringify(), () => {}); diff --git a/.circleci/dynamic/package-lock.json b/.circleci/dynamic/package-lock.json new file mode 100644 index 0000000..40153dc --- /dev/null +++ b/.circleci/dynamic/package-lock.json @@ -0,0 +1,171 @@ +{ + "name": "circleci-tutorial-for-beginners-dynamic-config", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@circleci/circleci-config-sdk": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@circleci/circleci-config-sdk/-/circleci-config-sdk-0.10.1.tgz", + "integrity": "sha512-QSJBYXTza3UiO2UcmHJQhORkF6UzYOVtddS2cCjDraUkonF4uCawBXXksPXnCaLI98HU8uPwwVVJhdrbJreKQw==", + "dev": true, + "requires": { + "yaml": "2.1.1" + } + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "@types/node": { + "version": "18.7.20", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.20.tgz", + "integrity": "sha512-adzY4vLLr5Uivmx8+zfSJ5fbdgKxX8UMtjtl+17n0B1q1Nz8JEmE151vefMdpD+1gyh+77weN4qEhej/O7budQ==", + "dev": true + }, + "acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true + }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + } + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, + "typescript": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", + "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", + "dev": true + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "yaml": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz", + "integrity": "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==", + "dev": true + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + } + } +} diff --git a/.circleci/dynamic/package.json b/.circleci/dynamic/package.json new file mode 100644 index 0000000..8fb79e5 --- /dev/null +++ b/.circleci/dynamic/package.json @@ -0,0 +1,22 @@ +{ + "name": "circleci-tutorial-for-beginners-dynamic-config", + "version": "0.1.0", + "description": "Dynamic CircleCI® config", + "author": "Ryan Kienstra", + "main": "index.ts", + "type": "module", + "scripts": { + "lint": "prettier --check index.ts", + "lint:fix": "prettier --write index.ts", + "start": "ts-node --esm index.ts" + }, + "license": "GPL-2.0-or-later", + "devDependencies": { + "@circleci/circleci-config-sdk": "^0.10.1", + "@types/node": "^18.7.20", + "prettier": "^2.7.1", + "ts-node": "^10.9.1", + "tslib": "^2.4.0", + "typescript": "^4.8.3" + } +} diff --git a/.circleci/dynamic/tsconfig.json b/.circleci/dynamic/tsconfig.json new file mode 100644 index 0000000..01d16a2 --- /dev/null +++ b/.circleci/dynamic/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "module": "ESNext", + "target": "ESNext", + "moduleResolution": "Node", + "esModuleInterop": true, + "noEmit": true + } +} diff --git a/.gitignore b/.gitignore index 022b988..ff0855c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules vendor +.circleci/dynamic/dynamicConfig.yml