summaryrefslogtreecommitdiff
path: root/.forgejo/workflows/build-iso.yml
blob: c127b1608f5939b27f48aa167b1c28f7f6692090 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
name: Build and Release RaveOS ISO

on:
  push:
    branches: ["main"]
  workflow_dispatch:

jobs:
  build-iso:
    runs-on: iso-builder

    env:
      TMPDIR: ${{ github.workspace }}/.tmp
      GIT_TMPDIR: ${{ github.workspace }}/.tmp

    steps:
      - name: Checkout build repository
        uses: actions/checkout@v4

      - name: Prepare temp directories (NO /tmp usage)
        run: |
          set -euo pipefail
          mkdir -p "${GITHUB_WORKSPACE}/.tmp"
          df -h

      - name: Fix raveos-core-repo pacman repo (overwrite clean)
        run: |
          set -euo pipefail
          sudo sed -i '/^\[raveos-core-repo\]/,/^$/d' /etc/pacman.conf
          cat <<'EOF' | sudo tee -a /etc/pacman.conf
          [raveos-core-repo]
          SigLevel = Never TrustAll
          Server = https://page.rp1.hu/x86_64/
          EOF

      - name: Sync and update runner
        run: |
          set -euo pipefail
          sudo pacman -Sy --noconfirm
          if pacman -Qu 2>/dev/null | grep -q .; then
            echo "Elavult csomagok talalhatok, auto-frissites indul..."
            sudo pacman -Su --noconfirm
            echo "Runner auto-frissites: OK"
          else
            echo "Runner konzisztencia ellenorzes: OK"
          fi

      - name: Verify archiso
        run: pacman -Q archiso

      - name: Setup Chaotic-AUR
        run: |
          set -euo pipefail
          if [ ! -f /etc/pacman.d/chaotic-mirrorlist ]; then
            sudo mkdir -p /etc/pacman.d
            echo 'Server = https://cdn-mirror.chaotic.cx/$repo/$arch' | sudo tee /etc/pacman.d/chaotic-mirrorlist
            sudo pacman-key --recv-key 3056513887B78AEB --keyserver keyserver.ubuntu.com || true
            sudo pacman-key --lsign-key 3056513887B78AEB || true
            sudo pacman -U --noconfirm \
              https://cdn-mirror.chaotic.cx/chaotic-aur/chaotic-keyring.pkg.tar.zst \
              https://cdn-mirror.chaotic.cx/chaotic-aur/chaotic-mirrorlist.pkg.tar.zst || true
          fi

      - name: Setup RaveOS signing key
        run: |
          set -euo pipefail
          cat <<'RAVEOSKEY' | sudo pacman-key --add -
          -----BEGIN PGP PUBLIC KEY BLOCK-----

          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
          ibVZLr5g97pSMBQUv/dO6I+jfPtqITpDupTdDgg=
          =WGkj
          -----END PGP PUBLIC KEY BLOCK-----
          RAVEOSKEY
          sudo pacman-key --lsign-key 25C7668F1235F5664F037671BDB2A9CE6EBFF113

      - name: Build ISO
        run: |
          set -euo pipefail
          chmod +x ./build.sh
          sudo ./build.sh

      - name: Check build output
        run: |
          set -euo pipefail
          ls -lh output/*.iso

      - name: Check ISO for broken library links
        run: |
          set -euo pipefail
          sudo modprobe loop || true
          ISO_FILE=$(ls output/*.iso | head -1)
          MOUNT_DIR=$(mktemp -d)

          if ! sudo mount -o loop,ro "$ISO_FILE" "$MOUNT_DIR" 2>/dev/null; then
            echo "FIGYELMEZETES: ISO mountolas sikertelen (loop eszkoz nem elerheto), ldd ellenorzes kihagyva"
            rmdir "$MOUNT_DIR"
            exit 0
          fi

          BROKEN=0
          while IFS= read -r bin; do
            result=$(sudo chroot "$MOUNT_DIR" ldd "${bin#$MOUNT_DIR}" 2>/dev/null | grep "not found" || true)
            if [ -n "$result" ]; then
              echo "TOROTT: $bin"
              echo "$result"
              BROKEN=1
            fi
          done < <(find "$MOUNT_DIR" -type f \( -name "*.so*" -o -perm /111 \) 2>/dev/null | xargs -r file 2>/dev/null | grep ELF | cut -d: -f1)

          sudo umount "$MOUNT_DIR"
          rmdir "$MOUNT_DIR"

          if [ "$BROKEN" -eq 1 ]; then
            echo "HIBA: Torott library linkek az ISO-ban. Build leallitva."
            exit 1
          fi
          echo "ISO library ellenorzes: OK"

      - name: Upload ISO to release server
        run: |
          set -euo pipefail
          ISO_FILE=$(ls output/*.iso | head -1)
          ISO_NAME=$(basename "$ISO_FILE")

          mkdir -p ~/.ssh
          echo "${{ secrets.VPS_RELEASE_KEY }}" > ~/.ssh/vps_release_key
          chmod 600 ~/.ssh/vps_release_key

          # Új ISO feltöltése
          scp -i ~/.ssh/vps_release_key -P ${{ secrets.VPS_PORT }} -o StrictHostKeyChecking=no \
            "$ISO_FILE" "${{ secrets.VPS_USER }}@${{ secrets.VPS_HOST }}:${{ secrets.VPS_RELEASES_PATH }}/${ISO_NAME}"

          # 3-nál régebbi ISO-k törlése a VPS-ről
          ssh -i ~/.ssh/vps_release_key -p ${{ secrets.VPS_PORT }} -o StrictHostKeyChecking=no \
            ${{ secrets.VPS_USER }}@${{ secrets.VPS_HOST }} "ls -t ${{ secrets.VPS_RELEASES_PATH }}/*.iso 2>/dev/null | tail -n +4 | xargs -r rm -f"

          echo "ISO feltoltve: https://release.rp1.hu/${ISO_NAME}"
          echo "ISO_NAME=${ISO_NAME}" >> "$GITHUB_ENV"

      - name: Create Forgejo Release with external link
        run: |
          set -euo pipefail

          ISO_FILE=$(ls output/*.iso | head -1)
          ISO_NAME=$(basename "$ISO_FILE")
          ISO_SIZE=$(du -h "$ISO_FILE" | cut -f1)
          ISO_SHA256=$(sha256sum "$ISO_FILE" | cut -d' ' -f1)
          BUILD_DATE=$(date '+%Y-%m-%d %H:%M:%S')
          COMMIT_SHORT=${GITHUB_SHA::7}
          TAG="v$(date '+%Y.%m.%d')-${COMMIT_SHORT}"

          RELEASE_BODY="Build Date: ${BUILD_DATE}
          Filename: ${ISO_NAME}
          Size: ${ISO_SIZE}
          SHA256: ${ISO_SHA256}
          Source Commit: ${COMMIT_SHORT}

          Verification:
          echo \"${ISO_SHA256}  ${ISO_NAME}\" | sha256sum -c"

          RELEASE=$(curl -f -s --retry 3 --retry-delay 5 \
            -X POST "https://git.rp1.hu/api/v1/repos/RaveOS/RaveOS-Releases/releases" \
            -H "Authorization: token ${{ secrets.RELEASE_TOKEN }}" \
            -H "Content-Type: application/json" \
            -d "{\"tag_name\":\"${TAG}\",\"name\":\"RaveOS ${TAG}\",\"body\":$(echo "$RELEASE_BODY" | python3 -c 'import sys,json; print(json.dumps(sys.stdin.read()))'),\"draft\":false,\"prerelease\":false}")

          RELEASE_ID=$(echo "$RELEASE" | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])")
          [[ "$RELEASE_ID" =~ ^[0-9]+$ ]] || { echo "HIBA: Ervenytelen RELEASE_ID: $RELEASE_ID"; exit 1; }
          echo "Release ID: $RELEASE_ID"

          # External link hozzáadása attachment helyett
          curl -f -s --retry 3 \
            -X POST "https://git.rp1.hu/api/v1/repos/RaveOS/RaveOS-Releases/releases/${RELEASE_ID}/assets?external_url=https://release.rp1.hu/${ISO_NAME}" \
            -H "Authorization: token ${{ secrets.RELEASE_TOKEN }}" \
            -F "name=${ISO_NAME}"
          echo "External link hozzaadva: https://release.rp1.hu/${ISO_NAME}"

          echo "Release kesz: https://git.rp1.hu/RaveOS/RaveOS-Releases/releases/tag/${TAG}"

          # Regi release-ek torlese (3-nal tobbet nem tartunk)
          RELEASES=$(curl -f -s --retry 3 --retry-delay 5 \
            "https://git.rp1.hu/api/v1/repos/RaveOS/RaveOS-Releases/releases?limit=50" \
            -H "Authorization: token ${{ secrets.RELEASE_TOKEN }}")

          echo "$RELEASES" | python3 -c "import sys,json; releases=json.load(sys.stdin); releases.sort(key=lambda r:r['id'],reverse=True); [print(r['id'],r['tag_name']) for r in releases[3:]]" | while IFS=' ' read -r id tag; do
            curl -f -s --retry 3 -X DELETE "https://git.rp1.hu/api/v1/repos/RaveOS/RaveOS-Releases/releases/$id" \
              -H "Authorization: token ${{ secrets.RELEASE_TOKEN }}"
            curl -f -s --retry 3 -X DELETE "https://git.rp1.hu/api/v1/repos/RaveOS/RaveOS-Releases/tags/$tag" \
              -H "Authorization: token ${{ secrets.RELEASE_TOKEN }}"
            echo "Regi release torolve: $tag"
          done

      - name: Cleanup (SAFE)
        if: always()
        run: |
          rm -f ~/.ssh/vps_release_key
          sudo umount -R "${GITHUB_WORKSPACE}/work" 2>/dev/null || true
          sudo umount -R "${GITHUB_WORKSPACE}/output" 2>/dev/null || true
          sudo rm -rf "${GITHUB_WORKSPACE}/work"
          sudo rm -rf "${GITHUB_WORKSPACE}/output"
          sudo rm -rf "${GITHUB_WORKSPACE}/.tmp"
          sudo rm -rf /var/cache/pacman/pkg/*
          df -h