From c45e611b693bdd687f917f1b44a2133d5982f2e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Mon, 12 Jul 2021 16:24:19 +0200 Subject: [PATCH] feat: add a "match_tags" option MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I use this action to release the chart of [Mercure](https://mercure.rocks). We use a monolithic Git repository containing several projects, including the Helm chart. Currently, this action isn't compatible with our setup because it computes the changes made to the chart since the previous tag. In our case we also use tags for other projects in the same repository, so this actions is never triggered because there are no changes with the "previous" tag (which usually is for another project in the same repository). This PR introduces a `match_tags` option allowing to filter the tags to match using a glob. Signed-off-by: Kévin Dunglas Signed-off-by: Kévin Dunglas --- README.md | 1 + action.yml | 7 +++++++ cr.sh | 20 +++++++++++++++++++- 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 03ead65..705f546 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ A GitHub action to turn a GitHub project into a self-hosted Helm chart repo, usi - `charts_dir`: The charts directory - `skip_packaging`: This option, when populated, will skip the packaging step. This allows you to do more advanced packaging of your charts (for example, with the `helm package` command) before this action runs. This action will only handle the indexing and publishing steps. - `mark_as_latest`: When you set this to `false`, it will mark the created GitHub release not as 'latest'. +- `match_tags`: The glob to use to filter Git tags, usually used with the `CR_RELEASE_NAME_TEMPLATE` environment variable (default: all tags) ### Outputs diff --git a/action.yml b/action.yml index 0ae62cf..3a7c170 100644 --- a/action.yml +++ b/action.yml @@ -32,6 +32,9 @@ inputs: description: Mark the created GitHub release as 'latest' required: false default: true + match_tags: + description: "The glob to use to filter Git tags (default: all tags)" + required: false outputs: changed_charts: description: "A comma-separated list of charts that were released on this run. Will be an empty string if no updates were detected, will be unset if `--skip_packaging` is used: in the latter case your custom packaging step is responsible for setting its own outputs if you need them." @@ -84,6 +87,10 @@ runs: args+=(--mark-as-latest "${{ inputs.mark_as_latest }}") fi + if [[ -n "${{ inputs.match_tags }}" ]]; then + args+=(--match-tags "${{ inputs.match_tags }}") + fi + "$GITHUB_ACTION_PATH/cr.sh" "${args[@]}" if [[ -f changed_charts.txt ]]; then diff --git a/cr.sh b/cr.sh index 8fcfea3..5384a5f 100755 --- a/cr.sh +++ b/cr.sh @@ -35,6 +35,7 @@ Usage: $(basename "$0") -s, --skip-packaging Skip the packaging step (run your own packaging before using the releaser) --skip-existing Skip package upload if release exists -l, --mark-as-latest Mark the created GitHub release as 'latest' (default: true) + -m, --match-tags The glob to use to filter Git tags (default: all tags) EOF } @@ -44,6 +45,7 @@ main() { local charts_dir=charts local owner= local repo= + local match_tags= local install_dir= local install_only= local skip_packaging= @@ -164,6 +166,16 @@ parse_command_line() { exit 1 fi ;; + -m|--match-tags) + if [[ -n "${2:-}" ]]; then + match_tags="$2" + shift + else + echo "ERROR: '--match-tags' cannot be empty." >&2 + show_help + exit 1 + fi + ;; -n | --install-dir) if [[ -n "${2:-}" ]]; then install_dir="$2" @@ -249,7 +261,13 @@ install_chart_releaser() { lookup_latest_tag() { git fetch --tags >/dev/null 2>&1 - if ! git describe --tags --abbrev=0 HEAD~ 2>/dev/null; then + args=("describe" "--tags" "--abbrev=0") + if [ -n "$match_tags" ]; then + args+=(--match="$match_tags") + fi + args+=(HEAD~) + + if ! git "${args[@]}" 2> /dev/null; then git rev-list --max-parents=0 --first-parent HEAD fi }