diff --git a/.github/workflows/test-action.yml b/.github/workflows/test-action.yml new file mode 100644 index 0000000..da579c0 --- /dev/null +++ b/.github/workflows/test-action.yml @@ -0,0 +1,62 @@ +name: test-chart-releaser + +on: [pull_request] + +jobs: + test_chart_releaser_install_action: + runs-on: ubuntu-latest + permissions: + actions: none + checks: none + contents: none + deployments: none + issues: none + packages: none + pull-requests: none + repository-projects: none + security-events: none + statuses: none + name: Install chart-releaser and test presence in path + steps: + - uses: actions/checkout@v2 + - name: Install chart-releaser + uses: ./ + with: + install_only: true + env: + CR_TOKEN: "FAKE_SECRETS" + - name: Check install! + run: cr version + - name: Check root directory + run: | + if ! git diff --stat --exit-code; then + echo 'should be clean' + exit 1 + fi + + test_chart_releaser_action: + runs-on: ubuntu-latest + permissions: + actions: none + checks: none + contents: none + deployments: none + issues: none + packages: none + pull-requests: none + repository-projects: none + security-events: none + statuses: none + name: Install chart-releaser and run it + steps: + - uses: actions/checkout@v2 + - name: Install chart-releaser + uses: ./ + env: + CR_TOKEN: "FAKE_SECRETS" + - name: Check root directory + run: | + if ! git diff --stat --exit-code; then + echo 'should be clean' + exit 1 + fi diff --git a/README.md b/README.md index 316890f..b443502 100644 --- a/README.md +++ b/README.md @@ -6,20 +6,26 @@ A GitHub action to turn a GitHub project into a self-hosted Helm chart repo, usi ### Pre-requisites -1. A GitHub repo containing a directory with your Helm charts (eg: `/charts`) -1. A GitHub branch called `gh-pages` to store the published charts. See `charts_repo_url` for alternatives +1. A GitHub repo containing a directory with your Helm charts (default is a folder named `/charts`, if you want to +maintain your charts in a different directory, you must include a `charts_dir` input in the workflow). +1. A GitHub branch called `gh-pages` to store the published charts. See `charts_repo_url` for alternatives. +1. In your repo, go to Settings/Pages. Change the `Source` `Branch` to `gh-pages`. 1. Create a workflow `.yml` file in your `.github/workflows` directory. An [example workflow](#example-workflow) is available below. For more information, reference the GitHub Help Documentation for [Creating a workflow file](https://help.github.com/en/articles/configuring-a-workflow#creating-a-workflow-file) ### Inputs -For more information on inputs, see the [API Documentation](https://developer.github.com/v3/repos/releases/#input) - -- `version`: The chart-releaser version to use (default: v1.2.1) -- `config`: Optional config file for chart-releaser +- `version`: The chart-releaser version to use (default: v1.4.0) +- `config`: Optional config file for chart-releaser. For more information on the config file, see the [documentation](https://github.com/helm/chart-releaser#config-file) - `charts_dir`: The charts directory - `charts_repo_url`: The GitHub Pages URL to the charts repo (default: `https://.github.io/`) +### Environment variables + +- `CR_TOKEN` (required): The GitHub token of this repository (`${{ secrets.GITHUB_TOKEN }}`) + +For more information on environment variables, see the [documentation](https://github.com/helm/chart-releaser#environment-variables). + ### Example Workflow Create a workflow (eg: `.github/workflows/release.yml`): @@ -49,16 +55,39 @@ jobs: - name: Install Helm uses: azure/setup-helm@v1 with: - version: v3.4.0 + version: v3.8.1 - name: Run chart-releaser - uses: helm/chart-releaser-action@v1.2.1 + uses: helm/chart-releaser-action@v1.4.0 env: CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}" ``` This uses [@helm/chart-releaser-action](https://www.github.com/helm/chart-releaser-action) to turn your GitHub project into a self-hosted Helm chart repo. -It does this – during every push to `main` – by checking each chart in your project, and whenever there's a new chart version, creates a corresponding [GitHub release](https://help.github.com/en/github/administering-a-repository/about-releases) named for the chart version, adds Helm chart artifacts to the release, and creates or updates an `index.yaml` file with metadata about those releases, which is then hosted on GitHub Pages +It does this – during every push to `main` – by checking each chart in your project, and whenever there's a new chart version, creates a corresponding [GitHub release](https://help.github.com/en/github/administering-a-repository/about-releases) named for the chart version, adds Helm chart artifacts to the release, and creates or updates an `index.yaml` file with metadata about those releases, which is then hosted on GitHub Pages. You do not need an `index.yaml` file in `main` at all because it is managed in the `gh-pages` branch. + +#### Example using custom config + +`workflow.yml`: +```yaml +- name: Run chart-releaser + uses: helm/chart-releaser-action@v1.4.0 + with: + charts_dir: charts + config: cr.yaml + charts_repo_url: xxxxxx + env: + CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}" +``` + +`cr.yaml`: + +```yaml +owner: myaccount +git-base-url: https://api.github.com/ +``` + +For options see [config-file](https://github.com/helm/chart-releaser#config-file). ## Code of conduct diff --git a/action.yml b/action.yml index 5f74729..046c3a3 100644 --- a/action.yml +++ b/action.yml @@ -6,14 +6,26 @@ branding: icon: anchor inputs: version: - description: "The chart-releaser version to use (default: v1.2.1)" + description: "The chart-releaser version to use (default: v1.4.0)" + required: false + default: v1.4.0 config: description: "The relative path to the chart-releaser config file" + required: false charts_dir: description: The charts directory + required: false default: charts charts_repo_url: description: "The GitHub Pages URL to the charts repo (default: https://.github.io/)" + required: false + install_dir: + description: 'Where to install the cr tool' + required: false + install_only: + description: 'Just install cr tool' + required: false + runs: using: composite steps: @@ -36,5 +48,18 @@ runs: args+=(--charts-repo-url "${{ inputs.charts_repo_url }}") fi + if [[ -z "${{ inputs.install_dir }}" ]]; then + install="$RUNNER_TOOL_CACHE/cr/${{ inputs.version }}/$(uname -m)" + echo "$install" >> "$GITHUB_PATH" + args+=(--install-dir "$install") + else + echo ${{ inputs.install_dir }} >> "$GITHUB_PATH" + args+=(--install-dir "${{ inputs.install_dir }}") + fi + + if [[ -n "${{ inputs.install_only }}" ]]; then + args+=(--install-only "${{ inputs.install_only }}") + fi + "$GITHUB_ACTION_PATH/cr.sh" "${args[@]}" shell: bash diff --git a/cr.sh b/cr.sh index bd0a584..13c45a5 100755 --- a/cr.sh +++ b/cr.sh @@ -18,7 +18,7 @@ set -o errexit set -o nounset set -o pipefail -DEFAULT_CHART_RELEASER_VERSION=v1.2.1 +DEFAULT_CHART_RELEASER_VERSION=v1.4.0 show_help() { cat << EOF @@ -31,6 +31,8 @@ Usage: $(basename "$0") -u, --charts-repo-url The GitHub Pages URL to the charts repo (default: https://.github.io/) -o, --owner The repo owner -r, --repo The repo name + -n, --install-dir The Path to install the cr tool + -i, --install-only Just install the cr tool EOF } @@ -41,6 +43,8 @@ main() { local owner= local repo= local charts_repo_url= + local install_dir= + local install_only= parse_command_line "$@" @@ -151,6 +155,18 @@ parse_command_line() { exit 1 fi ;; + -n|--install-dir) + if [[ -n "${2:-}" ]]; then + install_dir="$2" + shift + fi + ;; + -i|--install-only) + if [[ -n "${2:-}" ]]; then + install_only="$2" + shift + fi + ;; *) break ;; @@ -174,6 +190,18 @@ parse_command_line() { if [[ -z "$charts_repo_url" ]]; then charts_repo_url="https://$owner.github.io/$repo" fi + + if [[ -z "$install_dir" ]]; then + local arch + arch=$(uname -m) + install_dir="$RUNNER_TOOL_CACHE/cr/$version/$arch" + fi + + if [[ -n "$install_only" ]]; then + echo "Will install cr tool and not run it..." + install_chart_releaser + exit 0 + fi } install_chart_releaser() { @@ -182,21 +210,17 @@ install_chart_releaser() { exit 1 fi - local arch - arch=$(uname -m) - - local cache_dir="$RUNNER_TOOL_CACHE/ct/$version/$arch" - if [[ ! -d "$cache_dir" ]]; then - mkdir -p "$cache_dir" + if [[ ! -d "$install_dir" ]]; then + mkdir -p "$install_dir" - echo "Installing chart-releaser..." + echo "Installing chart-releaser on $install_dir..." curl -sSLo cr.tar.gz "https://github.com/helm/chart-releaser/releases/download/$version/chart-releaser_${version#v}_linux_amd64.tar.gz" - tar -xzf cr.tar.gz -C "$cache_dir" + tar -xzf cr.tar.gz -C "$install_dir" rm -f cr.tar.gz - - echo 'Adding cr directory to PATH...' - export PATH="$cache_dir:$PATH" fi + + echo 'Adding cr directory to PATH...' + export PATH="$install_dir:$PATH" } lookup_latest_tag() { @@ -225,7 +249,7 @@ lookup_changed_charts() { local changed_files changed_files=$(git diff --find-renames --name-only "$commit" -- "$charts_dir") - local depth=$(( $(tr "/" "\n" <<< "$charts_dir" | wc -l) + 1 )) + local depth=$(( $(tr "/" "\n" <<< "$charts_dir" | sed '/^\(\.\)*$/d' | wc -l) + 1 )) local fields="1-${depth}" cut -d '/' -f "$fields" <<< "$changed_files" | uniq | filter_charts