63 lines
2.0 KiB
YAML
63 lines
2.0 KiB
YAML
name: npm-push
|
|
description: "Publish an NPM package to a registry."
|
|
inputs:
|
|
tgz:
|
|
description: "Path to the tarball file to publish."
|
|
required: true
|
|
workingDirectory:
|
|
description: "Working directory for the publish operation."
|
|
required: false
|
|
default: "."
|
|
registry:
|
|
description: "NPM registry URL."
|
|
required: false
|
|
default: ${{ github.server_url }}/api/packages/${{ github.repository_owner }}/npm/
|
|
apiKey:
|
|
description: "NPM authentication token."
|
|
required: true
|
|
nodeVersion:
|
|
description: "Node.js version to use."
|
|
required: false
|
|
default: "20"
|
|
access:
|
|
description: "Package access level: public or restricted."
|
|
required: false
|
|
default: "public"
|
|
runs:
|
|
using: "composite"
|
|
steps:
|
|
- name: "Setup Node.js"
|
|
uses: https://github.com/actions/setup-node@v4
|
|
with:
|
|
node-version: ${{ inputs.nodeVersion }}
|
|
- name: "Publish package"
|
|
run: |
|
|
TGZ_PATH="${{ inputs.tgz }}"
|
|
# Trim whitespace
|
|
TGZ_PATH=$(echo "$TGZ_PATH" | xargs)
|
|
|
|
# Resolve to absolute path so npm never misinterprets it as a git shorthand
|
|
TGZ_PATH="$(realpath "$TGZ_PATH")"
|
|
|
|
# Verify the tarball exists
|
|
if [ ! -f "$TGZ_PATH" ]; then
|
|
echo "Error: Tarball not found at $TGZ_PATH (working directory: $(pwd))"
|
|
exit 1
|
|
fi
|
|
|
|
# Configure npm authentication for the registry (scoped to project)
|
|
REGISTRY_PATH=$(echo "${{ inputs.registry }}" | sed -E 's|https?://||')
|
|
npm config set --location=project registry "${{ inputs.registry }}"
|
|
npm config set --location=project "//${REGISTRY_PATH}:_authToken" "${{ inputs.apiKey }}"
|
|
|
|
echo "Publishing $TGZ_PATH to ${{ inputs.registry }}"
|
|
npm publish "$TGZ_PATH" --access ${{ inputs.access }}
|
|
working-directory: ${{ inputs.workingDirectory }}
|
|
shell: bash
|
|
- name: "Clean up npm authentication"
|
|
if: always()
|
|
run: |
|
|
# Clean up project .npmrc in case of early exit
|
|
rm -f .npmrc
|
|
working-directory: ${{ inputs.workingDirectory }}
|
|
shell: bash |