From 8b06a770877055182a1c61d49c5f547a39d36d0a Mon Sep 17 00:00:00 2001 From: Manuel Date: Wed, 9 Apr 2025 12:44:03 +0200 Subject: [PATCH 1/3] feat: added .github/actions/get_last_stable_version composite action --- .../get_last_stable_version/action.yml | 33 ++++++++ .../get_last_stable_version.py | 80 +++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 .github/actions/get_last_stable_version/action.yml create mode 100755 .github/actions/get_last_stable_version/get_last_stable_version.py diff --git a/.github/actions/get_last_stable_version/action.yml b/.github/actions/get_last_stable_version/action.yml new file mode 100644 index 00000000000..c320650d04f --- /dev/null +++ b/.github/actions/get_last_stable_version/action.yml @@ -0,0 +1,33 @@ +name: "Get last stable version" +description: "Get last stable version for the given arguments" + +inputs: + repo_owner: + required: true + description: "Repository owner" + repo_name: + required: true + description: "Repository name" + testing_version: + required: true + description: "Version of the tested package" + +output: + latest_stable_version: + description: "Latest stable version before given testing_version" + value: ${{ steps.latest-stable-release.outputs.latest-stable-release }} + +runs: + using: "composite" + steps: + - name: Random Number Generator + id: latest-stable-release + shell: bash + run: | + version=$( + .github/actions/get_last_stable_version/get_last_stable_version.py \ + -o "${{ inputs.repo_owner }}" \ + -r "${{ inputs.repo_name }}" \ + -v "${{ inputs.testing_version }}" + ) + echo latest-stable-release=$version >> $GITHUB_OUTPUT diff --git a/.github/actions/get_last_stable_version/get_last_stable_version.py b/.github/actions/get_last_stable_version/get_last_stable_version.py new file mode 100755 index 00000000000..257fe42e568 --- /dev/null +++ b/.github/actions/get_last_stable_version/get_last_stable_version.py @@ -0,0 +1,80 @@ +"""Module providing a function to get the last stable version for a given +owner, repository and target_version combination. +""" + +#! /usr/bin/env python3 +# -*- coding: utf-8 -*- + +import argparse +import requests +from packaging import version + +def get_previous_stable_version(owner: str, repository: str, + target_version: str) -> str | None: + """Returns the previous stable version for the given arguments. + Args: + owner: (str): Repository owner. + repository: (str): Repository name. + target_version: (str): Version on the basis of which we are looking for + the most recent previous stable version. + Returns: + ver: (str): Most recent stable version. + """ + url = f"https://api.github.com/repos/{owner}/{repository}/releases" + try: + # Get GitHub releases + response = requests.get(url, timeout=20) + response.raise_for_status() + releases = response.json() + + # Extract stable versions + stable_versions = [] + for release in releases: + tag = release['tag_name'] + if not any(x in tag for x in ['-alpha', '-rc', '-beta']): + try: + ver = version.parse(tag[1:]) # Remove initial 'v' + stable_versions.append(ver) + except version.InvalidVersion: + continue + + # Sort versions + stable_versions.sort(reverse=True) + + target_ver = version.parse(target_version) + + # Find the first version lower than the target + for ver in stable_versions: + if ver < target_ver: + return str(ver) + + return None + + except requests.Timeout: + print("Error: Request timed out.") + + except requests.RequestException as e: + print(f"Request error: {e}") + +def main(): + """Main function.""" + script_description = ( + "Get the last stable version for a given owner, repository and \ + target_version combination." + ) + + parser = argparse.ArgumentParser(description=script_description) + parser.add_argument("-o", "--owner", type=str, action="store", + required=True, help="Repository owner.") + parser.add_argument("-r", "--repository", type=str, action="store", + required=True, help="Repository name.") + parser.add_argument("-v", "--version", type=str, action="store", + required=True, help="Generates JSON file output.") + + args = parser.parse_args() + + print(get_previous_stable_version(args.owner, args.repository, + args.version)) + +if __name__ == "__main__": + main() From 57eb4af1b783b9f7d8be1082b76563f0ef75c5db Mon Sep 17 00:00:00 2001 From: Manuel Date: Wed, 9 Apr 2025 12:54:59 +0200 Subject: [PATCH 2/3] test: added testing workflow --- .../get_last_stable_version/action.yml | 5 ++-- .../get_last_stable_version.py | 5 ++-- .../test_get_last_stable_version.yml | 30 +++++++++++++++++++ 3 files changed, 34 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/test_get_last_stable_version.yml diff --git a/.github/actions/get_last_stable_version/action.yml b/.github/actions/get_last_stable_version/action.yml index c320650d04f..b5b024f7eb0 100644 --- a/.github/actions/get_last_stable_version/action.yml +++ b/.github/actions/get_last_stable_version/action.yml @@ -12,7 +12,7 @@ inputs: required: true description: "Version of the tested package" -output: +outputs: latest_stable_version: description: "Latest stable version before given testing_version" value: ${{ steps.latest-stable-release.outputs.latest-stable-release }} @@ -24,8 +24,7 @@ runs: id: latest-stable-release shell: bash run: | - version=$( - .github/actions/get_last_stable_version/get_last_stable_version.py \ + version=$(.github/actions/get_last_stable_version/get_last_stable_version.py \ -o "${{ inputs.repo_owner }}" \ -r "${{ inputs.repo_name }}" \ -v "${{ inputs.testing_version }}" diff --git a/.github/actions/get_last_stable_version/get_last_stable_version.py b/.github/actions/get_last_stable_version/get_last_stable_version.py index 257fe42e568..99fc44b6a67 100755 --- a/.github/actions/get_last_stable_version/get_last_stable_version.py +++ b/.github/actions/get_last_stable_version/get_last_stable_version.py @@ -1,10 +1,9 @@ +#! /usr/bin/env python3 +# -*- coding: utf-8 -*- """Module providing a function to get the last stable version for a given owner, repository and target_version combination. """ -#! /usr/bin/env python3 -# -*- coding: utf-8 -*- - import argparse import requests from packaging import version diff --git a/.github/workflows/test_get_last_stable_version.yml b/.github/workflows/test_get_last_stable_version.yml new file mode 100644 index 00000000000..8f723460c56 --- /dev/null +++ b/.github/workflows/test_get_last_stable_version.yml @@ -0,0 +1,30 @@ +name: Tests get_last_stable_version composite action + +on: + pull_request: + workflow_dispatch: + inputs: + version: + description: | + Tested version + type: string + required: true +jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Check out the repository + uses: actions/checkout@v4 + + - name: Get last stable version + id: last-stable-version + uses: ./.github/actions/get_last_stable_version + with: + repo_owner: wazuh + repo_name: wazuh + testing_version: ${{inputs.version}} + + - name: Show result + run: | + echo "${{ steps.last-stable-version.outputs.latest_stable_version }}" From aa1e25cb1f0197dfd50545f716a7048a8faf1619 Mon Sep 17 00:00:00 2001 From: Manuel Cano Date: Fri, 11 Apr 2025 15:47:53 +0200 Subject: [PATCH 3/3] test: test checkout action --- .../test_get_last_stable_version.yml | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/.github/workflows/test_get_last_stable_version.yml b/.github/workflows/test_get_last_stable_version.yml index 8f723460c56..b1f37b8cdd8 100644 --- a/.github/workflows/test_get_last_stable_version.yml +++ b/.github/workflows/test_get_last_stable_version.yml @@ -14,8 +14,37 @@ jobs: runs-on: ubuntu-latest steps: + - name: Check ls pre-checkout + run: | + ls -a .. + echo "$GITHUB_WORKSPACE" + pwd + ls -a + - name: Check out the repository uses: actions/checkout@v4 + with: + path: wazuh + + - name: Check ls post-checkout wazuh/wazuh + run: | + ls -a .. + echo "$GITHUB_WORKSPACE" + pwd + ls -a + + - name: Check out the repository + uses: actions/checkout@v4 + with: + repository: wazuh/wazuh-agent + path: wazuh-agent + + - name: Check ls post-checkout wazuh/wazuh-agent + run: | + ls -a .. + echo "$GITHUB_WORKSPACE" + pwd + ls -a - name: Get last stable version id: last-stable-version