Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions .github/actions/get_last_stable_version/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
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"

outputs:
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
79 changes: 79 additions & 0 deletions .github/actions/get_last_stable_version/get_last_stable_version.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
#! /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.
"""

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()
59 changes: 59 additions & 0 deletions .github/workflows/test_get_last_stable_version.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
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 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
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 }}"
Loading