From 04fdb981ebc3b4964d2de67dcb4ce7992d3406bd Mon Sep 17 00:00:00 2001 From: Antoine Cotten Date: Tue, 26 Oct 2021 16:01:22 +0200 Subject: [PATCH] Restore "Send automated PR upon new stack release" This reverts commit 9016e00e7bf170f31d025eff838cfb5209bbdd57 and updates the 'latest' version detection logic to iterate over releases and pick the latest matching semver, instead of relying on GitHub's '/releases/latest' API. --- .github/workflows/update.yml | 78 ++++++++++++++++++++++++++++++++++++ .gitignore | 3 ++ 2 files changed, 81 insertions(+) create mode 100644 .github/workflows/update.yml create mode 100644 .gitignore diff --git a/.github/workflows/update.yml b/.github/workflows/update.yml new file mode 100644 index 0000000..2fb4f26 --- /dev/null +++ b/.github/workflows/update.yml @@ -0,0 +1,78 @@ +name: Update Elastic release + +on: + schedule: + - cron: '0 0 * * 0' # At 00:00 every Sunday + +jobs: + + check-and-update: + name: Check and update Elastic release + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - uses: actions/setup-node@v2 + - run: npm install semver + + - name: Get latest release version + uses: actions/github-script@v5 + id: get-latest-release + with: + script: | + const semver = require('semver') + + const latestVersion = await github. + paginate(github.rest.repos.listReleases, { + owner: 'elastic', + repo: 'elasticsearch' + }) + .then(releases => { + for (const release of releases) { + // Results are returned sorted by created_at, so it is safe to assume + // that the first encountered match is also the series' latest release. + + const version=semver.clean(release.tag_name) + + if (semver.satisfies(version, '7.x')) { + return version + } + } + }); + + if (latestVersion) { + // Return an object so that the result can be handled as structured data + // instead of a quoted string in subsequent steps. + return { version: latestVersion } + } + + - name: Update stack version + id: update-files + if: steps.get-latest-release.outputs.result + run: | + source .env + cur_ver="$ELK_VERSION" + new_ver=${{ fromJson(steps.get-latest-release.outputs.result).version }} + + # Escape dot characters so sed interprets them as literal dots + cur_ver="$(echo $cur_ver | sed 's/\./\\./g')" + + for f in .env docker-stack.yml README.md; do + sed -i "s/${cur_ver}/${new_ver}/g" "$f" + done + + git_status="$(git status --porcelain)" + if [[ ${git_status} ]]; then + echo -e 'Changes to be committed:\n' + echo "${git_status}" + echo '::set-output name=has_changes::true' + fi + + - name: Send pull request to update to new version + if: steps.update-files.outputs.has_changes + uses: peter-evans/create-pull-request@v3 + with: + commit-message: Update to v${{ fromJson(steps.get-latest-release.outputs.result).version }} + title: Update to v${{ fromJson(steps.get-latest-release.outputs.result).version }} + delete-branch: true diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..753765e --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +# Node.js artifacts created by certain GitHub Actions +/node_modules/ +/package-lock.json