├── .github └── workflows │ ├── lint-release.yml │ └── lint.yml ├── .gitignore ├── .hadolint.yaml ├── .vscode ├── ltex.hiddenFalsePositives.en-US.txt └── settings.json ├── CHANGELOG.md ├── Dockerfile ├── LICENSE ├── README.md ├── action.yml ├── entrypoint.sh └── renovate.json /.github/workflows/lint-release.yml: -------------------------------------------------------------------------------- 1 | name: Lint & Release 2 | on: 3 | push: 4 | tags: 5 | - "v[0-9]+.[0-9]+.[0-9]+" 6 | jobs: 7 | sh-checker: 8 | uses: Roang-zero1/workflows/.github/workflows/sh-checker.yml@v1 9 | hadolint: 10 | uses: Roang-zero1/workflows/.github/workflows/hadolint.yml@v1 11 | release: 12 | uses: Roang-zero1/workflows/.github/workflows/create-release.yml@v1 13 | needs: [sh-checker, hadolint] 14 | update-major-version-tag: 15 | uses: Roang-zero1/workflows/.github/workflows/update-major-version-tag.yml@v1 16 | needs: [release] 17 | -------------------------------------------------------------------------------- /.github/workflows/lint.yml: -------------------------------------------------------------------------------- 1 | name: Lint 2 | on: 3 | push: 4 | branches: 5 | - "**" 6 | tags-ignore: 7 | - "v[0-9]+.[0-9]+.[0-9]+" 8 | pull_request: 9 | 10 | jobs: 11 | sh-checker: 12 | uses: Roang-zero1/workflows/.github/workflows/sh-checker.yml@v1 13 | hadolint: 14 | uses: Roang-zero1/workflows/.github/workflows/hadolint.yml@v1 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Intellij settings 2 | .idea 3 | -------------------------------------------------------------------------------- /.hadolint.yaml: -------------------------------------------------------------------------------- 1 | ignored: 2 | - DL3018 3 | -------------------------------------------------------------------------------- /.vscode/ltex.hiddenFalsePositives.en-US.txt: -------------------------------------------------------------------------------- 1 | {"rule":"ACCEPT_EXCEPT","sentence":"^\\QDefaults to \\E(?:Dummy|Ina|Jimmy-)[0-9]+\\Q (accept everything).\\E$"} 2 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "spellright.language": ["en_GB"], 3 | "spellright.documentTypes": [ 4 | "markdown", 5 | "latex", 6 | "plaintext", 7 | "git-commit", 8 | "shellscript", 9 | "github-actions" 10 | ], 11 | "spellright.parserByClass": { 12 | "github-actions": { 13 | "parser": "code" 14 | } 15 | }, 16 | "editor.formatOnSave": true, 17 | "cSpell.enableFiletypes": ["!markdown"] 18 | } 19 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # CHANGELOG 2 | 3 | ## v3.0.1 4 | 5 | - Fix `sed` replacement in alpine 6 | - Fix linting errors 7 | 8 | ## v3.0.0 9 | 10 | Update to new GitHub actions output format 11 | 12 | ## v2.3.4 13 | 14 | - Remove dependency pinning 15 | 16 | ## v2.3.3 17 | 18 | - Update curl to latest version 19 | 20 | ## v2.3.2 21 | 22 | - Fix bug in INPUT_RELEASE_TEXT check (again) 23 | 24 | ## v2.3.1 25 | 26 | - Fix bug in INPUT_RELEASE_TEXT check 27 | - Improve action stability by pinning alpine package versions 28 | 29 | ## v2.3.0 30 | 31 | - Add input parameter release_text which can be used instead of the parsed change log (Addresses [#5](https://github.com/Roang-zero1/github-create-release-action/issues/5)) 32 | 33 | ## v2.2.0 34 | 35 | - Add output parameter for parsed change log content (Fixes [#6](https://github.com/Roang-zero1/github-create-release-action/issues/6)) 36 | - Add output parameter for received release metadata (id, html_url, upload_url) (Fixes [#4](https://github.com/Roang-zero1/github-create-release-action/issues/4)) 37 | - Updated to latest submark version (Fixes [#1](https://github.com/Roang-zero1/github-create-release-action/issues/1)) 38 | - Fix parsing for tags with slashes (Pull Request #9) 39 | 40 | ## v2.1.0 41 | 42 | - Add option to pass tag from another action (Fixes [#2](https://github.com/Roang-zero1/github-create-release-action/issues/2)). 43 | - Add option to pass release title. 44 | 45 | ## v2.0.2 46 | 47 | - Add additional output for the change log parsing process 48 | - Add required fields to the input parameters 49 | 50 | ## v2.0.1 51 | 52 | - Update `README.md` 53 | 54 | ## v2.0.0 55 | 56 | - Add `action.yml` file 57 | - Switch from using `env` to `inputs` 58 | 59 | ## v1.0.3 60 | 61 | - Migrate to Actions V2 yml files 62 | 63 | ## v1.0.2 64 | 65 | - Update workflow 66 | 67 | ## v1.0.1 68 | 69 | - Change Action name to be unique 70 | 71 | ## v1.0.0 72 | 73 | Initial Release 74 | 75 | - Create release from tag 76 | - Verify release version format with regular expression 77 | - Create releases as draft 78 | - Create pre-releases with regular expression matching 79 | - Update existing releases 80 | - Parse release body from a changelog file 81 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:3.16 as base 2 | 3 | RUN apk add --no-cache jq curl sed 4 | 5 | SHELL ["/bin/ash", "-o", "pipefail", "-c"] 6 | RUN curl -s https://api.github.com/repos/dahlia/submark/releases/tags/0.3.1 | jq -r '.assets[] | select(.browser_download_url | contains("linux-x86_64")) | .browser_download_url' | xargs curl -o /usr/local/bin/submark -sSL && chmod +x /usr/local/bin/submark 7 | 8 | COPY entrypoint.sh /entrypoint.sh 9 | 10 | ENTRYPOINT ["/entrypoint.sh"] 11 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Lucas Brandstaetter 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GitHub Action for Creating a Release on Tag push 2 | 3 | Creates a new GitHub release whenever a tag is pushed. 4 | 5 | ## Example Usage 6 | 7 | The following basic workflow will create a release whenever any tag is pushed that matches the version_regex. 8 | 9 | ```yaml 10 | name: Release 11 | 12 | on: 13 | push: 14 | tags: 15 | - "v[0-9]+.[0-9]+.[0-9]+" 16 | 17 | jobs: 18 | release: 19 | runs-on: ubuntu-latest 20 | steps: 21 | - name: Create GitHub release 22 | uses: Roang-zero1/github-create-release-action@v3 23 | with: 24 | version_regex: ^v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+ 25 | env: 26 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 27 | ``` 28 | 29 | ### Limiting versions and creating pre-releases 30 | 31 | If only certain tags should create releases or some releases should be created as pre-release you can set regular expression to achieve this. 32 | These regular expression are evaluated with GNU grep, so these regular expressions need to be compatible with it. 33 | Regular expressions containing `\` need them to be escaped with `\\`. 34 | 35 | - `version_regex` Regular expression to verify that the version is in a correct format. Defaults to `.*` (accept everything). 36 | - `prerelease_regex` Any version matching this regular expression will be marked as pre-release. Disabled by default. 37 | 38 | ```yaml 39 | - name: Create GitHub release 40 | uses: Roang-zero1/github-create-release-action@v3 41 | with: 42 | version_regex: ^v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+ 43 | prerelease_regex: "^v2\\.[[:digit:]]+\\.[[:digit:]]+" 44 | env: 45 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 46 | ``` 47 | 48 | ### Passing a tag to not rely on manual tag pushes 49 | 50 | If you want to create a tag automatically and create the release in the same workflow you can set `created_tag` to achieve this. 51 | This allows you to create a fully automated release in one workflow file (workaround because one workflow/action can not trigger another workflow/action). 52 | The example below uses `K-Phoen/semver-release-action` to create the tag whenever a pull request is closed, merged, and the head_ref starts with RC. 53 | After the tag is created it is passed to the create-release-action via the CREATED_TAG env variable using the output of the `semver-release-action`. 54 | 55 | ```yaml 56 | on: 57 | pull_request: 58 | types: closed 59 | 60 | jobs: 61 | build: 62 | runs-on: ubuntu-latest 63 | if: github.event.pull_request.merged && startsWith(github.head_ref, 'RC') 64 | steps: 65 | - uses: actions/checkout@v3 66 | - name: Tag and prepare release 67 | id: tag_and_prepare_release 68 | uses: K-Phoen/semver-release-action@v1.3.1 69 | with: 70 | release_branch: master 71 | release_strategy: tag 72 | env: 73 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 74 | - name: Upload release notes 75 | if: steps.tag_and_prepare_release.outputs.tag 76 | uses: Roang-zero1/github-create-release-action@v3 77 | with: 78 | created_tag: ${{ steps.tag_and_prepare_release.outputs.tag }} 79 | env: 80 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 81 | ``` 82 | 83 | ### Using the tag message as release body 84 | 85 | If you have tag messages that you want to use as a release body you can pass them from the workflow with the `release_text` parameter. 86 | 87 | ```yaml 88 | - uses: actions/checkout@v3 89 | - name: "Refresh tags" 90 | id: tag 91 | run: git fetch --tags --force # Is currently required for v3 due to https://github.com/actions/checkout/issues/290 92 | - uses: ericcornelissen/git-tag-annotation-action@v3 93 | id: tag-data 94 | - name: Create GitHub release 95 | uses: Roang-zero1/github-create-release-action@v3 96 | with: 97 | version_regex: ^v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+ 98 | release_text: ${{ steps.tag-data.outputs.git-tag-annotation }} 99 | env: 100 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 101 | ``` 102 | 103 | ### Change log parsing 104 | 105 | This action makes it possible to extract the release description from a Markdown change log. 106 | 107 | By default, the `CHANGELOG.md` file is searched for a `##` (h2) heading matching the tag text. 108 | 109 | If it is found the section is passed as body to the release API. 110 | 111 | If for example we release the tag `v1.0.0` with a `CHANGELOG.md` as follows: 112 | 113 | ```Markdown 114 | # Changelog 115 | 116 | ## v1.0.0 117 | 118 | Initial Release 119 | ``` 120 | 121 | Then the text `Initial Release` will be passed as body. 122 | Markdown restrictions for release bodies still apply. 123 | 124 | _Parsed change logs with will have the new lines (/r, /n) and percent symbols (%) escaped._ 125 | 126 | ## Inputs 127 | 128 | ### `version_regex` 129 | 130 | Regular expression to verify that the version is in a correct format. Defaults to `.*` (accept everything). 131 | 132 | ### `prerelease_regex` 133 | 134 | Any version matching this regular expression will be marked as pre-release. Disabled by default. 135 | 136 | ### `create_draft` 137 | 138 | Create the releases as draft (`true|false [default: false]`). Existing will not be updated from released to draft. 139 | 140 | ### `update_existing` 141 | 142 | Controls whether an existing release should be updated with data from the latest push (`true|false [default: false]`). 143 | 144 | ### `created_tag` 145 | 146 | Allows to pass an already created tag. 147 | 148 | ### `release_title` 149 | 150 | Allows to pass a release title. 151 | 152 | ### `changelog_file` 153 | 154 | File that contains the Markdown formatted change log. Defaults to `CHANGELOG.md`. 155 | 156 | ### `changelog_heading` 157 | 158 | Heading level at which the tag headings exist. Defaults to `h2`, this parses headings at the markdown level `##`. 159 | 160 | ## Outputs 161 | 162 | ### `id` 163 | 164 | ID number of the created or updated release. 165 | 166 | ### `html_url` 167 | 168 | HTML access URL for the created or updated release. 169 | 170 | ### `upload_url` 171 | 172 | Artifact upload URL for the created or updated release. 173 | 174 | ### `changelog` 175 | 176 | Text of the parsed change log entry. 177 | 178 | ## Secrets 179 | 180 | - `GITHUB_TOKEN` Provided by GitHub action, does not need to be set. 181 | -------------------------------------------------------------------------------- /action.yml: -------------------------------------------------------------------------------- 1 | # action.yml 2 | name: "GitHub Create Tag Release" 3 | description: "Create a GitHub release from a pushed Tag." 4 | branding: 5 | icon: "zap" 6 | color: "white" 7 | inputs: 8 | # Version and release control inputs 9 | version_regex: 10 | description: "Regular expression to verify that the version is in a correct format. Defaults to .* (accept everything)." 11 | default: "^.*$" 12 | required: false 13 | prerelease_regex: 14 | description: "Any version matching this regular expression will be marked as pre-release. Disabled by default." 15 | default: "" 16 | required: false 17 | create_draft: 18 | description: "Create the releases as draft (true|false [default: false]). Existing will not be updated from released to draft." 19 | default: "false" 20 | required: false 21 | update_existing: 22 | description: "Controls whether an existing release should be updated with data from the latest push (true|false [default: false])." 23 | default: "false" 24 | required: false 25 | created_tag: 26 | description: "Allows to pass an already created tag, forces update_existing to true." 27 | default: "" 28 | required: false 29 | release_title: 30 | description: "Allows to pass a title for the release." 31 | default: "" 32 | required: false 33 | 34 | # Inputs related to the Changelog parsing 35 | changelog_file: 36 | description: "Path of file that contains the Markdown formatted changelog." 37 | default: "CHANGELOG.md" 38 | required: false 39 | changelog_heading: 40 | description: "Heading level at which the tag headings exist." 41 | default: "h2" 42 | required: false 43 | release_text: 44 | description: "Text body that will be added to the release. This will disable change log parsing" 45 | default: "" 46 | required: false 47 | outputs: 48 | id: 49 | description: "The ID of the created Release" 50 | html_url: 51 | description: "The URL users can navigate to in order to view the release" 52 | upload_url: 53 | description: "The URL for uploading assets to the release" 54 | changelog: 55 | description: "Parsed content from the provided changelog file" 56 | 57 | runs: 58 | using: "docker" 59 | image: "Dockerfile" 60 | -------------------------------------------------------------------------------- /entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Backwards compatibility mapping 4 | if [ -z "$VERSION_REGEX" ]; then :; else 5 | INPUT_VERSION_REGEX=$VERSION_REGEX 6 | fi 7 | if [ -z "$PRERELEASE_REGEX" ]; then :; else 8 | INPUT_PRERELEASE_REGEX=$PRERELEASE_REGEX 9 | fi 10 | if [ -z "$DRAFT" ]; then :; else 11 | INPUT_CREATE_DRAFT=$DRAFT 12 | fi 13 | if [ -z "$UPDATE_EXISTING" ]; then :; else 14 | INPUT_UPDATE_EXISTING=$UPDATE_EXISTING 15 | fi 16 | if [ -z "$CHANGELOG_FILE" ]; then :; else 17 | INPUT_CHANGELOG_FILE=$CHANGELOG_FILE 18 | fi 19 | if [ -z "$CHANGELOG_HEADING" ]; then :; else 20 | INPUT_CHANGELOG_HEADING=$CHANGELOG_HEADING 21 | fi 22 | if [ -z "${INPUT_RELEASE_TEXT}" ]; then 23 | PARSE_CHANGELOG=true 24 | else 25 | PARSE_CHANGELOG=false 26 | RELEASE_BODY=${INPUT_RELEASE_TEXT} 27 | fi 28 | 29 | set -euo 30 | 31 | set_tag() { 32 | if [ -n "${INPUT_CREATED_TAG}" ]; then 33 | TAG=${INPUT_CREATED_TAG} 34 | else 35 | TAG="$(echo "${GITHUB_REF}" | grep tags | sed --regexp-extended 's/^\w+\/\w+\///g' || true)" 36 | fi 37 | } 38 | 39 | create_release_data() { 40 | RELEASE_DATA="{}" 41 | RELEASE_DATA=$(echo "${RELEASE_DATA}" | jq --arg tag "$TAG" '.tag_name = $tag') 42 | if $PARSE_CHANGELOG; then 43 | echo "::debug::Trying to parse change log" 44 | if [ -e "$INPUT_CHANGELOG_FILE" ]; then 45 | echo "::debug::Change log file found" 46 | RELEASE_BODY=$(submark -O --"$INPUT_CHANGELOG_HEADING" "$TAG" "$INPUT_CHANGELOG_FILE") 47 | if [ -n "${RELEASE_BODY}" ]; then 48 | echo "::notice::Changelog entry found, adding to release" 49 | RELEASE_BODY=$(echo "$RELEASE_BODY" | sed -z 's/%/%25/g') 50 | RELEASE_BODY=$(echo "$RELEASE_BODY" | sed -z 's/\n/%0A/g') 51 | RELEASE_BODY=$(echo "$RELEASE_BODY" | sed -z 's/\r/%0D/g') 52 | echo "changelog=${RELEASE_BODY}" >>"$GITHUB_OUTPUT" 53 | RELEASE_DATA=$(echo "${RELEASE_DATA}" | jq --arg body "${RELEASE_BODY}" '.body = $body') 54 | else 55 | echo "::warning::Changelog entry not found!" 56 | fi 57 | else 58 | echo "::warning::Changelog file not found! ($INPUT_CHANGELOG_FILE)" 59 | fi 60 | else 61 | echo "::notice::Using passed release text" 62 | RELEASE_DATA=$(echo "${RELEASE_DATA}" | jq --arg body "${RELEASE_BODY}" '.body = $body') 63 | fi 64 | RELEASE_DATA=$(echo "${RELEASE_DATA}" | jq --argjson value "${INPUT_CREATE_DRAFT}" '.draft = $value') 65 | _PRERELEASE_VALUE="false" 66 | if [ -n "${INPUT_PRERELEASE_REGEX}" ]; then 67 | if echo "${TAG}" | grep -qE "$INPUT_PRERELEASE_REGEX"; then 68 | _PRERELEASE_VALUE="true" 69 | fi 70 | fi 71 | RELEASE_DATA=$(echo "${RELEASE_DATA}" | jq --argjson value $_PRERELEASE_VALUE '.prerelease = $value') 72 | if [ -n "${INPUT_RELEASE_TITLE}" ]; then 73 | RELEASE_DATA=$(echo "${RELEASE_DATA}" | jq --arg name "${INPUT_RELEASE_TITLE}" '.name = $name') 74 | fi 75 | } 76 | 77 | set_tag 78 | 79 | if [ -z "$TAG" ]; then 80 | echo "::error::This is not a tagged push." 1>&2 81 | exit 1 82 | fi 83 | 84 | if ! echo "${TAG}" | grep -qE "$INPUT_VERSION_REGEX"; then 85 | echo "::error::Bad version in tag, needs to be adhere to the regex '$INPUT_VERSION_REGEX'" 1>&2 86 | exit 1 87 | fi 88 | 89 | AUTH_HEADER="Authorization: token ${GITHUB_TOKEN}" 90 | RELEASE_ID=$TAG 91 | 92 | echo "Starting release process for tag '$TAG'" 93 | HTTP_RESPONSE=$(curl --write-out "HTTPSTATUS:%{http_code}" \ 94 | -sSL \ 95 | -H "${AUTH_HEADER}" \ 96 | "https://api.github.com/repos/${GITHUB_REPOSITORY}/releases/tags/${RELEASE_ID}") 97 | 98 | HTTP_STATUS=$(echo "$HTTP_RESPONSE" | tr -d '\n' | sed -e 's/.*HTTPSTATUS://') 99 | 100 | if [ "$HTTP_STATUS" -eq 200 ]; then 101 | echo "Existing release found" 102 | 103 | if [ "${INPUT_UPDATE_EXISTING}" = "true" ]; then 104 | echo "Updating existing release" 105 | create_release_data 106 | RECEIVED_DATA=$(echo "$HTTP_RESPONSE" | sed -e 's/HTTPSTATUS\:.*//g') 107 | 108 | RELEASE_DATA=$(echo "$RELEASE_DATA" | jq --argjson r_value "$(echo "$RECEIVED_DATA" | jq '.draft')" '.draft = if ( $r_value != true or .draft != true ) then false else true end ') 109 | 110 | RESPONSE="$(curl \ 111 | --write-out "%{http_code}" \ 112 | --silent \ 113 | --show-error \ 114 | --location \ 115 | --request PATCH \ 116 | --header "${AUTH_HEADER}" \ 117 | --header "Content-Type: application/json" \ 118 | --data "${RELEASE_DATA}" \ 119 | "$(echo "${RECEIVED_DATA}" | jq -r '.url')")" 120 | 121 | HTTP_STATUS=$(echo "$RESPONSE" | tail -n1) 122 | CONTENT=$(echo "$RESPONSE" | sed "$ d" | jq --args) 123 | 124 | if [ "$HTTP_STATUS" -eq 200 ]; then 125 | echo "::notice::Release updated" 126 | { 127 | echo "id=$(echo "$CONTENT" | jq ".id")" 128 | echo "html_url=$(echo "$CONTENT" | jq ".html_url")" 129 | echo "upload_url=$(echo "$CONTENT" | jq ".upload_url")" 130 | } >>"$GITHUB_OUTPUT" 131 | else 132 | echo "::error::Failed to update release ($HTTP_STATUS):" 133 | echo "$CONTENT" | jq ".errors" 134 | exit 1 135 | fi 136 | else 137 | echo "::notice::Updating disabled, finishing workflow" 138 | fi 139 | else 140 | echo "Creating new release" 141 | create_release_data 142 | RESPONSE=$(curl \ 143 | --write-out "%{http_code}" \ 144 | --silent \ 145 | --show-error \ 146 | --location \ 147 | --header "${AUTH_HEADER}" \ 148 | --header "Content-Type: application/json" \ 149 | --data "${RELEASE_DATA}" \ 150 | "https://api.github.com/repos/${GITHUB_REPOSITORY}/releases") 151 | 152 | HTTP_STATUS=$(echo "$RESPONSE" | tail -n1) 153 | CONTENT=$(echo "$RESPONSE" | sed "$ d" | jq --args) 154 | 155 | if [ "$HTTP_STATUS" -eq 201 ]; then 156 | echo "::notice::Release successfully created" 157 | { 158 | echo "id=$(echo "$CONTENT" | jq ".id")" 159 | echo "html_url=$(echo "$CONTENT" | jq ".html_url")" 160 | echo "upload_url=$(echo "$CONTENT" | jq ".upload_url")" 161 | } >>"$GITHUB_OUTPUT" 162 | else 163 | echo "::error::Failed to update release ($HTTP_STATUS):" 164 | echo "$CONTENT" | jq ".errors" 165 | exit 1 166 | fi 167 | fi 168 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": [ 4 | "config:base" 5 | ], 6 | "enabledManagers": [ 7 | "dockerfile" 8 | ] 9 | } 10 | --------------------------------------------------------------------------------