@@ -9,8 +9,59 @@ permissions:
99 contents : write
1010
1111jobs :
12+ wait_ci :
13+ name : Wait for CI success on tag
14+ runs-on : ubuntu-latest
15+ steps :
16+ - uses : actions/checkout@v4
17+ with :
18+ fetch-depth : 0
19+ - name : Determine tag and SHA
20+ id : ref
21+ shell : bash
22+ run : |
23+ TAG="${{ github.ref_type == 'tag' && github.ref_name || '' }}"
24+ if [[ -z "$TAG" ]]; then
25+ echo "Error: no tag in event" >&2
26+ exit 1
27+ fi
28+ SHA="${{ github.sha }}"
29+ echo "tag=$TAG" >> $GITHUB_OUTPUT
30+ echo "sha=$SHA" >> $GITHUB_OUTPUT
31+ - name : Install jq
32+ run : sudo apt-get update && sudo apt-get install -y jq
33+ - name : Wait for CI workflow
34+ env :
35+ GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
36+ shell : bash
37+ run : |
38+ SHA="${{ steps.ref.outputs.sha }}"
39+ echo "Waiting for CI to succeed for $SHA ..."
40+ ATTEMPTS=120
41+ SLEEP=10
42+ for i in $(seq 1 $ATTEMPTS); do
43+ RESP=$(curl -s -H "Authorization: Bearer $GH_TOKEN" -H "Accept: application/vnd.github+json" \
44+ "https://api.github.com/repos/${{ github.repository }}/actions/runs?per_page=50&head_sha=$SHA")
45+ STATUS=$(echo "$RESP" | jq -r '.workflow_runs[] | select(.name=="CI") | .status' | head -n1)
46+ CONCLUSION=$(echo "$RESP" | jq -r '.workflow_runs[] | select(.name=="CI") | .conclusion' | head -n1)
47+ if [[ "$STATUS" == "completed" ]]; then
48+ if [[ "$CONCLUSION" == "success" ]]; then
49+ echo "CI succeeded."
50+ exit 0
51+ else
52+ echo "CI completed with conclusion: $CONCLUSION"
53+ exit 1
54+ fi
55+ fi
56+ echo "CI status: ${STATUS:-not found}; waiting... ($i/$ATTEMPTS)"
57+ sleep $SLEEP
58+ done
59+ echo "Timed out waiting for CI to complete."
60+ exit 1
61+
1262 release :
1363 runs-on : ubuntu-latest
64+ needs : wait_ci
1465 steps :
1566 - uses : actions/checkout@v4
1667 with :
@@ -19,23 +70,24 @@ jobs:
1970 with :
2071 go-version : ' 1.22'
2172 - name : Import GPG private key (for checksum signing)
22- if : ${{ secrets.GPG_PRIVATE_KEY != '' }}
2373 env :
2474 GPG_PRIVATE_KEY : ${{ secrets.GPG_PRIVATE_KEY }}
2575 GPG_PASSPHRASE : ${{ secrets.GPG_PASSPHRASE }}
2676 run : |
77+ if [ -z "${GPG_PRIVATE_KEY:-}" ]; then
78+ echo "No GPG_PRIVATE_KEY secret set; skipping key import."
79+ exit 0
80+ fi
2781 mkdir -p ~/.gnupg
2882 chmod 700 ~/.gnupg
2983 echo "Importing GPG key"
3084 echo "$GPG_PRIVATE_KEY" | gpg --batch --import
31- # If the key has a passphrase, enable loopback so non-interactive signing can work
32- if [ -n "$GPG_PASSPHRASE" ]; then
85+ if [ -n "${GPG_PASSPHRASE:-}" ]; then
3386 echo 'pinentry-mode loopback' >> ~/.gnupg/gpg.conf
3487 echo 'allow-loopback-pinentry' >> ~/.gnupg/gpg-agent.conf
3588 gpg-connect-agent reloadagent /bye
3689 fi
37- echo "GPG keys:"
38- gpg --list-secret-keys --keyid-format LONG
90+ gpg --list-secret-keys --keyid-format LONG || true
3991 - name : Build
4092 run : go build ./...
4193 - name : GoReleaser
4597 args : release --clean
4698 env :
4799 GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
48- # If your key has a passphrase, gpg will read it via loopback pinentry
49- # GPG_TTY helps avoid certain agent warnings
50100 GPG_TTY : ${{ runner.env.SSH_AUTH_SOCK }}
0 commit comments