diff --git a/.github/workflows/pr-path-detection.yml b/.github/workflows/pr-path-detection.yml new file mode 100644 index 00000000..11157a9b --- /dev/null +++ b/.github/workflows/pr-path-detection.yml @@ -0,0 +1,157 @@ +# Copyright (C) 2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +name: Check Paths and Hyperlinks + +on: + pull_request: + branches: [main] + types: [opened, reopened, ready_for_review, synchronize] + +jobs: + check-the-validity-of-hyperlinks-in-README: + runs-on: ubuntu-latest + steps: + - name: Clean Up Working Directory + run: sudo rm -rf ${{github.workspace}}/* + + - name: Checkout Repo docs + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Check the Validity of Hyperlinks + run: | + cd ${{github.workspace}} + fail="FALSE" + # url_lines=$(grep -Eo '\]\(http[s]?://[^)]+\)' --include='*.md' -r .|grep -Ev 'linkedin') + merged_commit=$(git log -1 --format='%H') + changed_files="$(git diff --name-status --diff-filter=ARM ${{ github.event.pull_request.base.sha }} ${merged_commit} | awk '/\.md$/ {print $NF}')" + if [ -n "changed_files" ]; then + for changed_file in $changed_files; do + url_lines=$(grep -H -Eo '\]\(http[s]?://[^)]+\)' "$changed_file" | grep -Ev 'linkedin') + if [ -n "$url_lines" ]; then + for url_line in $url_lines; do + url=$(echo "$url_line"|cut -d '(' -f2 | cut -d ')' -f1|sed 's/\.git$//') + path=$(echo "$url_line"|cut -d':' -f1 | cut -d'/' -f2-) + response=$(curl -L -s -o /dev/null -w "%{http_code}" "$url") + if [ "$response" -ne 200 ]; then + echo "**********Validation failed, status code: $response, try again**********" + response_retry=$(curl -s -o /dev/null -w "%{http_code}" "$url") + if [ "$response_retry" -eq 200 ]; then + echo "*****Retry successful*****" + else + urls_line+=("$url_line") + echo "Status code: $response_retry, Link $url validation failed, will retry later." + fi + fi + done + fi + done + fi + echo "**************Start Retry**************" + for link in "${urls_line[@]}"; do + url=$(echo "$link"|cut -d '(' -f2 | cut -d ')' -f1|sed 's/\.git$//') + path=$(echo "$link"|cut -d':' -f1 | cut -d'/' -f2-) + attempt_num=1 + while [ $attempt_num -le 5 ]; do + do_retry=$(curl -s -o /dev/null -w "%{http_code}" "$url") + if [ "$do_retry" -eq 200 ]; then + echo "$url Retry successful" + break + else + echo "$url Validation failed, retrying..." + ((attempt_num++)) + sleep 10 + fi + done + + if [ $attempt_num -gt 5 ]; then + echo "Invalid link from ${{github.workspace}}/$path: $url status code: $do_retry" + fail="TRUE" + fi + done + + if [[ "$fail" == "TRUE" ]]; then + exit 1 + else + echo "All hyperlinks are valid." + fi + shell: bash + + check-the-validity-of-relative-path: + runs-on: ubuntu-latest + steps: + - name: Clean up Working Directory + run: sudo rm -rf ${{github.workspace}}/* + + - name: Checkout Repo docs + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Checking Relative Path Validity + run: | + cd ${{github.workspace}} + fail="FALSE" + repo_name=${{ github.event.pull_request.head.repo.full_name }} + if [ "$(echo "$repo_name"|cut -d'/' -f1)" != "opea-project" ]; then + owner=$(echo "${{ github.event.pull_request.head.repo.full_name }}" |cut -d'/' -f1) + branch="https://github.com/$owner/docs/tree/${{ github.event.pull_request.head.ref }}" + else + branch="https://github.com/opea-project/docs/blob/${{ github.event.pull_request.head.ref }}" + fi + link_head="https://github.com/opea-project/docs/blob/main" + merged_commit=$(git log -1 --format='%H') + changed_files="$(git diff --name-status --diff-filter=ARM ${{ github.event.pull_request.base.sha }} ${merged_commit} | awk '/\.md$/ {print $NF}')" + png_lines=$(grep -Eo '\]\([^)]+\)' --include='*.md' -r .|grep -Ev 'http'|grep -Ev 'mailto') + if [ -n "$png_lines" ]; then + for png_line in $png_lines; do + refer_path=$(echo "$png_line"|cut -d':' -f1 | cut -d'/' -f2-) + png_path=$(echo "$png_line"|cut -d '(' -f2 | cut -d ')' -f1) + if [[ "${png_path:0:1}" == "/" ]]; then + check_path="."$(echo "$png_path" | cut -d '#' -f1) + elif [[ "$png_path" == *#* ]]; then + relative_path=$(echo "$png_path" | cut -d '#' -f1) + if [ -n "$relative_path" ]; then + check_path=$(dirname "$refer_path")/$relative_path + png_path=$(echo "$png_path" | awk -F'#' '{print "#" $2}') + else + check_path=$refer_path + fi + else + check_path=$(dirname "$refer_path")/$png_path + fi + if [ -e "$check_path" ]; then + real_path=$(realpath $check_path) + if [[ "$png_line" == *#* ]]; then + if [ -n "changed_files" ] && echo "$changed_files" | grep -q "^${refer_path}$"; then + url_dev=$branch$(echo "$real_path" | sed 's|.*/docs||')$png_path + response=$(curl -I -L -s -o /dev/null -w "%{http_code}" "$url_dev") + if [ "$response" -ne 200 ]; then + echo "**********Validation failed, try again**********" + response_retry=$(curl -s -o /dev/null -w "%{http_code}" "$url_dev") + if [ "$response_retry" -eq 200 ]; then + echo "*****Retry successfully*****" + else + echo "Invalid path from ${{github.workspace}}/$refer_path: $png_path, link: $url_dev" + fail="TRUE" + fi + else + echo "Validation succeed $png_line" + fi + fi + fi + else + echo "$check_path does not exist $png_line" + fail="TRUE" + fi + done + fi + + if [[ "$fail" == "TRUE" ]]; then + exit 1 + else + echo "All relative links valid." + fi + shell: bash diff --git a/community/CONTRIBUTING.md b/community/CONTRIBUTING.md index 7da855f3..37e230ae 100644 --- a/community/CONTRIBUTING.md +++ b/community/CONTRIBUTING.md @@ -370,7 +370,7 @@ The OPEA projects use GitHub Action for CI test. - End to End Test, the PR must pass all end to end tests. #### Pull Request Review -You can add reviewers from [the code owners list](../codeowner.md) to your PR. +You can add reviewers from [the code owners list](./codeowner.md) to your PR. ## Support diff --git a/community/rfcs/24-05-16-OPEA-001-Overall-Design.md b/community/rfcs/24-05-16-OPEA-001-Overall-Design.md index 7dff6306..f227a2fa 100644 --- a/community/rfcs/24-05-16-OPEA-001-Overall-Design.md +++ b/community/rfcs/24-05-16-OPEA-001-Overall-Design.md @@ -38,7 +38,7 @@ This RFC is used to present the OPEA overall design philosophy, including overal The proposed overall architecture is -![OPEA Architecture](opea_architecture.png "OPEA Architecture") +![OPEA Architecture](opea_architecture.png) 1. GenAIComps @@ -58,7 +58,7 @@ The proposed overall architecture is The proposed OPEA workflow is -![OPEA Workflow](opea_workflow.png "OPEA Workflow") +![OPEA Workflow](opea_workflow.png) 1. Microservice