22name : $(Build.BuildId)
33
44trigger : none
5+ pr : none
56
67variables :
78 # ## context variables
89 # repoUrl: https://github.com/owner/reponame
910 # repoBranch: master
1011 # packageName: com.namespace.pkgname
1112 # packageVersion: semver
13+ # packageSource: git|githubRelease
14+ # packageAssetUrl: https://github.com/owner/repo/releases/download/tag/file.tgz
15+ # packageAssetName: file.tgz
1216 # e2eTest: true|false
1317
1418 # ## pre-defined variables
@@ -43,12 +47,28 @@ stages:
4347 echo repoBranch: $REPOBRANCH
4448 echo packageName: $PACKAGENAME
4549 echo packageVersion: $PACKAGEVERSION
50+ echo packageSource: ${PACKAGESOURCE:-git}
51+ echo packageAssetName: ${PACKAGEASSETNAME:-}
4652 echo e2eTest: ${E2ETEST:-false}
47- [[ -z "$REPOURL" ]] && echo 'variable repoUrl not found' && exit 1
48- [[ -z "$REPOBRANCH" ]] && echo 'variable repoBranch not found' && exit 1
4953 [[ -z "$PACKAGENAME" ]] && echo 'variable packageName not found' && exit 1
5054 [[ -z "$PACKAGEVERSION" ]] && echo 'variable packageVersion not found' && exit 1
51- echo "##vso[build.updatebuildnumber]$(packageName)-$(packageVersion)-$(Build.BuildId)"
55+ if [ "${PACKAGESOURCE:-git}" = "git" ]; then
56+ [[ -z "$REPOURL" ]] && echo 'variable repoUrl not found' && exit 1
57+ [[ -z "$REPOBRANCH" ]] && echo 'variable repoBranch not found' && exit 1
58+ elif [ "${PACKAGESOURCE:-git}" = "githubRelease" ]; then
59+ [[ -z "${PACKAGEASSETURL:-}" ]] && echo 'variable packageAssetUrl not found' && exit 1
60+ [[ -z "${PACKAGEASSETNAME:-}" ]] && echo 'variable packageAssetName not found' && exit 1
61+ else
62+ echo "unsupported packageSource: ${PACKAGESOURCE:-}"
63+ exit 1
64+ fi
65+ PACKAGE_SOURCE_MODE="${PACKAGESOURCE:-git}"
66+ RUN_MODE="publish"
67+ if [ "${E2ETEST:-false}" = "true" ]; then
68+ RUN_MODE="e2e"
69+ fi
70+ echo "##vso[task.setvariable variable=packageSourceMode;]$PACKAGE_SOURCE_MODE"
71+ echo "##vso[build.updatebuildnumber]$RUN_MODE-$PACKAGE_SOURCE_MODE-$(packageName)-$(packageVersion)-$(Build.BuildId)"
5272 displayName: "Prepare context variables"
5373
5474 - script : |
@@ -83,6 +103,7 @@ stages:
83103 sudo apt-get install -y git git-lfs
84104 sudo git lfs install --system
85105 displayName: "Install Git tooling"
106+ condition: eq(variables['packageSourceMode'], 'git')
86107
87108 - script : |
88109 set -euo pipefail
@@ -103,6 +124,7 @@ stages:
103124 inputs :
104125 contents : $(repoDir)
105126 displayName : " Clean $(repoDir) folder"
127+ condition : eq(variables['packageSourceMode'], 'git')
106128
107129 - script : |
108130 set -euo pipefail
@@ -111,6 +133,7 @@ stages:
111133 git config --global url."https://github.com/".insteadOf git@github.com:
112134 git config --global url."https://".insteadOf git://
113135 displayName: "Prepare isolated Git config"
136+ condition: eq(variables['packageSourceMode'], 'git')
114137 env:
115138 HOME: $(gitHomeDir)
116139 XDG_CONFIG_HOME: $(gitConfigDir)
@@ -124,6 +147,7 @@ stages:
124147 clone --recursive --shallow-submodules --depth 1 --branch "$(repoBranch)" "$(repoUrl)" "$(repoDir)"
125148 git -C "$(repoDir)" config --local core.hooksPath /dev/null
126149 displayName: "Clone repository"
150+ condition: eq(variables['packageSourceMode'], 'git')
127151 env:
128152 HOME: $(gitHomeDir)
129153 XDG_CONFIG_HOME: $(gitConfigDir)
@@ -134,6 +158,7 @@ stages:
134158 echo "Fetching Git LFS objects for $(repoDir)"
135159 git lfs pull
136160 displayName: "Fetch Git LFS"
161+ condition: eq(variables['packageSourceMode'], 'git')
137162 env:
138163 HOME: $(gitHomeDir)
139164 XDG_CONFIG_HOME: $(gitConfigDir)
@@ -144,21 +169,33 @@ stages:
144169 echo "Fetching Git LFS objects for submodules in $(repoDir)"
145170 git submodule foreach --recursive 'git lfs pull'
146171 displayName: "Fetch submodule Git LFS"
172+ condition: eq(variables['packageSourceMode'], 'git')
147173 env:
148174 HOME: $(gitHomeDir)
149175 XDG_CONFIG_HOME: $(gitConfigDir)
150176
151177 - script : |
152178 set -euo pipefail
153179 echo "Computing dist-tag for $(packageName) against $(publishRegistryUrl)"
154- LATEST_VERSION=$(npm --registry="$(publishRegistryUrl)" show "$(packageName)" version) || LATEST_VERSION=0.0.0
180+ NPM_SHOW_LOG="$(Agent.TempDirectory)/npm-show-version.log"
181+ if npm --registry="$(publishRegistryUrl)" show "$(packageName)" version >"$NPM_SHOW_LOG" 2>&1; then
182+ LATEST_VERSION=$(cat "$NPM_SHOW_LOG")
183+ elif grep -Eq "(E404|404 Not Found)" "$NPM_SHOW_LOG"; then
184+ cat "$NPM_SHOW_LOG"
185+ LATEST_VERSION=0.0.0
186+ else
187+ cat "$NPM_SHOW_LOG"
188+ echo "Failed to read package version from $(publishRegistryUrl)"
189+ exit 1
190+ fi
155191 [[ -z "$LATEST_VERSION" ]] && LATEST_VERSION=0.0.0
156192 echo LATEST_VERSION: $LATEST_VERSION
157193 echo packageVersion: $(packageVersion)
158194 DIST_TAG=$(node getDistTag.js "$(packageVersion)" "$LATEST_VERSION")
159195 echo DIST_TAG: $DIST_TAG
160196 echo "##vso[task.setvariable variable=distTag;]$DIST_TAG"
161197 displayName: "Set distTag variable"
198+ condition: ne(variables['e2eTest'], 'true')
162199
163200 - script : |
164201 set -euo pipefail
@@ -169,6 +206,7 @@ stages:
169206 echo "PACKAGEFOLDER: $PACKAGEFOLDER"
170207 echo "##vso[task.setvariable variable=packageFolder;]$PACKAGEFOLDER"
171208 displayName: "Detect package.json location"
209+ condition: eq(variables['packageSourceMode'], 'git')
172210
173211 - script : |
174212 set -euo pipefail
@@ -177,6 +215,7 @@ stages:
177215 npm pkg set publishConfig.registry="$(publishRegistryUrl)"
178216 cat package.json
179217 displayName: "Override publishConfig"
218+ condition: eq(variables['packageSourceMode'], 'git')
180219
181220 - script : |
182221 set -euo pipefail
@@ -199,6 +238,47 @@ stages:
199238 "$ARTIFACT_DIR/metadata.json"
200239 cat "$ARTIFACT_DIR/metadata.json"
201240 displayName: "Pack package tarball"
241+ condition: eq(variables['packageSourceMode'], 'git')
242+
243+ - script : |
244+ set -euo pipefail
245+ ARTIFACT_DIR="$(Build.ArtifactStagingDirectory)/$(artifactName)"
246+ mkdir -p "$ARTIFACT_DIR"
247+ TARBALL_FILE="$(basename "$(packageAssetName)")"
248+ if [ "$TARBALL_FILE" != "$(packageAssetName)" ]; then
249+ echo "packageAssetName must be a filename, not a path"
250+ exit 1
251+ fi
252+ TARBALL_PATH="$ARTIFACT_DIR/$TARBALL_FILE"
253+ TEMP_TARBALL_PATH="$TARBALL_PATH.download"
254+ echo "Downloading GitHub Release asset: $(packageAssetName)"
255+ HTTP_STATUS=$(curl --location --silent --show-error --write-out "%{http_code}" --output "$TEMP_TARBALL_PATH" "$(packageAssetUrl)") || {
256+ echo "GITHUB_RELEASE_ASSET_DOWNLOAD_FAILED"
257+ rm -f "$TEMP_TARBALL_PATH"
258+ exit 1
259+ }
260+ if [ "$HTTP_STATUS" = "404" ]; then
261+ echo "GITHUB_RELEASE_ASSET_DOWNLOAD_NOT_FOUND"
262+ rm -f "$TEMP_TARBALL_PATH"
263+ exit 1
264+ fi
265+ if ! [[ "$HTTP_STATUS" =~ ^2[0-9][0-9]$ ]]; then
266+ echo "GITHUB_RELEASE_ASSET_DOWNLOAD_FAILED"
267+ echo "HTTP status: $HTTP_STATUS"
268+ rm -f "$TEMP_TARBALL_PATH"
269+ exit 1
270+ fi
271+ mv "$TEMP_TARBALL_PATH" "$TARBALL_PATH"
272+ echo "Validating downloaded asset extension, archive structure, package/package.json, name, and version"
273+ node "$(Build.SourcesDirectory)/createPackageArtifactMetadataFromTarball.js" \
274+ "$TARBALL_PATH" \
275+ "$(packageName)" \
276+ "$(packageVersion)" \
277+ "$(distTag)" \
278+ "$ARTIFACT_DIR/metadata.json"
279+ cat "$ARTIFACT_DIR/metadata.json"
280+ displayName: "Download GitHub Release asset"
281+ condition: eq(variables['packageSourceMode'], 'githubRelease')
202282
203283 - publish : $(Build.ArtifactStagingDirectory)/$(artifactName)
204284 artifact : $(artifactName)
0 commit comments