|
9 | 9 | description: 'Version to release (e.g., 0.1.0)' |
10 | 10 | required: true |
11 | 11 | type: string |
| 12 | + extension_release_tag: |
| 13 | + description: 'Optional extension release tag (e.g., v1.2.3). Defaults to latest if omitted.' |
| 14 | + required: false |
| 15 | + type: string |
12 | 16 |
|
13 | 17 | jobs: |
14 | 18 | build-and-publish: |
@@ -50,6 +54,115 @@ jobs: |
50 | 54 | VERSION="${{ steps.version.outputs.version }}" |
51 | 55 | sed -i "s/^__version__ = \".*\"/__version__ = \"$VERSION\"/" predicate/__init__.py |
52 | 56 |
|
| 57 | + - name: Sync extension files if missing |
| 58 | + run: | |
| 59 | + set -euo pipefail |
| 60 | +
|
| 61 | + REQUIRED_FILES=( |
| 62 | + "predicate/extension/manifest.json" |
| 63 | + "predicate/extension/content.js" |
| 64 | + "predicate/extension/background.js" |
| 65 | + "predicate/extension/injected_api.js" |
| 66 | + "predicate/extension/pkg/sentience_core.js" |
| 67 | + "predicate/extension/pkg/sentience_core_bg.wasm" |
| 68 | + ) |
| 69 | +
|
| 70 | + has_all_required_files() { |
| 71 | + for file in "${REQUIRED_FILES[@]}"; do |
| 72 | + if [ ! -f "$file" ]; then |
| 73 | + return 1 |
| 74 | + fi |
| 75 | + done |
| 76 | + return 0 |
| 77 | + } |
| 78 | +
|
| 79 | + if has_all_required_files; then |
| 80 | + echo "✅ Extension files already present in repository" |
| 81 | + exit 0 |
| 82 | + fi |
| 83 | +
|
| 84 | + echo "⚠️ Extension files missing locally. Attempting auto-sync from extension release..." |
| 85 | +
|
| 86 | + REPO="${{ secrets.SENTIENCE_CHROME_REPO }}" |
| 87 | + TOKEN="${{ secrets.SENTIENCE_CHROME_TOKEN }}" |
| 88 | +
|
| 89 | + if [ -z "$REPO" ] || [ -z "$TOKEN" ]; then |
| 90 | + echo "❌ Cannot auto-sync extension files: SENTIENCE_CHROME_REPO or SENTIENCE_CHROME_TOKEN is not configured." |
| 91 | + echo "Please run sync-extension workflow (or sync manually) before release." |
| 92 | + exit 1 |
| 93 | + fi |
| 94 | +
|
| 95 | + TAG_INPUT="${{ github.event.inputs.extension_release_tag }}" |
| 96 | + if [ -n "$TAG_INPUT" ]; then |
| 97 | + TAG="$TAG_INPUT" |
| 98 | + echo "Using extension release tag from input: $TAG" |
| 99 | + else |
| 100 | + echo "No extension_release_tag provided. Resolving latest release tag from $REPO..." |
| 101 | + HTTP_CODE=$(curl -s -o latest_release.json -w "%{http_code}" \ |
| 102 | + -H "Authorization: token $TOKEN" \ |
| 103 | + "https://api.github.com/repos/$REPO/releases/latest") |
| 104 | +
|
| 105 | + if [ "$HTTP_CODE" != "200" ]; then |
| 106 | + echo "❌ Failed to fetch latest extension release (HTTP $HTTP_CODE)" |
| 107 | + cat latest_release.json |
| 108 | + exit 1 |
| 109 | + fi |
| 110 | +
|
| 111 | + TAG=$(jq -r '.tag_name // empty' latest_release.json) |
| 112 | + if [ -z "$TAG" ]; then |
| 113 | + echo "❌ Could not determine latest extension release tag" |
| 114 | + exit 1 |
| 115 | + fi |
| 116 | + echo "Resolved latest extension tag: $TAG" |
| 117 | + fi |
| 118 | +
|
| 119 | + mkdir -p extension-temp |
| 120 | + cd extension-temp |
| 121 | +
|
| 122 | + HTTP_CODE=$(curl -s -w "%{http_code}" -o release.json \ |
| 123 | + -H "Authorization: token $TOKEN" \ |
| 124 | + "https://api.github.com/repos/$REPO/releases/tags/$TAG") |
| 125 | +
|
| 126 | + if [ "$HTTP_CODE" != "200" ]; then |
| 127 | + echo "❌ Failed to fetch extension release info for tag $TAG (HTTP $HTTP_CODE)" |
| 128 | + cat release.json |
| 129 | + exit 1 |
| 130 | + fi |
| 131 | +
|
| 132 | + ASSET_URL=$(jq -r '.assets[]? | select(.name == "extension-files.tar.gz") | .url' release.json) |
| 133 | + if [ -z "$ASSET_URL" ] || [ "$ASSET_URL" = "null" ]; then |
| 134 | + echo "❌ extension-files.tar.gz not found on extension release $TAG" |
| 135 | + echo "Available assets:" |
| 136 | + jq -r '.assets[]?.name' release.json |
| 137 | + exit 1 |
| 138 | + fi |
| 139 | +
|
| 140 | + HTTP_CODE=$(curl -L -s -w "%{http_code}" -o extension.tar.gz \ |
| 141 | + -H "Authorization: token $TOKEN" \ |
| 142 | + -H "Accept: application/octet-stream" \ |
| 143 | + "$ASSET_URL") |
| 144 | +
|
| 145 | + if [ "$HTTP_CODE" != "200" ] && [ "$HTTP_CODE" != "302" ]; then |
| 146 | + echo "❌ Failed to download extension tarball (HTTP $HTTP_CODE)" |
| 147 | + exit 1 |
| 148 | + fi |
| 149 | +
|
| 150 | + tar -xzf extension.tar.gz |
| 151 | + cd .. |
| 152 | +
|
| 153 | + TARGET_DIR="predicate/extension" |
| 154 | + rm -rf "$TARGET_DIR" |
| 155 | + mkdir -p "$TARGET_DIR" |
| 156 | + cp -r extension-temp/* "$TARGET_DIR/" |
| 157 | + rm -rf extension-temp latest_release.json |
| 158 | +
|
| 159 | + if has_all_required_files; then |
| 160 | + echo "✅ Extension files synced successfully from $REPO@$TAG" |
| 161 | + else |
| 162 | + echo "❌ Extension sync completed but required files are still missing" |
| 163 | + exit 1 |
| 164 | + fi |
| 165 | +
|
53 | 166 | - name: Verify extension files are present |
54 | 167 | run: | |
55 | 168 | echo "🔍 Verifying extension files are included..." |
|
0 commit comments