@@ -146,108 +146,88 @@ jobs:
146146 steps :
147147 - name : " Set variables"
148148 id : " set-vars"
149- run : |
149+ uses : " actions/github-script@v9"
150+ env :
150151 # Use inputs when provided, otherwise use defaults (for push/pull_request on this repo)
151- GLPI_REPO="${{ vars.GLPI_REPO || inputs.glpi-repo || 'glpi-project/glpi' }}"
152- GLPI_VERSION="${{ inputs.glpi-version || 'main' }}"
153- PHP_VERSION="${{ inputs.php-version || '8.5' }}"
154- PUSH="${{ inputs.push || 'false' }}"
155- PATCH_URL="${{ inputs.patch-url || '' }}"
156- IMAGE_TAG="${{ inputs.image-tag || '' }}"
157-
158- echo "glpi_repo=$GLPI_REPO" >> $GITHUB_OUTPUT
159- echo "glpi_version=$GLPI_VERSION" >> $GITHUB_OUTPUT
160- echo "php_version=$PHP_VERSION" >> $GITHUB_OUTPUT
161- echo "push=$PUSH" >> $GITHUB_OUTPUT
162- echo "patch_url=$PATCH_URL" >> $GITHUB_OUTPUT
163- echo "image_tag=$IMAGE_TAG" >> $GITHUB_OUTPUT
164-
165- # Compute marketplace directory based on boolean use-legacy-marketplace-path input
166- USE_LEGACY_MP_PATH="${{ inputs.use-legacy-marketplace-path || 'false' }}"
167- if [[ "$USE_LEGACY_MP_PATH" = "true" ]]; then
168- echo "marketplace_dir=/var/www/glpi/marketplace" >> $GITHUB_OUTPUT
169- else
170- echo "marketplace_dir=/var/glpi/marketplace" >> $GITHUB_OUTPUT
171- fi
172-
173- # Determine if glpi-version is a semver tag (e.g., 10.0.18, 11.0.5-rc1)
174- # vs a branch, commit hash, or URL
175- IS_SEMVER=false
176- if echo "$GLPI_VERSION" | grep --quiet --extended-regexp '^[0-9]+\.[0-9]+\.[0-9]+(\-\w+)?$'; then
177- IS_SEMVER=true
178- fi
179-
180- # Fetch the commit SHA for this version/branch (for cache-busting)
181- # Same commit = cache hit, new commit = fresh build
182-
183- if echo "$GLPI_VERSION" | grep -q --extended-regexp '^https://'; then
184- # For URLs, use a random value to force rebuild, as content behind a URL can change between builds.
185- CACHE_KEY="$(head -200 /dev/urandom | sha1sum | cut --fields 1 --delimiter " ")"
186- elif [[ "$GLPI_VERSION" = "latest" ]]; then
187- # Resolve "latest" to actual tag first, then get commit SHA
188- RESOLVED_TAG=$(curl -s "https://api.github.com/repos/${GLPI_REPO}/releases/latest" | jq -r '.tag_name')
189- CACHE_KEY=$(curl -s "https://api.github.com/repos/${GLPI_REPO}/commits/$RESOLVED_TAG" | jq -r '.sha // empty')
190- else
191- CACHE_KEY=$(curl -s "https://api.github.com/repos/${GLPI_REPO}/commits/$GLPI_VERSION" | jq -r '.sha // empty')
192- fi
193- echo "cache_key=$CACHE_KEY" >> $GITHUB_OUTPUT
194-
195-
196- # Compute artifact prefix (unique per workflow call)
197- if [[ "$IMAGE_TAG" != '' ]]; then
198- ARTIFACT_PREFIX="$IMAGE_TAG"
199- else
200- # Replace slashes and colons with dashes for branches like 11.0/bugfixes
201- ARTIFACT_PREFIX="$(echo "$GLPI_VERSION" | sed --regexp-extended 's|[/:]|-|g' | sed --regexp-extended 's|https?--||')"
202- fi
203- echo "artifact_prefix=$ARTIFACT_PREFIX" >> $GITHUB_OUTPUT
204-
205- # Compute image version for metadata-action
206- if [[ "$IMAGE_TAG" != '' ]]; then
207- IMAGE_VERSION="$IMAGE_TAG"
208- else
209- IMAGE_VERSION="$(echo "$GLPI_VERSION" | sed --regexp-extended 's|[/:]|-|g' | sed --regexp-extended 's|https?--||')"
210- fi
211- echo "image_version=$IMAGE_VERSION" >> $GITHUB_OUTPUT
212-
213- # Skip all version checks if:
214- # - image-tag is provided (explicit override)
215- # - glpi-version is not a semver (branch, commit, URL)
216- if [[ "$IMAGE_TAG" != '' ]] || [[ "$IS_SEMVER" != "true" ]]; then
217- echo "is_latest=false" >> $GITHUB_OUTPUT
218- echo "is_latest_major=false" >> $GITHUB_OUTPUT
219- exit 0
220- fi
152+ GLPI_REPO : ${{ vars.GLPI_REPO || inputs.glpi-repo || 'glpi-project/glpi' }}
153+ GLPI_VERSION : ${{ inputs.glpi-version || 'main' }}
154+ PHP_VERSION : ${{ inputs.php-version || '8.5' }}
155+ PUSH : ${{ inputs.push || 'false' }}
156+ PATCH_URL : ${{ inputs.patch-url || '' }}
157+ IMAGE_TAG : ${{ inputs.image-tag || '' }}
158+ USE_LEGACY_MP_PATH : ${{ inputs.use-legacy-marketplace-path || 'false' }}
159+ with :
160+ script : |
161+ const glpiRepo = process.env.GLPI_REPO
162+ const glpiVersion = process.env.GLPI_VERSION
163+ const imageTag = process.env.IMAGE_TAG
164+
165+ const [owner, repo] = glpiRepo.split('/')
166+
167+ // Static outputs
168+ core.setOutput('glpi_repo', glpiRepo)
169+ core.setOutput('glpi_version', glpiVersion)
170+ core.setOutput('php_version', process.env.PHP_VERSION)
171+ core.setOutput('push', process.env.PUSH)
172+ core.setOutput('patch_url', process.env.PATCH_URL)
173+ core.setOutput('image_tag', imageTag)
174+ core.setOutput('marketplace_dir',
175+ process.env.USE_LEGACY_MP_PATH === 'true'
176+ ? '/var/www/glpi/marketplace'
177+ : '/var/glpi/marketplace'
178+ )
179+
180+ // Sanitize version string for use as an artifact/image name
181+ const sanitize = s => s.replace(/[/:]/g, '-').replace(/^https?--/, '')
182+ core.setOutput('artifact_prefix', imageTag || sanitize(glpiVersion))
183+ core.setOutput('image_version', imageTag || sanitize(glpiVersion))
184+
185+ // Semver detection (e.g. 10.0.18, 11.0.5-rc1) vs branch/commit/URL
186+ const isSemver = /^\d+\.\d+\.\d+(-\w+)?$/.test(glpiVersion)
187+
188+ // Cache key: ties a build to a specific commit SHA so unchanged sources hit the cache
189+ if (/^https?:\/\//.test(glpiVersion)) {
190+ // URLs: content can change without a new tag, so always force a rebuild
191+ core.setOutput('cache_key', require('crypto').randomBytes(20).toString('hex'))
192+ } else if (glpiVersion === 'latest') {
193+ const { data: rel } = await github.rest.repos.getLatestRelease({ owner, repo })
194+ core.info(`Resolved "latest" to ${rel.tag_name}`)
195+ const { data: commit } = await github.rest.repos.getCommit({ owner, repo, ref: rel.tag_name })
196+ core.setOutput('cache_key', commit.sha)
197+ } else {
198+ const { data: commit } = await github.rest.repos.getCommit({ owner, repo, ref: glpiVersion })
199+ core.setOutput('cache_key', commit.sha ?? '')
200+ }
221201
222- # Detect prerelease (contains -rc, -beta, -alpha, etc.)
223- PRERELEASE_FLAG="$( echo "$GLPI_VERSION" | grep --perl-regexp --only-matching '(\-\w+)?$' )"
224- if [[ -n "$PRERELEASE_FLAG" ]]; then
225- echo "is_latest=false" >> $GITHUB_OUTPUT
226- echo "is_latest_major=false" >> $GITHUB_OUTPUT
227- exit 0
228- fi
202+ // No latest-tag checks for explicit image-tag overrides or non-semver inputs
203+ if (imageTag || !isSemver) {
204+ core.setOutput('is_latest', 'false')
205+ core.setOutput('is_latest_major', 'false')
206+ return
207+ }
229208
230- # Check if this is the latest release overall
231- LATEST_TAG=$(curl -s "https://api.github.com/repos/${GLPI_REPO}/releases/latest" | jq -r '.tag_name')
232- if [[ "$GLPI_VERSION" = "$LATEST_TAG" ]]; then
233- echo "is_latest=true" >> $GITHUB_OUTPUT
234- else
235- echo "is_latest=false" >> $GITHUB_OUTPUT
236- fi
209+ // Prereleases (e.g. 11.0.5-rc1) also skip the latest checks
210+ if (/-\w+$/.test(glpiVersion)) {
211+ core.setOutput('is_latest', 'false')
212+ core.setOutput('is_latest_major', 'false')
213+ return
214+ }
237215
238- # Fetch all releases from GitHub API (non-prerelease only) for major series check
239- RELEASES=$(curl -s "https://api.github.com/repos/${GLPI_REPO}/releases?per_page=100" | \
240- jq -r '[.[] | select(.prerelease == false) | .tag_name]')
241-
242- # Check if this is the latest in its major series (e.g., latest 11.x.x)
243- IMAGE_VERSION_MAJOR=$(echo "$GLPI_VERSION" | cut --delimiter=. --fields=1)
244- LATEST_IN_MAJOR=$(echo "$RELEASES" | jq -r --arg major "$IMAGE_VERSION_MAJOR" \
245- '[.[] | select(startswith($major + "."))] | .[0] // empty')
246- if [[ "$GLPI_VERSION" = "$LATEST_IN_MAJOR" ]]; then
247- echo "is_latest_major=true" >> $GITHUB_OUTPUT
248- else
249- echo "is_latest_major=false" >> $GITHUB_OUTPUT
250- fi
216+ // Latest release overall
217+ const { data: latestRelease } = await github.rest.repos.getLatestRelease({ owner, repo })
218+ const isLatest = glpiVersion === latestRelease.tag_name
219+ core.info(`Latest release: ${latestRelease.tag_name} — is_latest=${isLatest}`)
220+ core.setOutput('is_latest', isLatest ? 'true' : 'false')
221+
222+ // Latest in its major
223+ const allReleases = await github.paginate(github.rest.repos.listReleases, { owner, repo, per_page: 100 })
224+ const major = glpiVersion.split('.')[0]
225+ const latestInMajor = allReleases
226+ .filter(r => !r.prerelease && r.tag_name.startsWith(major + '.'))
227+ .map(r => r.tag_name)[0] ?? ''
228+ const isLatestMajor = glpiVersion === latestInMajor
229+ core.info(`Latest in ${major}.x : ${latestInMajor || '(none)'} — is_latest_major=${isLatestMajor}`)
230+ core.setOutput('is_latest_major', isLatestMajor ? 'true' : 'false')
251231
252232 build :
253233 name : " Build [${{ matrix.platform.suffix }}]"
0 commit comments