Skip to content
Merged
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
60 changes: 60 additions & 0 deletions .github/scripts/extract_from_release_notes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
#!/usr/bin/env python3
#
# Copyright (C) 2019 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#

"""
Extract the latest release notes content from RELEASE_NOTES.md
"""

import argparse
import os
import sys
import traceback


def latest_content(release_notes_path):
"""
can't change the format of the original content
"""
content = ""
start_extract = False
with open(release_notes_path, encoding="utf-8") as f:
for line in f:
if line.startswith("## "):
if start_extract:
break

start_extract = True
continue

# hit a separated line
if line.startswith("---"):
break

content += line

content += os.linesep
return content


def main():
"""
GO!GO!!GO!!!
"""
parser = argparse.ArgumentParser(description="run the sample and examine outputs")
parser.add_argument("release_notes_path", type=str)
args = parser.parse_args()

ret = 1
try:
print(latest_content(args.release_notes_path))
ret = 0
except AssertionError:
traceback.print_exc()
return ret


if __name__ == "__main__":
sys.exit(main())
123 changes: 123 additions & 0 deletions .github/scripts/fetch_and_compare_version.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
#!/usr/bin/env python3
#
# Copyright (C) 2019 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#

import re
import shlex
import subprocess
import sys


def fetch_version_from_code():
"""
search the semantic version definition in build-scripts/config_common.cmake
"""
major, minor, patch = "", "", ""
with open("core/version.h", encoding="utf-8") as f:
for line in f:
if "WAMR_VERSION" not in line:
continue

major_match = re.search(r"WAMR_VERSION_MAJOR (\d+)", line)
if major_match is not None:
major = major_match.groups()[0]
continue

minor_match = re.search(r"WAMR_VERSION_MINOR (\d+)", line)
if minor_match is not None:
minor = minor_match.groups()[0]
continue

patch_match = re.search(r"WAMR_VERSION_PATCH (\d+)", line)
if patch_match is not None:
patch = patch_match.groups()[0]

if len(major) == 0 or len(minor) == 0 or len(patch) == 0:
raise Exception(
"can't find the semantic version definition likes WAMR_VERSION_*"
)
return f"WAMR-{major}.{minor}.{patch}"


def fetch_latest_git_tag():
list_tag_cmd = (
'git tag --list WAMR-*.*.* --sort=committerdate --format="%(refname:short)"'
)
p = subprocess.run(shlex.split(list_tag_cmd), capture_output=True, check=True)

all_tags = p.stdout.decode().strip()
latest_tag = all_tags.split("\n")[-1]
return latest_tag


def match_version_pattern(v):
pattern = r"WAMR-\d+\.\d+\.\d+"
m = re.match(pattern, v)
return m is not None


def split_version_string(v):
"""
return the semantic version as an integer list
"""
pattern = r"WAMR-(\d+)\.(\d+)\.(\d+)"
m = re.match(pattern, v)
return [int(x) for x in m.groups()]


def compare_version_string(v1, v2):
"""
return value:
- 1. if v1 > v2
- -1. if v1 < v2
- 0. if v1 == v2
"""
if not match_version_pattern(v1):
raise Exception(f"{v1} doesn't match the version pattern")

if not match_version_pattern(v2):
raise Exception(f"{v2} doesn't match the version pattern")

v1_sem_ver = split_version_string(v1)
v2_sem_ver = split_version_string(v2)

return 0 if v1_sem_ver == v2_sem_ver else (1 if v1_sem_ver > v2_sem_ver else -1)


def is_major_or_minor_changed(v1, v2):
"""
return true if change either major of v2 or minor of v2
return false or else
"""
if not match_version_pattern(v1):
raise Exception(f"{v1} doesn't match the version pattern")

if not match_version_pattern(v2):
raise Exception(f"{v2} doesn't match the version pattern")

v1_major, v1_minor, _ = split_version_string(v1)
v2_major, v2_minor, _ = split_version_string(v2)

return v2_major != v1_major or v2_minor != v1_minor


def next_version():
definition = fetch_version_from_code()
tag = fetch_latest_git_tag()

new_version = ""
minor_changed = False
if compare_version_string(definition, tag) == 1:
new_version = definition.split("-")[-1]

if is_major_or_minor_changed(tag, definition):
minor_changed = True

return new_version, "major_minor_change" if minor_changed else "patch_change"


if __name__ == "__main__":
print(f"{next_version()[0]},{next_version()[1]}")
sys.exit(0)
102 changes: 102 additions & 0 deletions .github/scripts/reuse_latest_release_binaries.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
#!/usr/bin/env python3
#
# Copyright (C) 2019 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#

import argparse
import json
import os
import shlex
import subprocess
import sys
from urllib.error import HTTPError, URLError
import urllib.request


def get_last_commit(target_path, cwd):
last_commit_cmd = f"git log -n 1 --pretty=format:%H -- {target_path}"
p = subprocess.run(
shlex.split(last_commit_cmd), capture_output=True, check=True, cwd=cwd
)
return p.stdout.decode().strip()


def fetch_git_tags():
list_tag_cmd = (
'git tag --list WAMR-*.*.* --sort=committerdate --format="%(refname:short)"'
)
p = subprocess.run(shlex.split(list_tag_cmd), capture_output=True, check=True)

all_tags = p.stdout.decode().strip()
return all_tags.split("\n")


def download_binaries(binary_name_stem, cwd):
"""
1. find the latest release name
2. form assets download url:
"""
try:
all_tags = fetch_git_tags()
# *release_process.yml* will create a tag and release at first
second_last_tag = all_tags[-2]
latest_tag = all_tags[-1]

latest_url = "https://api.github.com/repos/bytecodealliance/wasm-micro-runtime/releases/latest"
print(f"::notice::query the latest release with {latest_url}...")
with urllib.request.urlopen(latest_url) as response:
body = response.read()

release_name = json.loads(body)["name"]

# WAMR-X.Y.Z -> X.Y.Z
second_last_sem_ver = second_last_tag[5:]
latest_sem_ver = latest_tag[5:]
assert latest_sem_ver in binary_name_stem
name_stem_in_release = binary_name_stem.replace(
latest_sem_ver, second_last_sem_ver
)

# download and rename
for file_ext in (".zip", ".tar.gz"):
assets_url = f"https://github.com/bytecodealliance/wasm-micro-runtime/releases/download/{release_name}/{name_stem_in_release}{file_ext}"
local_path = f"{binary_name_stem}{file_ext}"
print(f"::notice::download from {assets_url} and save as {local_path}...")
urllib.request.urlretrieve(assets_url, local_path)
return True
except HTTPError as error:
print(error.status, error.reason)
except URLError as error:
print(error.reason)
except TimeoutError:
print("Request timeout")

return False


def main():
parser = argparse.ArgumentParser(
description="Reuse binaries of the latest release if no more modification on the_path since last_commit"
)
parser.add_argument("working_directory", type=str)
parser.add_argument("--binary_name_stem", type=str)
parser.add_argument("--last_commit", type=str)
parser.add_argument("--the_path", type=str)
args = parser.parse_args()

last_commit = get_last_commit(args.the_path, args.working_directory)
if last_commit == args.last_commit:
return download_binaries(args.binary_name_stem, args.working_directory)
else:
return False


if __name__ == "__main__":
# use output to indicate results
# echo "result=${result}" >> "$GITHUB_OUTPUT"
with open(os.environ.get("GITHUB_OUTPUT"), 'a') as output_file:
output_file.write("result=hit\n" if main() else "result=not-hit\n")

# always return 0
sys.exit(0)
48 changes: 48 additions & 0 deletions .github/workflows/build_docker_images.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Copyright (C) 2019 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

name: Create and publish Docker images

on:
workflow_call:
inputs:
ver_num:
description: a semantic version number.
type: string
required: true

jobs:
build-and-push-images:
runs-on: ubuntu-22.04
permissions:
contents: read
packages: write

steps:
- name: Checkout repository
uses: actions/checkout@v3

- name: Downcase github actor
id: downcase_github_actor
uses: ASzc/change-string-case-action@v2
with:
string: ${{ github.actor }}

- name: Login to the Container registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ steps.downcase_github_actor.outputs.lowercase }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Build and push Docker image(wasm-toolchain:${{ inputs.ver_num }}) to Container registry
run: |
docker build -t ghcr.io/${{ steps.downcase_github_actor.outputs.lowercase }}/wasm-toolchain:${{ inputs.ver_num }} .
docker push ghcr.io/${{ steps.downcase_github_actor.outputs.lowercase }}/wasm-toolchain:${{ inputs.ver_num }}
working-directory: test-tools/wamr-ide/WASM-Toolchain/Docker

- name: Build and push Docker image(wasm-debug-server:${{ inputs.ver_num }}) to Container registry
run: |
docker build -t ghcr.io/${{ steps.downcase_github_actor.outputs.lowercase }}/wasm-debug-server:${{ inputs.ver_num }} .
docker push ghcr.io/${{ steps.downcase_github_actor.outputs.lowercase }}/wasm-debug-server:${{ inputs.ver_num }}
working-directory: test-tools/wamr-ide/WASM-Debug-Server/Docker
Loading