|
49 | 49 | - name: Build |
50 | 50 | run: rush build |
51 | 51 |
|
| 52 | + - name: Get npm token via OIDC |
| 53 | + run: | |
| 54 | + echo "Requesting OIDC token from GitHub..." |
| 55 | + OIDC_TOKEN=$(curl -sS -H "Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" \ |
| 56 | + "${ACTIONS_ID_TOKEN_REQUEST_URL}&audience=https://registry.npmjs.org" | jq -r '.value') |
| 57 | +
|
| 58 | + if [ -z "$OIDC_TOKEN" ] || [ "$OIDC_TOKEN" = "null" ]; then |
| 59 | + echo "::error::Failed to get OIDC token from GitHub" |
| 60 | + exit 1 |
| 61 | + fi |
| 62 | + echo "OIDC token obtained successfully" |
| 63 | +
|
| 64 | + echo "Exchanging OIDC token for npm token..." |
| 65 | + RESPONSE=$(curl -sS -w "\n%{http_code}" -X POST "https://registry.npmjs.org/-/npm/v1/security/oidc/token" \ |
| 66 | + -H "Content-Type: application/json" \ |
| 67 | + -d "{\"oidcToken\": \"${OIDC_TOKEN}\"}") |
| 68 | +
|
| 69 | + HTTP_CODE=$(echo "$RESPONSE" | tail -1) |
| 70 | + BODY=$(echo "$RESPONSE" | sed '$d') |
| 71 | +
|
| 72 | + echo "npm OIDC exchange HTTP status: $HTTP_CODE" |
| 73 | +
|
| 74 | + if [ "$HTTP_CODE" != "200" ]; then |
| 75 | + echo "::error::npm OIDC exchange failed with status $HTTP_CODE" |
| 76 | + echo "Response: $BODY" |
| 77 | + exit 1 |
| 78 | + fi |
| 79 | +
|
| 80 | + NPM_TOKEN=$(echo "$BODY" | jq -r '.token') |
| 81 | + if [ -z "$NPM_TOKEN" ] || [ "$NPM_TOKEN" = "null" ]; then |
| 82 | + echo "::error::npm returned empty token" |
| 83 | + echo "Response: $BODY" |
| 84 | + exit 1 |
| 85 | + fi |
| 86 | +
|
| 87 | + echo "::add-mask::$NPM_TOKEN" |
| 88 | + echo "NPM_AUTH_TOKEN=$NPM_TOKEN" >> $GITHUB_ENV |
| 89 | + echo "npm token obtained successfully" |
| 90 | +
|
| 91 | + - name: Verify npm auth |
| 92 | + run: | |
| 93 | + echo "=== .npmrc content (masked) ===" |
| 94 | + cat ~/.npmrc 2>/dev/null | sed 's/_authToken=.*/_authToken=***/' || echo "No ~/.npmrc" |
| 95 | + echo "" |
| 96 | + echo "=== NPM_AUTH_TOKEN set? ===" |
| 97 | + if [ -n "$NPM_AUTH_TOKEN" ]; then echo "YES (length: ${#NPM_AUTH_TOKEN})"; else echo "NO"; fi |
| 98 | + echo "" |
| 99 | + echo "=== npm whoami ===" |
| 100 | + npm whoami 2>&1 || echo "npm whoami failed - NOT authenticated" |
| 101 | + echo "" |
| 102 | + echo "=== publish .npmrc ===" |
| 103 | + cat common/temp/publish-home/.npmrc 2>/dev/null | sed 's/_authToken=.*/_authToken=***/' || echo "No publish .npmrc yet" |
| 104 | +
|
52 | 105 | - name: Publish (main) |
53 | 106 | if: steps.branch.outputs.is_main == 'true' |
54 | 107 | run: rush publish --publish --target-branch main --include-all --set-access-level=public |
|
0 commit comments