@@ -37,88 +37,98 @@ inputs:
3737 packages and dependencies.
3838 required : false
3939 default : " false"
40- python-version :
41- description : " Python version."
42- default : " 3.13"
43- scancodeio-repo-branch :
44- description : " Branch to install ScanCode.io from the GitHub repository (optional)"
45- required : false
46- default : " "
47- scancodeio-extras :
48- description : " ScanCode.io optional dependencies (comma-separated) (optional)."
49- required : false
50- default : " "
40+ scancodeio-image :
41+ description : " ScanCode.io Docker image to use."
42+ default : " ghcr.io/aboutcode-org/scancode.io:sha256-057627791ae2748b9ce980b0bd21bd6b521c77b7b2e24c074ef7ba98119a611f"
5143
5244runs :
5345 using : " composite"
5446 steps :
55- - name : Set up Python
56- uses : actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
57- with :
58- python-version : ${{ inputs.python-version }}
47+ - name : Validate inputs
48+ shell : bash
49+ env :
50+ INPUT_IMAGE : ${{ inputs.scancodeio-image }}
51+ INPUT_PROJECT_NAME : ${{ inputs.project-name }}
52+ INPUT_FAIL_LEVEL : ${{ inputs.compliance-fail-level }}
53+ INPUT_PIPELINES : ${{ inputs.pipelines }}
54+ run : |
55+ # Docker image ref: registry/name:tag or registry/name@sha256:digest
56+ if [[ ! "$INPUT_IMAGE" =~ ^[a-zA-Z0-9./_:@-]+$ ]]; then
57+ echo "::error::Invalid image name: $INPUT_IMAGE"
58+ exit 1
59+ fi
60+
61+ # Project name: alphanumeric, spaces, hyphens, underscores, dots
62+ if [[ ! "$INPUT_PROJECT_NAME" =~ ^[a-zA-Z0-9[:space:]._-]+$ ]]; then
63+ echo "::error::Invalid project name: $INPUT_PROJECT_NAME"
64+ exit 1
65+ fi
66+
67+ # Fail level: only known values
68+ if [[ ! "$INPUT_FAIL_LEVEL" =~ ^(ERROR|WARNING|MISSING)$ ]]; then
69+ echo "::error::Invalid compliance-fail-level: $INPUT_FAIL_LEVEL"
70+ exit 1
71+ fi
72+
73+ # Pipeline names: alphanumeric, underscores, commas
74+ if [[ ! "$INPUT_PIPELINES" =~ ^[a-zA-Z0-9_,[:space:]]+$ ]]; then
75+ echo "::error::Invalid pipelines value: $INPUT_PIPELINES"
76+ exit 1
77+ fi
5978
6079 - name : Set up environment
6180 shell : bash
6281 env :
6382 INPUT_PROJECT_NAME : ${{ inputs.project-name }}
83+ INPUT_IMAGE : ${{ inputs.scancodeio-image }}
6484 run : |
6585 echo "SECRET_KEY=$(openssl rand -base64 32)" >> "$GITHUB_ENV"
6686 echo "SCANCODEIO_DB_NAME=scancodeio" >> "$GITHUB_ENV"
6787 echo "SCANCODEIO_DB_USER=scancodeio" >> "$GITHUB_ENV"
6888 echo "SCANCODEIO_DB_PASSWORD=scancodeio" >> "$GITHUB_ENV"
69- # Sanitize project name for artifact usage
89+ echo "SCANCODEIO_WORKSPACE_LOCATION=/workspace/.scancodeio" >> "$GITHUB_ENV"
90+ echo "SCANCODEIO_IMAGE=$INPUT_IMAGE" >> "$GITHUB_ENV"
7091 SAFE_PROJECT_NAME="${INPUT_PROJECT_NAME//[^a-zA-Z0-9._-]/_}"
7192 echo "SAFE_PROJECT_NAME=$SAFE_PROJECT_NAME" >> "$GITHUB_ENV"
7293
73- - name : Detect if ScanCode.io is already installed
74- shell : bash
75- run : |
76- if command -v scanpipe &> /dev/null; then
77- echo "ScanCode.io already installed."
78- echo "SCANCODEIO_IS_INSTALLED=true" >> "$GITHUB_ENV"
79- else
80- echo "ScanCode.io not found."
81- echo "SCANCODEIO_IS_INSTALLED=false" >> "$GITHUB_ENV"
82- fi
83-
8494 - name : Start and setup the PostgreSQL service
85- if : env.SCANCODEIO_IS_INSTALLED != 'true'
8695 shell : bash
8796 run : |
8897 sudo systemctl start postgresql.service
8998 sudo -u postgres createuser --no-createrole --no-superuser --login --inherit --createdb "$SCANCODEIO_DB_USER"
9099 sudo -u postgres psql -c "ALTER USER $SCANCODEIO_DB_USER WITH ENCRYPTED PASSWORD '$SCANCODEIO_DB_PASSWORD'"
91100 sudo -u postgres createdb --owner=scancodeio --encoding=UTF-8 "$SCANCODEIO_DB_NAME"
92101
93- - name : Generate scancodeio pip install argument
94- if : env.SCANCODEIO_IS_INSTALLED != 'true'
102+ - name : Write scanpipe wrapper script
95103 shell : bash
96- env :
97- INPUT_EXTRAS : ${{ inputs.scancodeio-extras }}
98104 run : |
99- SCANCODEIO_PIP_PACKAGE_ARG="scancodeio"
100- TRIMMED_EXTRAS="$(echo "$INPUT_EXTRAS" | tr -d '[:space:]')"
101- if [ -n "$TRIMMED_EXTRAS" ]; then
102- SCANCODEIO_PIP_PACKAGE_ARG+="[$TRIMMED_EXTRAS]"
103- fi
104- echo "SCANCODEIO_PIP_PACKAGE_ARG=${SCANCODEIO_PIP_PACKAGE_ARG}" >> "$GITHUB_ENV"
105+ cat > "$RUNNER_TEMP/scanpipe" << 'EOF'
106+ #!/usr/bin/env bash
107+ set -euo pipefail
108+ exec docker run --rm \
109+ --network host \
110+ --read-only \
111+ --tmpfs /tmp \
112+ --cap-drop ALL \
113+ --security-opt no-new-privileges \
114+ -e SECRET_KEY \
115+ -e SCANCODEIO_DB_NAME \
116+ -e SCANCODEIO_DB_USER \
117+ -e SCANCODEIO_DB_PASSWORD \
118+ -e SCANCODEIO_DB_HOST=localhost \
119+ -e SCANCODEIO_WORKSPACE_LOCATION \
120+ -v "$GITHUB_WORKSPACE:/workspace" \
121+ "$SCANCODEIO_IMAGE" \
122+ scanpipe "$@"
123+ EOF
124+ chmod +x "$RUNNER_TEMP/scanpipe"
125+ echo "$RUNNER_TEMP" >> "$GITHUB_PATH"
105126
106- - name : Install ScanCode.io (only if not already installed)
107- if : env.SCANCODEIO_IS_INSTALLED != 'true'
127+ - name : Pull the ScanCode.io image
108128 shell : bash
109- env :
110- INPUT_REPO_BRANCH : ${{ inputs.scancodeio-repo-branch }}
111- run : |
112- if [ -z "$INPUT_REPO_BRANCH" ]; then
113- echo "Installing the latest ${SCANCODEIO_PIP_PACKAGE_ARG} release from PyPI"
114- pip install --upgrade "$SCANCODEIO_PIP_PACKAGE_ARG"
115- else
116- echo "Installing ${SCANCODEIO_PIP_PACKAGE_ARG} from the GitHub branch: $INPUT_REPO_BRANCH"
117- pip install "${SCANCODEIO_PIP_PACKAGE_ARG} @ git+https://github.com/aboutcode-org/scancode.io.git@${INPUT_REPO_BRANCH}"
118- fi
129+ run : docker pull "$SCANCODEIO_IMAGE"
119130
120131 - name : Run migrations to prepare the database
121- if : env.SCANCODEIO_IS_INSTALLED != 'true'
122132 shell : bash
123133 run : scanpipe migrate --verbosity 0
124134
@@ -130,6 +140,7 @@ runs:
130140 IFS=',' read -ra PIPELINES <<< "$INPUT_PIPELINES"
131141 PIPELINE_CLI_ARGS=""
132142 for pipeline in "${PIPELINES[@]}"; do
143+ pipeline="$(echo "$pipeline" | tr -d '[:space:]')"
133144 PIPELINE_CLI_ARGS+=" --pipeline $pipeline"
134145 done
135146 echo "PIPELINE_CLI_ARGS=${PIPELINE_CLI_ARGS}" >> "$GITHUB_ENV"
@@ -164,8 +175,9 @@ runs:
164175 INPUT_PROJECT_NAME : ${{ inputs.project-name }}
165176 run : |
166177 project_status=$(scanpipe status --project "$INPUT_PROJECT_NAME")
167- work_directory=$(echo "$project_status" | grep -oP 'Work directory:\s*\K[^\n]+')
168- echo "PROJECT_WORK_DIRECTORY=$work_directory" >> "$GITHUB_ENV"
178+ container_work_dir=$(echo "$project_status" | grep -oP 'Work directory:\s*\K[^\n]+')
179+ host_work_dir="$GITHUB_WORKSPACE${container_work_dir#/workspace}"
180+ echo "PROJECT_WORK_DIRECTORY=$host_work_dir" >> "$GITHUB_ENV"
169181
170182 - name : Copy input files to project work directory
171183 if : ${{ !inputs.input-urls }}
0 commit comments