Skip to content

Commit 68edd61

Browse files
authored
Switch to actions/github-script + use octokit for github call so it handle retry and login nicely (#305)
1 parent 7439d7a commit 68edd61

1 file changed

Lines changed: 78 additions & 98 deletions

File tree

.github/workflows/glpi.yml

Lines changed: 78 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)