ghat icon indicating copy to clipboard operation
ghat copied to clipboard

Allow definition/setup via local template instead of cli

Open fregante opened this issue 5 years ago • 2 comments

Currently the only customization possible is via the global env property, but unfortunately this isn't available everywhere in the workflow and can't be used to customize a workflow template.

I foresee a few ways to reuse existing templates:

Plain merging of a local template (e.g. .github/workflows-ghat/ci.yml) with the remote template

# Fetch template
apply: fregante/ghat/templates/node

# Overwrite existing `on` property with
on:
  - push

Importing single jobs

on:
  - push
jobs:
  test:
    name: Let's test stuff
    apply: fregante/ghat/templates/node#jobs.test # It would only merge the specific jobs.test section
  build:
    needs: test
    steps:
      - run: echo My other steps

An advanced way to customize the templates

For example it could apply some ENVs at merge time like GitHub does with the $default-branch variable:

  • because env doesn't support arrays for example, and can't be used in strategy.matrix
  • some conditions could be pre-evaluated, so that whole steps/jobs could be dropped/added at merge time instead of just being silenced at run time.

Initially defined in https://github.com/sindresorhus/project-ideas/issues/128

fregante avatar Nov 08 '20 01:11 fregante

The user would:

  1. Create the files in .github/workflows-ghat
  2. Run $ ghat without any input

This is essentially the same as https://github.com/fregante/ghat/issues/9, except that https://github.com/fregante/ghat/issues/9 refers to just loading the .github/workflows files.

fregante avatar Nov 08 '20 07:11 fregante

Alternative idea: The "local template" could just be a .js module that can do anything:

// In ghat
require('./.github/workflows/ghat.js'); // if it exists
// In local .github/workflows/ghat.js
const ghat = require('ghat');
(async () => {
	const myWorkflow = await ghat.get('fregante/ghatemplates/file.yml');
	myWorkflow.name = 'Coolio';
	await ghat.save('ci.yml', myWorkflow);
})();

Pros

  • No limits

Cons

  • Verbose/complex
  • Who really needs this? 🤔

fregante avatar Nov 12 '20 06:11 fregante