mirror of
https://github.com/Alfresco/alfresco-ng2-components.git
synced 2026-09-09 18:03:21 +00:00
chore: add auto-import of GPG public key in devcontainer setup
This commit is contained in:
@@ -88,6 +88,32 @@ git commit -S -m "your message" # -S optional if commit.gpgsign is true
|
|||||||
git push
|
git push
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Easiest rebuild-safe import flow
|
||||||
|
|
||||||
|
This devcontainer auto-imports a public key from `.git/signing.pub` on start.
|
||||||
|
If present, it runs `gpg --import .git/signing.pub` and removes the file after a
|
||||||
|
successful import.
|
||||||
|
|
||||||
|
So the easiest setup is:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# on the HOST, from repo root (auto-uses git user.signingkey)
|
||||||
|
./.devcontainer/export-signing-key.sh
|
||||||
|
|
||||||
|
# or pass a key explicitly
|
||||||
|
./.devcontainer/export-signing-key.sh <YOUR_KEY_ID>
|
||||||
|
```
|
||||||
|
|
||||||
|
The helper auto-selects `gpg2`/`gpg` based on where your key is visible, which
|
||||||
|
avoids host setups where the two binaries use different keyrings.
|
||||||
|
|
||||||
|
After **Rebuild Container** (or next container start), verify in the container:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
gpg --list-secret-keys --keyid-format=long
|
||||||
|
git commit -S -m "test signed commit"
|
||||||
|
```
|
||||||
|
|
||||||
### Manually importing your public key
|
### Manually importing your public key
|
||||||
|
|
||||||
If `git commit -S` fails with `gpg: signing failed: No secret key`, the forwarded
|
If `git commit -S` fails with `gpg: signing failed: No secret key`, the forwarded
|
||||||
|
|||||||
@@ -55,5 +55,7 @@
|
|||||||
|
|
||||||
"postCreateCommand": "pnpm install --frozen-lockfile",
|
"postCreateCommand": "pnpm install --frozen-lockfile",
|
||||||
|
|
||||||
|
"postStartCommand": "if [ -f .git/signing.pub ]; then gpg --import .git/signing.pub && rm .git/signing.pub; fi",
|
||||||
|
|
||||||
"runArgs": ["--cap-drop=ALL", "--security-opt=no-new-privileges:true", "--pids-limit=512"]
|
"runArgs": ["--cap-drop=ALL", "--security-opt=no-new-privileges:true", "--pids-limit=512"]
|
||||||
}
|
}
|
||||||
|
|||||||
Executable
+81
@@ -0,0 +1,81 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Export your GPG public key to .git/signing.pub so the devcontainer can auto-import it.
|
||||||
|
# Usage:
|
||||||
|
# ./.devcontainer/export-signing-key.sh
|
||||||
|
# ./.devcontainer/export-signing-key.sh <KEY_ID>
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
||||||
|
OUTPUT_FILE="${REPO_ROOT}/.git/signing.pub"
|
||||||
|
|
||||||
|
KEY_ID="${1:-$(git config --global user.signingkey || true)}"
|
||||||
|
if [[ -z "${KEY_ID}" ]]; then
|
||||||
|
echo "No key ID provided and git user.signingkey is not set."
|
||||||
|
echo "Set it with: git config --global user.signingkey <YOUR_KEY_ID>"
|
||||||
|
echo "Or run: ./.devcontainer/export-signing-key.sh <YOUR_KEY_ID>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
available_bins=()
|
||||||
|
for candidate in gpg2 gpg; do
|
||||||
|
if command -v "${candidate}" >/dev/null 2>&1; then
|
||||||
|
available_bins+=("${candidate}")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ ${#available_bins[@]} -eq 0 ]]; then
|
||||||
|
echo "Neither gpg nor gpg2 is available on PATH."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
has_secret_key() {
|
||||||
|
local bin="$1"
|
||||||
|
"${bin}" --list-secret-keys --with-colons "${KEY_ID}" 2>/dev/null | grep -q '^sec'
|
||||||
|
}
|
||||||
|
|
||||||
|
try_export() {
|
||||||
|
local bin="$1"
|
||||||
|
"${bin}" --armor --export "${KEY_ID}" > "${OUTPUT_FILE}"
|
||||||
|
[[ -s "${OUTPUT_FILE}" ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
selected_bin=""
|
||||||
|
for bin in "${available_bins[@]}"; do
|
||||||
|
if has_secret_key "${bin}"; then
|
||||||
|
selected_bin="${bin}"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ -z "${selected_bin}" ]]; then
|
||||||
|
selected_bin="${available_bins[0]}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -f "${OUTPUT_FILE}"
|
||||||
|
if ! try_export "${selected_bin}"; then
|
||||||
|
for bin in "${available_bins[@]}"; do
|
||||||
|
if [[ "${bin}" == "${selected_bin}" ]]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if try_export "${bin}"; then
|
||||||
|
selected_bin="${bin}"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -s "${OUTPUT_FILE}" ]]; then
|
||||||
|
rm -f "${OUTPUT_FILE}"
|
||||||
|
echo "Failed to export public key for ${KEY_ID}."
|
||||||
|
echo "Tried binaries: ${available_bins[*]}"
|
||||||
|
echo "Check key visibility with:"
|
||||||
|
echo " gpg --list-secret-keys --keyid-format=long"
|
||||||
|
echo " gpg2 --list-secret-keys --keyid-format=long"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Exported public key ${KEY_ID} to ${OUTPUT_FILE}"
|
||||||
|
echo "Using: ${selected_bin}"
|
||||||
|
echo "Rebuild/start the devcontainer to auto-import it."
|
||||||
Reference in New Issue
Block a user