Source database builder #10
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Source database builder | |
| on: | |
| workflow_dispatch: | |
| schedule: | |
| - cron: "0 12 10 */6 *" | |
| jobs: | |
| builder: | |
| name: Database builder | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| - name: Run Docker Compose | |
| working-directory: build/sources | |
| run: docker compose up | |
| - name: Find latest release tag | |
| id: get_release | |
| uses: actions/github-script@v7 | |
| with: | |
| script: | | |
| const releases = await github.rest.repos.listReleases({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo | |
| }); | |
| if (releases.data.length === 0) { | |
| throw new Error("No releases found."); | |
| } | |
| const latest = releases.data.find(r => !r.draft); | |
| core.setOutput("upload_url", latest.upload_url); | |
| core.setOutput("tag_name", latest.tag_name); | |
| - name: Upload new artifacts to latest release | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| tag_name: ${{ steps.get_release.outputs.tag_name }} | |
| files: build/sources/release/*.source.tar.xz | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Remove old artifacts | |
| uses: actions/github-script@v7 | |
| with: | |
| script: | | |
| const tag = "${{ steps.get_release.outputs.tag_name }}"; | |
| const { repo, owner } = context.repo; | |
| const release = await github.rest.repos.getReleaseByTag({ owner, repo, tag }); | |
| const assets = await github.rest.repos.listReleaseAssets({ | |
| owner, | |
| repo, | |
| release_id: release.data.id, | |
| per_page: 100 | |
| }); | |
| const sourceAssets = assets.data.filter(a => a.name.endsWith('.source.tar.xz')); | |
| const assetGroups = {}; | |
| for (const asset of sourceAssets) { | |
| const match = asset.name.match(/^(.+?)_(\d{8})\.source\.tar\.xz$/); | |
| if (!match) continue; | |
| const [_, base, date] = match; | |
| if (!assetGroups[base]) assetGroups[base] = []; | |
| assetGroups[base].push({ name: asset.name, id: asset.id, date }); | |
| } | |
| for (const [base, group] of Object.entries(assetGroups)) { | |
| group.sort((a, b) => b.date.localeCompare(a.date)); | |
| const toDelete = group.slice(1); | |
| for (const asset of toDelete) { | |
| console.log(`Deleting old asset: ${asset.name}`); | |
| await github.rest.repos.deleteReleaseAsset({ | |
| owner, | |
| repo, | |
| asset_id: asset.id | |
| }); | |
| } | |
| } |