Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a84390818a |
No files matched your search
@@ -23,6 +23,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
ref: ${{ github.head_ref }}
|
ref: ${{ github.head_ref }}
|
||||||
|
persist-credentials: false
|
||||||
|
|
||||||
- name: Setup
|
- name: Setup
|
||||||
uses: ./tooling/github/setup
|
uses: ./tooling/github/setup
|
||||||
|
|||||||
@@ -317,7 +317,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Delete GHCR package version
|
- name: Delete GHCR package version
|
||||||
if: '!env.ACT'
|
if: '!env.ACT'
|
||||||
uses: actions/github-script@v8
|
uses: actions/github-script@v9
|
||||||
with:
|
with:
|
||||||
script: |
|
script: |
|
||||||
const packageName = "homarr-test";
|
const packageName = "homarr-test";
|
||||||
|
|||||||
@@ -14,91 +14,18 @@ permissions:
|
|||||||
pull-requests: write
|
pull-requests: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
create-and-merge-pr:
|
release:
|
||||||
runs-on: ubuntu-latest
|
# Permissions must be set on the calling job: a reusable workflow receives
|
||||||
timeout-minutes: 2
|
# the default GITHUB_TOKEN permissions unless the caller job grants them here.
|
||||||
steps:
|
permissions:
|
||||||
- name: Discord notification
|
contents: write
|
||||||
if: ${{ github.event.inputs.send-notifications }}
|
pull-requests: write
|
||||||
env:
|
uses: ./.github/workflows/deployment-release-pr.yml
|
||||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
secrets: inherit
|
||||||
uses: Ilshidur/action-discord@0.4.0
|
with:
|
||||||
with:
|
release-label: "Beta release"
|
||||||
args: "Beta release has been triggered: [run ${{ github.run_number }}](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})"
|
version-suffix: "-beta"
|
||||||
- name: Checkout repository
|
semver-branch: next
|
||||||
uses: actions/checkout@v7
|
head: next
|
||||||
with:
|
base: beta
|
||||||
fetch-depth: 0
|
send-notifications: ${{ github.event.inputs.send-notifications == 'true' }}
|
||||||
- name: Get Next Version
|
|
||||||
id: semver
|
|
||||||
uses: ietf-tools/semver-action@v1
|
|
||||||
with:
|
|
||||||
token: ${{ github.token }}
|
|
||||||
branch: next
|
|
||||||
- name: Create pull request
|
|
||||||
id: create-pull-request
|
|
||||||
run: 'gh pr create --title "chore(release): release ${{ steps.semver.outputs.next }}-beta" --body "Detected change to be ``${{ steps.semver.outputs.bump }}``<br/>Bump version from ``${{ steps.semver.outputs.current }}`` to ``${{ steps.semver.outputs.next }}-beta``" --base beta --head next --label automerge'
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
|
|
||||||
- name: Discord notification
|
|
||||||
if: ${{ github.event.inputs.send-notifications }}
|
|
||||||
env:
|
|
||||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
uses: Ilshidur/action-discord@0.4.0
|
|
||||||
with:
|
|
||||||
args: "Created a release PR ${{ steps.create-pull-request.outputs.url }} for version ${{ steps.semver.outputs.next }}-beta (new behaviour: ${{ steps.semver.outputs.bump }})"
|
|
||||||
- name: Obtain token
|
|
||||||
id: obtainApprovalToken
|
|
||||||
uses: actions/create-github-app-token@v3
|
|
||||||
with:
|
|
||||||
private-key: ${{ secrets.RENOVATE_APPROVE_PRIVATE_KEY }}
|
|
||||||
client-id: ${{ secrets.RENOVATE_APPROVE_APP_ID }}
|
|
||||||
permission-pull-requests: write
|
|
||||||
- name: Approve PR
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ steps.obtainApprovalToken.outputs.token }}
|
|
||||||
run: |
|
|
||||||
gh pr review --approve --body "Automatically approved by GitHub Action"
|
|
||||||
- name: Obtain token
|
|
||||||
id: obtainMergeToken
|
|
||||||
uses: actions/create-github-app-token@v3
|
|
||||||
with:
|
|
||||||
private-key: ${{ secrets.RENOVATE_MERGE_PRIVATE_KEY }}
|
|
||||||
client-id: ${{ secrets.RENOVATE_MERGE_APP_ID }}
|
|
||||||
permission-contents: write # write to beta branch (due to merge)
|
|
||||||
permission-pull-requests: write # merge pull request
|
|
||||||
- id: automerge
|
|
||||||
if: ${{ steps.semver.outputs.bump != 'major' }}
|
|
||||||
name: automerge
|
|
||||||
uses: "pascalgn/automerge-action@v0.16.4"
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ steps.obtainMergeToken.outputs.token }}
|
|
||||||
MERGE_METHOD: merge # we prefer merge commits for merging to beta
|
|
||||||
MERGE_COMMIT_MESSAGE: "chore(release): release ${{ steps.semver.outputs.next }}-beta"
|
|
||||||
MERGE_DELETE_BRANCH: false # never set to true!
|
|
||||||
PULL_REQUEST: "${{ steps.create-pull-request.outputs.pr_number }}"
|
|
||||||
MERGE_RETRIES: 20 # 20 retries * MERGE_RETRY_SLEEP until step fails
|
|
||||||
MERGE_RETRY_SLEEP: 10000 # 10 seconds * MERGE_RETRIES until step fails
|
|
||||||
MERGE_REQUIRED_APPROVALS: 0 # do not require approvals
|
|
||||||
|
|
||||||
- name: Merged Discord notification
|
|
||||||
if: ${{ steps.automerge.outputs.mergeResult == 'merged' && github.event.inputs.send-notifications }}
|
|
||||||
env:
|
|
||||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
uses: Ilshidur/action-discord@0.4.0
|
|
||||||
with:
|
|
||||||
args: "Merged PR ${{ steps.create-pull-request.outputs.url }} for release ${{ steps.semver.outputs.next }}-beta"
|
|
||||||
- name: Major Bump Discord notification
|
|
||||||
if: ${{ steps.semver.outputs.bump == 'major' && github.event.inputs.send-notifications }}
|
|
||||||
env:
|
|
||||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
uses: Ilshidur/action-discord@0.4.0
|
|
||||||
with:
|
|
||||||
args: "The release PR must be manually merged because the next version is a major version: ${{ steps.create-pull-request.outputs.url }} for release ${{ steps.semver.outputs.next }}-beta"
|
|
||||||
- name: Discord Fail Notification
|
|
||||||
if: failure() && github.event.inputs.send-notifications
|
|
||||||
env:
|
|
||||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
uses: Ilshidur/action-discord@0.4.0
|
|
||||||
with:
|
|
||||||
args: "The beta release workflow [run ${{ github.run_number }}](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) has failed"
|
|
||||||
@@ -0,0 +1,155 @@
|
|||||||
|
name: "[Deployment] Release PR (reusable)"
|
||||||
|
|
||||||
|
# Reusable workflow that opens a release PR from `head` into `base`, auto-approves
|
||||||
|
# it and (for non-major bumps) merges it. Used by the beta and weekly release
|
||||||
|
# workflows, which differ only in branch, version suffix and notification wording.
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
release-label:
|
||||||
|
description: 'Human label used in notifications, e.g. "Beta release"'
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
title-prefix:
|
||||||
|
description: 'Text inserted before "release" in the PR title/commit, e.g. "automatic "'
|
||||||
|
required: false
|
||||||
|
default: ""
|
||||||
|
type: string
|
||||||
|
version-suffix:
|
||||||
|
description: 'Suffix appended to the computed version, e.g. "-beta"'
|
||||||
|
required: false
|
||||||
|
default: ""
|
||||||
|
type: string
|
||||||
|
body-prefix:
|
||||||
|
description: "Extra HTML prepended to the PR body"
|
||||||
|
required: false
|
||||||
|
default: ""
|
||||||
|
type: string
|
||||||
|
semver-branch:
|
||||||
|
description: "Branch used to compute the next version"
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
head:
|
||||||
|
description: "PR head branch"
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
base:
|
||||||
|
description: "PR base branch"
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
send-notifications:
|
||||||
|
description: "Whether to send Discord notifications"
|
||||||
|
required: false
|
||||||
|
default: true
|
||||||
|
type: boolean
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
create-and-merge-pr:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 2
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
pull-requests: write
|
||||||
|
steps:
|
||||||
|
- name: Discord notification
|
||||||
|
if: inputs.send-notifications
|
||||||
|
env:
|
||||||
|
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
||||||
|
uses: Ilshidur/action-discord@0.4.0
|
||||||
|
with:
|
||||||
|
args: "${{ inputs.release-label }} has been triggered: [run ${{ github.run_number }}](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})"
|
||||||
|
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v7
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Get Next Version
|
||||||
|
id: semver
|
||||||
|
uses: ietf-tools/semver-action@v1
|
||||||
|
with:
|
||||||
|
token: ${{ github.token }}
|
||||||
|
branch: ${{ inputs.semver-branch }}
|
||||||
|
|
||||||
|
- name: Create pull request
|
||||||
|
id: create-pull-request
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
VERSION: "${{ steps.semver.outputs.next }}${{ inputs.version-suffix }}"
|
||||||
|
run: >-
|
||||||
|
gh pr create
|
||||||
|
--title "chore(release): ${{ inputs.title-prefix }}release ${VERSION}"
|
||||||
|
--body "${{ inputs.body-prefix }}Detected change to be \`${{ steps.semver.outputs.bump }}\`<br/>Bump version from \`${{ steps.semver.outputs.current }}\` to \`${VERSION}\`"
|
||||||
|
--base ${{ inputs.base }}
|
||||||
|
--head ${{ inputs.head }}
|
||||||
|
--label automerge
|
||||||
|
|
||||||
|
- name: Discord notification
|
||||||
|
if: inputs.send-notifications
|
||||||
|
env:
|
||||||
|
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
||||||
|
uses: Ilshidur/action-discord@0.4.0
|
||||||
|
with:
|
||||||
|
args: "Created a release PR ${{ steps.create-pull-request.outputs.url }} for version ${{ steps.semver.outputs.next }}${{ inputs.version-suffix }} (new behaviour: ${{ steps.semver.outputs.bump }})"
|
||||||
|
|
||||||
|
- name: Obtain token
|
||||||
|
id: obtainApprovalToken
|
||||||
|
uses: actions/create-github-app-token@v3
|
||||||
|
with:
|
||||||
|
private-key: ${{ secrets.RENOVATE_APPROVE_PRIVATE_KEY }}
|
||||||
|
client-id: ${{ secrets.RENOVATE_APPROVE_APP_ID }}
|
||||||
|
permission-pull-requests: write
|
||||||
|
|
||||||
|
- name: Approve PR
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ steps.obtainApprovalToken.outputs.token }}
|
||||||
|
run: |
|
||||||
|
gh pr review --approve --body "Automatically approved by GitHub Action"
|
||||||
|
|
||||||
|
- name: Obtain token
|
||||||
|
id: obtainMergeToken
|
||||||
|
uses: actions/create-github-app-token@v3
|
||||||
|
with:
|
||||||
|
private-key: ${{ secrets.RENOVATE_MERGE_PRIVATE_KEY }}
|
||||||
|
client-id: ${{ secrets.RENOVATE_MERGE_APP_ID }}
|
||||||
|
permission-contents: write # write to the base branch (due to merge)
|
||||||
|
permission-pull-requests: write # merge pull request
|
||||||
|
|
||||||
|
- id: automerge
|
||||||
|
if: ${{ steps.semver.outputs.bump != 'major' }}
|
||||||
|
name: automerge
|
||||||
|
uses: "pascalgn/automerge-action@v0.16.4"
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ steps.obtainMergeToken.outputs.token }}
|
||||||
|
MERGE_METHOD: merge # we prefer merge commits for release branches
|
||||||
|
MERGE_COMMIT_MESSAGE: "chore(release): ${{ inputs.title-prefix }}release ${{ steps.semver.outputs.next }}${{ inputs.version-suffix }}"
|
||||||
|
MERGE_DELETE_BRANCH: false # never set to true!
|
||||||
|
PULL_REQUEST: "${{ steps.create-pull-request.outputs.pr_number }}"
|
||||||
|
MERGE_RETRIES: 20 # 20 retries * MERGE_RETRY_SLEEP until step fails
|
||||||
|
MERGE_RETRY_SLEEP: 10000 # 10 seconds * MERGE_RETRIES until step fails
|
||||||
|
MERGE_REQUIRED_APPROVALS: 0 # do not require approvals
|
||||||
|
|
||||||
|
- name: Merged Discord notification
|
||||||
|
if: ${{ steps.automerge.outputs.mergeResult == 'merged' && inputs.send-notifications }}
|
||||||
|
env:
|
||||||
|
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
||||||
|
uses: Ilshidur/action-discord@0.4.0
|
||||||
|
with:
|
||||||
|
args: "Merged PR ${{ steps.create-pull-request.outputs.url }} for release ${{ steps.semver.outputs.next }}${{ inputs.version-suffix }}"
|
||||||
|
|
||||||
|
- name: Major Bump Discord notification
|
||||||
|
if: ${{ steps.semver.outputs.bump == 'major' && inputs.send-notifications }}
|
||||||
|
env:
|
||||||
|
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
||||||
|
uses: Ilshidur/action-discord@0.4.0
|
||||||
|
with:
|
||||||
|
args: "The release PR must be manually merged because the next version is a major version: ${{ steps.create-pull-request.outputs.url }} for release ${{ steps.semver.outputs.next }}${{ inputs.version-suffix }}"
|
||||||
|
|
||||||
|
- name: Discord Fail Notification
|
||||||
|
if: failure() && inputs.send-notifications
|
||||||
|
env:
|
||||||
|
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
||||||
|
uses: Ilshidur/action-discord@0.4.0
|
||||||
|
with:
|
||||||
|
args: "The ${{ inputs.release-label }} workflow [run ${{ github.run_number }}](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) has failed"
|
||||||
+19
-14
@@ -15,9 +15,9 @@ on:
|
|||||||
default: true
|
default: true
|
||||||
description: Send notifications
|
description: Send notifications
|
||||||
|
|
||||||
|
# Least-privilege default; each job widens only what it needs.
|
||||||
permissions:
|
permissions:
|
||||||
contents: write # Required to update package.json version
|
contents: read
|
||||||
packages: write # Required for pushing to GHCR
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
SKIP_ENV_VALIDATION: true
|
SKIP_ENV_VALIDATION: true
|
||||||
@@ -34,6 +34,8 @@ jobs:
|
|||||||
name: Create tag and release
|
name: Create tag and release
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
timeout-minutes: 5
|
timeout-minutes: 5
|
||||||
|
permissions:
|
||||||
|
contents: write # commit package.json/changelog, push tags, update dev/next
|
||||||
env:
|
env:
|
||||||
SKIP_RELEASE: ${{ github.event_name == 'workflow_dispatch' || github.ref_name == 'dev' || github.ref_name == 'next' }}
|
SKIP_RELEASE: ${{ github.event_name == 'workflow_dispatch' || github.ref_name == 'dev' || github.ref_name == 'next' }}
|
||||||
outputs:
|
outputs:
|
||||||
@@ -61,19 +63,9 @@ jobs:
|
|||||||
if: env.SKIP_RELEASE == 'false'
|
if: env.SKIP_RELEASE == 'false'
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- uses: pnpm/action-setup@v6
|
- name: Setup
|
||||||
if: env.SKIP_RELEASE == 'false'
|
if: env.SKIP_RELEASE == 'false'
|
||||||
- uses: actions/setup-node@v6
|
uses: ./tooling/github/setup
|
||||||
if: env.SKIP_RELEASE == 'false'
|
|
||||||
with:
|
|
||||||
node-version: 24.18.0
|
|
||||||
package-manager-cache: false
|
|
||||||
- run: npm i -g pnpm
|
|
||||||
if: env.SKIP_RELEASE == 'false'
|
|
||||||
- name: Install dependencies
|
|
||||||
if: env.SKIP_RELEASE == 'false'
|
|
||||||
run: |
|
|
||||||
pnpm install
|
|
||||||
- name: Run Semantic Release
|
- name: Run Semantic Release
|
||||||
if: env.SKIP_RELEASE == 'false'
|
if: env.SKIP_RELEASE == 'false'
|
||||||
env:
|
env:
|
||||||
@@ -116,6 +108,9 @@ jobs:
|
|||||||
needs: release
|
needs: release
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
timeout-minutes: 15
|
timeout-minutes: 15
|
||||||
|
permissions:
|
||||||
|
contents: read # checkout the repository
|
||||||
|
packages: write # push image by digest to GHCR
|
||||||
outputs:
|
outputs:
|
||||||
digest: ${{ steps.build.outputs.digest }}
|
digest: ${{ steps.build.outputs.digest }}
|
||||||
steps:
|
steps:
|
||||||
@@ -160,6 +155,9 @@ jobs:
|
|||||||
needs: release
|
needs: release
|
||||||
runs-on: ubuntu-24.04-arm
|
runs-on: ubuntu-24.04-arm
|
||||||
timeout-minutes: 20
|
timeout-minutes: 20
|
||||||
|
permissions:
|
||||||
|
contents: read # checkout the repository
|
||||||
|
packages: write # push image by digest to GHCR
|
||||||
outputs:
|
outputs:
|
||||||
digest: ${{ steps.build.outputs.digest }}
|
digest: ${{ steps.build.outputs.digest }}
|
||||||
steps:
|
steps:
|
||||||
@@ -204,6 +202,8 @@ jobs:
|
|||||||
needs: [release, build-amd64]
|
needs: [release, build-amd64]
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
timeout-minutes: 5
|
timeout-minutes: 5
|
||||||
|
permissions:
|
||||||
|
contents: write # upload build artifacts as release assets
|
||||||
steps:
|
steps:
|
||||||
- name: Extract amd64
|
- name: Extract amd64
|
||||||
if: needs.release.outputs.skipped == 'false'
|
if: needs.release.outputs.skipped == 'false'
|
||||||
@@ -220,6 +220,8 @@ jobs:
|
|||||||
needs: [release, build-arm64]
|
needs: [release, build-arm64]
|
||||||
runs-on: ubuntu-24.04-arm
|
runs-on: ubuntu-24.04-arm
|
||||||
timeout-minutes: 5
|
timeout-minutes: 5
|
||||||
|
permissions:
|
||||||
|
contents: write # upload build artifacts as release assets
|
||||||
steps:
|
steps:
|
||||||
- name: Extract arm64
|
- name: Extract arm64
|
||||||
if: needs.release.outputs.skipped == 'false'
|
if: needs.release.outputs.skipped == 'false'
|
||||||
@@ -235,6 +237,9 @@ jobs:
|
|||||||
needs: [release, build-amd64, build-arm64, extract-asset-amd64, extract-asset-arm64]
|
needs: [release, build-amd64, build-arm64, extract-asset-amd64, extract-asset-arm64]
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
timeout-minutes: 5
|
timeout-minutes: 5
|
||||||
|
permissions:
|
||||||
|
contents: write # mark GitHub release as published (undraft)
|
||||||
|
packages: write # create multi-arch image tags in GHCR
|
||||||
env:
|
env:
|
||||||
NEXT_VERSION: ${{ needs.release.outputs.version }}
|
NEXT_VERSION: ${{ needs.release.outputs.version }}
|
||||||
DEPLOY_LATEST: ${{ github.ref_name == 'main' }}
|
DEPLOY_LATEST: ${{ github.ref_name == 'main' }}
|
||||||
@@ -17,91 +17,20 @@ permissions:
|
|||||||
pull-requests: write
|
pull-requests: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
create-and-merge-pr:
|
release:
|
||||||
runs-on: ubuntu-latest
|
# Permissions must be set on the calling job: a reusable workflow receives
|
||||||
timeout-minutes: 2
|
# the default GITHUB_TOKEN permissions unless the caller job grants them here.
|
||||||
steps:
|
permissions:
|
||||||
- name: Discord notification
|
contents: write
|
||||||
if: ${{ github.event.inputs.send-notifications }}
|
pull-requests: write
|
||||||
env:
|
uses: ./.github/workflows/deployment-release-pr.yml
|
||||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
secrets: inherit
|
||||||
uses: Ilshidur/action-discord@0.4.0
|
with:
|
||||||
with:
|
release-label: "Automatic release"
|
||||||
args: "Automatic release has been triggered: [run ${{ github.run_number }}](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})"
|
title-prefix: "automatic "
|
||||||
- name: Checkout repository
|
body-prefix: "**This is an automatic release**.<br/>Manual action may be required for major bumps.<br/>"
|
||||||
uses: actions/checkout@v7
|
semver-branch: dev
|
||||||
with:
|
head: dev
|
||||||
fetch-depth: 0
|
base: main
|
||||||
- name: Get Next Version
|
# Scheduled runs have no inputs, so notifications stay off unless manually dispatched.
|
||||||
id: semver
|
send-notifications: ${{ github.event.inputs.send-notifications == 'true' }}
|
||||||
uses: ietf-tools/semver-action@v1
|
|
||||||
with:
|
|
||||||
token: ${{ github.token }}
|
|
||||||
branch: dev
|
|
||||||
- name: Create pull request
|
|
||||||
id: create-pull-request
|
|
||||||
run: 'gh pr create --title "chore(release): automatic release ${{ steps.semver.outputs.next }}" --body "**This is an automatic release**.<br/>Manual action may be required for major bumps.<br/>Detected change to be ``${{ steps.semver.outputs.bump }}``<br/>Bump version from ``${{ steps.semver.outputs.current }}`` to ``${{ steps.semver.outputs.next }}``" --base main --head dev --label automerge'
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
|
|
||||||
- name: Discord notification
|
|
||||||
if: ${{ github.event.inputs.send-notifications }}
|
|
||||||
env:
|
|
||||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
uses: Ilshidur/action-discord@0.4.0
|
|
||||||
with:
|
|
||||||
args: "Created a release PR ${{ steps.create-pull-request.outputs.url }} for version ${{ steps.semver.outputs.next }} (new behaviour: ${{ steps.semver.outputs.bump }})"
|
|
||||||
- name: Obtain token
|
|
||||||
id: obtainApprovalToken
|
|
||||||
uses: actions/create-github-app-token@v3
|
|
||||||
with:
|
|
||||||
private-key: ${{ secrets.RENOVATE_APPROVE_PRIVATE_KEY }}
|
|
||||||
client-id: ${{ secrets.RENOVATE_APPROVE_APP_ID }}
|
|
||||||
permission-pull-requests: write
|
|
||||||
- name: Approve PR
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ steps.obtainApprovalToken.outputs.token }}
|
|
||||||
run: |
|
|
||||||
gh pr review --approve --body "Automatically approved by GitHub Action"
|
|
||||||
- name: Obtain token
|
|
||||||
id: obtainMergeToken
|
|
||||||
uses: actions/create-github-app-token@v3
|
|
||||||
with:
|
|
||||||
private-key: ${{ secrets.RENOVATE_MERGE_PRIVATE_KEY }}
|
|
||||||
client-id: ${{ secrets.RENOVATE_MERGE_APP_ID }}
|
|
||||||
permission-contents: write # write to main branch (due to merge)
|
|
||||||
permission-pull-requests: write # merge pull request
|
|
||||||
- id: automerge
|
|
||||||
if: ${{ steps.semver.outputs.bump != 'major' }}
|
|
||||||
name: automerge
|
|
||||||
uses: "pascalgn/automerge-action@v0.16.4"
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ steps.obtainMergeToken.outputs.token }}
|
|
||||||
MERGE_METHOD: merge # we prefer merge commits for merging to main
|
|
||||||
MERGE_COMMIT_MESSAGE: "chore(release): automatic release ${{ steps.semver.outputs.next }}"
|
|
||||||
MERGE_DELETE_BRANCH: false # never set to true!
|
|
||||||
PULL_REQUEST: "${{ steps.create-pull-request.outputs.pr_number }}"
|
|
||||||
MERGE_RETRIES: 20 # 20 retries * MERGE_RETRY_SLEEP until step fails
|
|
||||||
MERGE_RETRY_SLEEP: 10000 # 10 seconds * MERGE_RETRIES until step fails
|
|
||||||
MERGE_REQUIRED_APPROVALS: 0 # do not require approvals
|
|
||||||
|
|
||||||
- name: Merged Discord notification
|
|
||||||
if: ${{ steps.automerge.outputs.mergeResult == 'merged' && github.event.inputs.send-notifications }}
|
|
||||||
env:
|
|
||||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
uses: Ilshidur/action-discord@0.4.0
|
|
||||||
with:
|
|
||||||
args: "Merged PR ${{ steps.create-pull-request.outputs.url }} for release ${{ steps.semver.outputs.next }}"
|
|
||||||
- name: Major Bump Discord notification
|
|
||||||
if: ${{ steps.semver.outputs.bump == 'major' && github.event.inputs.send-notifications }}
|
|
||||||
env:
|
|
||||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
uses: Ilshidur/action-discord@0.4.0
|
|
||||||
with:
|
|
||||||
args: "The release PR must be manually merged because the next version is a major version: ${{ steps.create-pull-request.outputs.url }} for release ${{ steps.semver.outputs.next }}"
|
|
||||||
- name: Discord Fail Notification
|
|
||||||
if: failure() && github.event.inputs.send-notifications
|
|
||||||
env:
|
|
||||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
|
||||||
uses: Ilshidur/action-discord@0.4.0
|
|
||||||
with:
|
|
||||||
args: "The automatic release workflow [run ${{ github.run_number }}](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) has failed"
|
|
||||||
@@ -15,9 +15,6 @@ jobs:
|
|||||||
update-contributors:
|
update-contributors:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
timeout-minutes: 2
|
timeout-minutes: 2
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
node-version: [22]
|
|
||||||
steps:
|
steps:
|
||||||
- name: Obtain token
|
- name: Obtain token
|
||||||
id: obtainToken
|
id: obtainToken
|
||||||
@@ -33,13 +30,11 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ steps.obtainToken.outputs.token }}
|
GITHUB_TOKEN: ${{ steps.obtainToken.outputs.token }}
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v6
|
- name: Install Node with mise
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
uses: jdx/mise-action@v4
|
||||||
uses: actions/setup-node@v6
|
|
||||||
with:
|
|
||||||
node-version: ${{ matrix.node-version }}
|
|
||||||
cache: "pnpm"
|
|
||||||
|
|
||||||
|
# This script only uses Node built-ins (fs/promises), so no dependency
|
||||||
|
# install is needed.
|
||||||
- name: Run update script
|
- name: Run update script
|
||||||
run: node ./scripts/update-contributors.mjs
|
run: node ./scripts/update-contributors.mjs
|
||||||
|
|
||||||
|
|||||||
+8
-18
@@ -7,26 +7,16 @@ WORKDIR /app
|
|||||||
RUN apk add --no-cache libc6-compat curl bash && apk update
|
RUN apk add --no-cache libc6-compat curl bash && apk update
|
||||||
|
|
||||||
RUN corepack enable pnpm
|
RUN corepack enable pnpm
|
||||||
COPY pnpm-lock.yaml pnpm-workspace.yaml package.json ./
|
|
||||||
COPY patches ./patches
|
# NOTE: We intentionally do NOT use `pnpm fetch` here. pnpm 11.10.0 applies
|
||||||
# Workaround for pnpm/pnpm#5268: pnpm fetch crashes when patchedDependencies
|
# `patchedDependencies` patches during the fetch phase, before packages are
|
||||||
# are configured with nodeLinker: hoisted. The applyPatchToDir function tries
|
# unpacked into node_modules, which crashes with ENOENT (chdir into a
|
||||||
# to chdir into node_modules/<pkg> which doesn't exist during fetch (only the
|
# not-yet-existing node_modules path). Installing directly from the full
|
||||||
# content-addressable store is populated). By temporarily switching to the
|
# context with the store cache mounted keeps builds fast without that break.
|
||||||
# isolated linker, patches apply inside the virtual store (node_modules/.pnpm/...)
|
COPY . .
|
||||||
# which IS created by pnpm fetch. The original hoisted linker is restored
|
|
||||||
# before the install step so the final node_modules layout stays flat.
|
|
||||||
RUN --mount=type=cache,id=pnpm-store,target=/pnpm/store \
|
RUN --mount=type=cache,id=pnpm-store,target=/pnpm/store \
|
||||||
pnpm config set store-dir /pnpm/store && \
|
pnpm config set store-dir /pnpm/store && \
|
||||||
sed -i 's/nodeLinker: hoisted/nodeLinker: isolated/' pnpm-workspace.yaml && \
|
pnpm install --recursive --frozen-lockfile
|
||||||
pnpm fetch && \
|
|
||||||
sed -i 's/nodeLinker: isolated/nodeLinker: hoisted/' pnpm-workspace.yaml
|
|
||||||
|
|
||||||
COPY . .
|
|
||||||
# Follow the pnpm fetch pattern from https://pnpm.io/cli/fetch
|
|
||||||
# --frozen-lockfile is omitted as recommended by the pnpm fetch docs
|
|
||||||
RUN --mount=type=cache,id=pnpm-store,target=/pnpm/store \
|
|
||||||
pnpm install --recursive
|
|
||||||
|
|
||||||
ARG SKIP_ENV_VALIDATION='true'
|
ARG SKIP_ENV_VALIDATION='true'
|
||||||
ARG CI='true'
|
ARG CI='true'
|
||||||
|
|||||||
@@ -43,7 +43,7 @@
|
|||||||
"random-word-slugs": "^0.1.7",
|
"random-word-slugs": "^0.1.7",
|
||||||
"react": "catalog:",
|
"react": "catalog:",
|
||||||
"react-dom": "catalog:",
|
"react-dom": "catalog:",
|
||||||
"swiper": "^14.0.5",
|
"swiper": "^14.0.2",
|
||||||
"tailwindcss": "^4.3.2"
|
"tailwindcss": "^4.3.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=24.18.0",
|
"node": ">=24.18.0",
|
||||||
"pnpm": ">=11.11.0"
|
"pnpm": ">=11.10.0"
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@11.11.0"
|
"packageManager": "pnpm@11.10.0"
|
||||||
}
|
}
|
||||||
+2
-2
@@ -69,7 +69,7 @@
|
|||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=24.18.0",
|
"node": ">=24.18.0",
|
||||||
"pnpm": ">=11.11.0"
|
"pnpm": ">=11.10.0"
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@11.11.0"
|
"packageManager": "pnpm@11.10.0"
|
||||||
}
|
}
|
||||||
Generated
+659
-574
File diff suppressed because it is too large.
Load diff
+12
-12
@@ -18,7 +18,7 @@ catalog:
|
|||||||
"@gitbeaker/rest": ^43.8.0
|
"@gitbeaker/rest": ^43.8.0
|
||||||
"@homarr/gridstack": ^1.12.0
|
"@homarr/gridstack": ^1.12.0
|
||||||
"@homarr/node-unifi": ^2.6.0
|
"@homarr/node-unifi": ^2.6.0
|
||||||
"@immich/sdk": ^3.0.2
|
"@immich/sdk": ^3.0.1
|
||||||
"@jellyfin/sdk": ^0.13.0
|
"@jellyfin/sdk": ^0.13.0
|
||||||
"@kubernetes/client-node": ^1.4.0
|
"@kubernetes/client-node": ^1.4.0
|
||||||
"@modelcontextprotocol/sdk": 1.29.0
|
"@modelcontextprotocol/sdk": 1.29.0
|
||||||
@@ -93,11 +93,11 @@ catalog:
|
|||||||
"@types/video.js": ^7.3.58
|
"@types/video.js": ^7.3.58
|
||||||
"@types/ws": ^8.18.1
|
"@types/ws": ^8.18.1
|
||||||
"@types/xml2js": ^0.4.14
|
"@types/xml2js": ^0.4.14
|
||||||
posthog-js: ^1.399.1
|
posthog-js: ^1.398.2
|
||||||
posthog-node: ^5.40.0
|
posthog-node: ^5.39.2
|
||||||
"@vitejs/plugin-react": ^6.0.3
|
"@vitejs/plugin-react": ^6.0.3
|
||||||
"@vitest/coverage-v8": ^4.1.10
|
"@vitest/coverage-v8": ^4.1.9
|
||||||
"@vitest/ui": ^4.1.10
|
"@vitest/ui": ^4.1.9
|
||||||
"@xterm/addon-canvas": ^0.7.0
|
"@xterm/addon-canvas": ^0.7.0
|
||||||
"@xterm/addon-fit": 0.11.0
|
"@xterm/addon-fit": 0.11.0
|
||||||
"@xterm/xterm": ^6.0.0
|
"@xterm/xterm": ^6.0.0
|
||||||
@@ -139,20 +139,20 @@ catalog:
|
|||||||
jsonpath-plus: ^10.4.0
|
jsonpath-plus: ^10.4.0
|
||||||
ldapts: 8.1.8
|
ldapts: 8.1.8
|
||||||
lodash.clonedeep: ^4.5.0
|
lodash.clonedeep: ^4.5.0
|
||||||
lucide-react: ^1.24.0
|
lucide-react: ^1.23.0
|
||||||
"mantine-contextmenu": ^9.3.1
|
"mantine-contextmenu": ^9.3.1
|
||||||
mantine-datatable: ^9.3.1
|
mantine-datatable: ^9.3.1
|
||||||
mantine-react-table: npm:mantine-react-table-open@9.0.3
|
mantine-react-table: npm:mantine-react-table-open@9.0.3
|
||||||
mcp-handler: ^1.1.0
|
mcp-handler: ^1.1.0
|
||||||
maria2: ^0.4.1
|
maria2: ^0.4.1
|
||||||
mysql2: 3.22.6
|
mysql2: 3.22.5
|
||||||
next: 16.2.10
|
next: 16.2.10
|
||||||
next-auth: 5.0.0-beta.31
|
next-auth: 5.0.0-beta.31
|
||||||
next-intl: 4.13.1
|
next-intl: 4.13.1
|
||||||
node-loader: ^2.1.0
|
node-loader: ^2.1.0
|
||||||
octokit: ^5.0.5
|
octokit: ^5.0.5
|
||||||
oxfmt: ^0.58.0
|
oxfmt: ^0.58.0
|
||||||
oxlint: ^1.73.0
|
oxlint: ^1.72.0
|
||||||
pg: ^8.22.0
|
pg: ^8.22.0
|
||||||
postcss-preset-mantine: ^1.18.0
|
postcss-preset-mantine: ^1.18.0
|
||||||
prismjs: ^1.30.0
|
prismjs: ^1.30.0
|
||||||
@@ -177,13 +177,13 @@ catalog:
|
|||||||
tsdav: ^2.3.0
|
tsdav: ^2.3.0
|
||||||
tsx: 4.20.4
|
tsx: 4.20.4
|
||||||
turbo: ^2.10.4
|
turbo: ^2.10.4
|
||||||
typescript: "npm:@typescript/typescript6@^6.0.2"
|
typescript: ^6.0.3
|
||||||
vite: ^8.1.4
|
vite: ^8.1.2
|
||||||
undici: 7.28.0
|
undici: 7.28.0
|
||||||
use-deep-compare-effect: ^1.8.1
|
use-deep-compare-effect: ^1.8.1
|
||||||
video.js: ^8.23.9
|
video.js: ^8.23.9
|
||||||
vite-tsconfig-paths: ^6.1.1
|
vite-tsconfig-paths: ^6.1.1
|
||||||
vitest: ^4.1.10
|
vitest: ^4.1.9
|
||||||
winston: 3.19.0
|
winston: 3.19.0
|
||||||
ws: ^8.21.0
|
ws: ^8.21.0
|
||||||
xml2js: ^0.6.2
|
xml2js: ^0.6.2
|
||||||
@@ -229,7 +229,7 @@ overrides:
|
|||||||
"tar-fs@>=3.0.0 <3.0.9": ">=3.1.3"
|
"tar-fs@>=3.0.0 <3.0.9": ">=3.1.3"
|
||||||
"tar-fs@>=2.0.0 <2.1.3": ">=3.1.3"
|
"tar-fs@>=2.0.0 <2.1.3": ">=3.1.3"
|
||||||
"tmp@<=0.2.3": ">=0.2.7"
|
"tmp@<=0.2.3": ">=0.2.7"
|
||||||
"vite@>=5.0.0 <=5.4.18": ">=8.1.4"
|
"vite@>=5.0.0 <=5.4.18": ">=8.1.3"
|
||||||
patchedDependencies:
|
patchedDependencies:
|
||||||
"@types/node-unifi": "patches/@types__node-unifi.patch"
|
"@types/node-unifi": "patches/@types__node-unifi.patch"
|
||||||
"trpc-to-openapi": "patches/trpc-to-openapi.patch"
|
"trpc-to-openapi": "patches/trpc-to-openapi.patch"
|
||||||
|
|||||||
@@ -4,11 +4,26 @@ description: "Common setup steps for Actions"
|
|||||||
runs:
|
runs:
|
||||||
using: composite
|
using: composite
|
||||||
steps:
|
steps:
|
||||||
- uses: pnpm/action-setup@v6
|
# Node (and any other tools) are provisioned from mise.toml, the single
|
||||||
- uses: actions/setup-node@v6
|
# source of truth for tool versions.
|
||||||
with:
|
- name: Install tools with mise
|
||||||
node-version: 24.18.0
|
uses: jdx/mise-action@v4
|
||||||
cache: "pnpm"
|
|
||||||
|
|
||||||
- shell: bash
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v6
|
||||||
|
|
||||||
|
- name: Locate pnpm store
|
||||||
|
shell: bash
|
||||||
|
run: echo "PNPM_STORE_PATH=$(pnpm store path --silent)" >> "$GITHUB_ENV"
|
||||||
|
|
||||||
|
- name: Cache pnpm store
|
||||||
|
uses: actions/cache@v6
|
||||||
|
with:
|
||||||
|
path: ${{ env.PNPM_STORE_PATH }}
|
||||||
|
key: pnpm-store-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
|
||||||
|
restore-keys: |
|
||||||
|
pnpm-store-${{ runner.os }}-
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
shell: bash
|
||||||
run: pnpm install --frozen-lockfile
|
run: pnpm install --frozen-lockfile
|
||||||
Reference in new issue
Block a user