diff --git a/.github/workflows/crowdin.yml b/.github/workflows/crowdin.yml deleted file mode 100644 index e7e473eb..00000000 --- a/.github/workflows/crowdin.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: Crowdin Action - -on: - workflow_dispatch: - schedule: - - cron: '2 */12 * * *' - push: - paths: [ - '/public/locales/en/**', - ] - branches: [ main ] - -jobs: - synchronize-with-crowdin: - name: Crowdin Sync - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: crowdin action - uses: crowdin/github-action@v1 - with: - upload_translations: false - download_translations: true - crowdin_branch_name: main - localization_branch_name: l10n_main - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} - CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }} diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml deleted file mode 100644 index 3bea5512..00000000 --- a/.github/workflows/docker-publish.yml +++ /dev/null @@ -1,154 +0,0 @@ -name: Docker - -# This workflow uses actions that are not certified by GitHub. -# They are provided by a third-party and are governed by -# separate terms of service, privacy policy, and support -# documentation. - -on: - schedule: - - cron: '20 0 * * *' - push: - branches: - - main - - feature/** - # Publish semver tags as releases. - tags: [ 'v*.*.*' ] - paths-ignore: - - 'docs/**' - - 'mkdocs.yml' - pull_request: - branches: [ "main" ] - paths-ignore: - - 'docs/**' - - 'mkdocs.yml' - merge_group: - -env: - # Use docker.io for Docker Hub if empty - REGISTRY: ghcr.io - # github.repository as / - IMAGE_NAME: ${{ github.repository }} - - -jobs: - pre-commit: - name: Linting Checks - runs-on: ubuntu-22.04 - steps: - - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Install python - uses: actions/setup-python@v5 - with: - python-version: 3.x - - - name: Check files - uses: pre-commit/action@v3.0.0 - - build: - name: Docker Build & Push - if: github.repository == 'gethomepage/homepage' - runs-on: self-hosted - needs: - - pre-commit - permissions: - contents: read - packages: write - # This is used to complete the identity challenge - # with sigstore/fulcio when running outside of PRs. - id-token: write - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - # Install the cosign tool except on PR - # https://github.com/sigstore/cosign-installer - - name: Install cosign - if: github.event_name != 'pull_request' - uses: sigstore/cosign-installer@main - with: - cosign-release: 'v1.13.1' # optional - - # Setup QEMU - # https://github.com/marketplace/actions/docker-setup-buildx#with-qemu - - name: Setup QEMU - uses: docker/setup-qemu-action@v3 - - # Workaround: https://github.com/docker/build-push-action/issues/461 - - name: Setup Docker buildx - uses: docker/setup-buildx-action@v3 - - # This step is being disabled because the runner is on a self-hosted machine - # where the cache will stick between runs. - # - name: Cache Docker layers - # uses: actions/cache@v3 - # with: - # path: /tmp/.buildx-cache - # key: ${{ runner.os }}-buildx-${{ github.sha }} - # restore-keys: | - # ${{ runner.os }}-buildx- - - # Login against a Docker registry except on PR - # https://github.com/docker/login-action - - name: Log into registry ${{ env.REGISTRY }} - if: github.event_name != 'pull_request' - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - # Extract metadata (tags, labels) for Docker - # https://github.com/docker/metadata-action - - name: Extract Docker metadata - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - flavor: | - latest=auto - - # Build and push Docker image with Buildx (don't push on PR) - # https://github.com/docker/build-push-action - - name: Build and push Docker image - id: build-and-push - uses: docker/build-push-action@v5 - with: - context: . - push: ${{ github.event_name != 'pull_request' && !(github.event_name == 'push' && startsWith(github.ref, 'refs/heads/feature')) }} - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - build-args: | - BUILDTIME=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }} - VERSION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.version'] }} - REVISION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }} - # https://github.com/docker/setup-qemu-action#about - # platforms: linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6 - platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/arm/v6 - cache-from: type=local,src=/tmp/.buildx-cache - cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max - - # Sign the resulting Docker image digest except on PRs. - # This will only write to the public Rekor transparency log when the Docker - # repository is public to avoid leaking data. If you would like to publish - # transparency data even for private images, pass --force to cosign below. - # https://github.com/sigstore/cosign -# - name: Sign the published Docker image -# if: ${{ github.event_name != 'pull_request' }} -# env: -# COSIGN_EXPERIMENTAL: "true" -# # This step uses the identity token to provision an ephemeral certificate -# # against the sigstore community Fulcio instance. -# run: echo "${{ steps.meta.outputs.tags }}" | xargs -I {} cosign sign {}@${{ steps.build-and-push.outputs.digest }} - - # Temp fix - # https://github.com/docker/build-push-action/issues/252 - # https://github.com/moby/buildkit/issues/1896 - - name: Move cache - run: | - rm -rf /tmp/.buildx-cache - mv /tmp/.buildx-cache-new /tmp/.buildx-cache diff --git a/.github/workflows/docs-publish.yml b/.github/workflows/docs-publish.yml deleted file mode 100644 index d3aea8e6..00000000 --- a/.github/workflows/docs-publish.yml +++ /dev/null @@ -1,100 +0,0 @@ -name: Docs - -on: - push: - tags: [ 'v*.*.*' ] - branches: ['main'] - paths: - - 'docs/**' - - 'mkdocs.yml' - pull_request: - paths: - - 'docs/**' - - 'mkdocs.yml' - merge_group: - workflow_dispatch: - -permissions: - contents: write - -jobs: - pre-commit: - name: Linting Checks - runs-on: ubuntu-22.04 - steps: - - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Install python - uses: actions/setup-python@v5 - with: - python-version: 3.x - - - name: Check files - uses: pre-commit/action@v3.0.0 - - test: - name: Test Build - if: github.repository == 'gethomepage/homepage' && github.event_name == 'pull_request' - runs-on: ubuntu-latest - needs: - - pre-commit - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 - with: - python-version: 3.x - - run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV - - uses: actions/cache@v4 - with: - key: mkdocs-material-${{ env.cache_id }} - path: .cache - restore-keys: | - mkdocs-material- - - run: sudo apt-get install pngquant - - run: pip install mike - - run: pip install mkdocs-material - - name: Test Docs Build - run: MKINSIDERS=false mkdocs build - deploy: - name: Build & Deploy - if: github.repository == 'gethomepage/homepage' && github.event_name != 'pull_request' - runs-on: ubuntu-latest - needs: - - pre-commit - steps: - - uses: actions/checkout@v4 - with: - ref: main - - uses: actions/setup-python@v5 - with: - python-version: 3.x - - run: echo "cache_id=${{github.sha}}" >> $GITHUB_ENV - - uses: actions/cache@v4 - with: - key: mkdocs-material-${{ env.cache_id }} - path: .cache - restore-keys: | - mkdocs-material- - - run: sudo apt-get install pngquant - - run: pip install mike==2.0.0 - - run: pip install git+https://${GH_TOKEN}@github.com/benphelps/mkdocs-material-insiders.git - - name: Set Git config - run: | - git config --global user.name "GitHub Action" - git config --global user.email "action@github.com" - - name: Sync gh-pages - run: | - git fetch origin gh-pages - git checkout gh-pages - git pull origin gh-pages - git checkout main - - name: Docs Deploy for Main - if: github.ref == 'refs/heads/main' - run: MKINSIDERS=true mike deploy --update --push ${{github.ref_name}} - - name: Docs Deploy for Tags - if: github.ref != 'refs/heads/main' - run: MKINSIDERS=true mike deploy --update --push ${{github.ref_name}} latest -env: - GH_TOKEN: ${{ secrets.GH_TOKEN }} diff --git a/.github/workflows/repo-maintenance.yml b/.github/workflows/repo-maintenance.yml deleted file mode 100644 index d590cf91..00000000 --- a/.github/workflows/repo-maintenance.yml +++ /dev/null @@ -1,199 +0,0 @@ -name: 'Repository Maintenance' - -on: - schedule: - - cron: '0 3 * * *' - workflow_dispatch: - -permissions: - issues: write - pull-requests: write - discussions: write - -concurrency: - group: lock - -jobs: - stale: - name: 'Stale' - runs-on: ubuntu-latest - steps: - - uses: actions/stale@v9 - with: - days-before-stale: 7 - days-before-close: 14 - stale-issue-label: stale - stale-pr-label: stale - stale-issue-message: > - This issue has been automatically marked as stale because it has not had - recent activity. It will be closed if no further activity occurs. Thank you - for your contributions. - lock-threads: - name: 'Lock Old Threads' - runs-on: ubuntu-latest - steps: - - uses: dessant/lock-threads@v5 - with: - issue-inactive-days: '30' - pr-inactive-days: '30' - discussion-inactive-days: '30' - log-output: true - issue-comment: > - This issue has been automatically locked since there - has not been any recent activity after it was closed. - Please open a new discussion for related concerns. - pr-comment: > - This pull request has been automatically locked since there - has not been any recent activity after it was closed. - Please open a new discussion for related concerns. - discussion-comment: > - This discussion has been automatically locked since there - has not been any recent activity after it was closed. - Please open a new discussion for related concerns. - close-answered-discussions: - name: 'Close Answered Discussions' - runs-on: ubuntu-latest - steps: - - uses: actions/github-script@v7 - with: - script: | - function sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); - } - - const query = `query($owner:String!, $name:String!) { - repository(owner:$owner, name:$name){ - discussions(first:100, answered:true, states:[OPEN]) { - nodes { - id, - number - } - } - } - }`; - const variables = { - owner: context.repo.owner, - name: context.repo.repo, - } - const result = await github.graphql(query, variables) - - console.log(`Found ${result.repository.discussions.nodes.length} open answered discussions`) - - for (const discussion of result.repository.discussions.nodes) { - console.log(`Closing discussion #${discussion.number} (${discussion.id})`) - - const addCommentMutation = `mutation($discussion:ID!, $body:String!) { - addDiscussionComment(input:{discussionId:$discussion, body:$body}) { - clientMutationId - } - }`; - const commentVariables = { - discussion: discussion.id, - body: 'This discussion has been automatically closed because it was marked as answered.', - } - await github.graphql(addCommentMutation, commentVariables) - - const closeDiscussionMutation = `mutation($discussion:ID!, $reason:DiscussionCloseReason!) { - closeDiscussion(input:{discussionId:$discussion, reason:$reason}) { - clientMutationId - } - }`; - const closeVariables = { - discussion: discussion.id, - reason: "RESOLVED", - } - await github.graphql(closeDiscussionMutation, closeVariables) - - await sleep(1000) - } - close-outdated-discussions: - name: 'Close Outdated Discussions' - runs-on: ubuntu-latest - steps: - - uses: actions/github-script@v7 - with: - script: | - function sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); - } - - const CUTOFF_DAYS = 180; - const cutoff = new Date(); - cutoff.setDate(cutoff.getDate() - CUTOFF_DAYS); - - const query = `query( - $owner:String!, - $name:String!, - $supportCategory:ID!, - $generalCategory:ID!, - ) { - supportDiscussions: repository(owner:$owner, name:$name){ - discussions( - categoryId:$supportCategory, - last:50, - answered:false, - states:[OPEN], - ) { - nodes { - id, - number, - updatedAt - } - }, - }, - generalDiscussions: repository(owner:$owner, name:$name){ - discussions( - categoryId:$generalCategory, - last:50, - states:[OPEN], - ) { - nodes { - id, - number, - updatedAt - } - } - } - }`; - const variables = { - owner: context.repo.owner, - name: context.repo.repo, - supportCategory: "DIC_kwDOH31rQM4CRErR", - generalCategory: "DIC_kwDOH31rQM4CRErQ" - } - const result = await github.graphql(query, variables); - const combinedDiscussions = [ - ...result.supportDiscussions.discussions.nodes, - ...result.generalDiscussions.discussions.nodes, - ] - - console.log(`Checking ${combinedDiscussions.length} open discussions`); - - for (const discussion of combinedDiscussions) { - if (new Date(discussion.updatedAt) < cutoff) { - console.log(`Closing outdated discussion #${discussion.number} (${discussion.id}), last updated at ${discussion.updatedAt}`); - const addCommentMutation = `mutation($discussion:ID!, $body:String!) { - addDiscussionComment(input:{discussionId:$discussion, body:$body}) { - clientMutationId - } - }`; - const commentVariables = { - discussion: discussion.id, - body: 'This discussion has been automatically closed due to inactivity.', - } - await github.graphql(addCommentMutation, commentVariables); - - const closeDiscussionMutation = `mutation($discussion:ID!, $reason:DiscussionCloseReason!) { - closeDiscussion(input:{discussionId:$discussion, reason:$reason}) { - clientMutationId - } - }`; - const closeVariables = { - discussion: discussion.id, - reason: "OUTDATED", - } - await github.graphql(closeDiscussionMutation, closeVariables); - - await sleep(1000); - } - }