diff --git a/.github/workflows/fork-docker-publish.yml b/.github/workflows/fork-docker-publish.yml new file mode 100644 index 00000000..32055d5f --- /dev/null +++ b/.github/workflows/fork-docker-publish.yml @@ -0,0 +1,133 @@ +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 == 'discretizer/homepage' + runs-on: ubuntu-latest + + needs: + - pre-commit + permissions: + contents: read + packages: write + + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + + # 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 + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max + + # 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/fork-docs-publish.yml b/.github/workflows/fork-docs-publish.yml new file mode 100644 index 00000000..a767dd96 --- /dev/null +++ b/.github/workflows/fork-docs-publish.yml @@ -0,0 +1,100 @@ +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 == 'discretizer/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@v3 + 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 == 'discretizer/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@v3 + 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 mkdocs-material + - 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/fork-sync.yml b/.github/workflows/fork-sync.yml new file mode 100644 index 00000000..1968abe5 --- /dev/null +++ b/.github/workflows/fork-sync.yml @@ -0,0 +1,49 @@ +name: Sync Fork +on: + workflow_dispatch: + inputs: + tags: + description: 'tag list' + type: string + required: false + default: '' + schedule: + - cron: '2 */12 * * *' +permissions: + contents: write +jobs: + synchronize-upstream: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - run: git remote add upstream https://github.com/gethomepage/homepage.git && git fetch upstream --tags --force + - name: Fetch Upstream Tags + id: fetch-upstream-tags + if: ${{ !inputs.tags }} + run: | + fmt='r=%(refname) + echo ${r#refs/tags/}' + echo 'NEW_TAGS<> $GITHUB_OUTPUT + EXPR=$(git for-each-ref --format="$fmt" --no-merge main refs/tags) + eval "$EXPR" >> $GITHUB_OUTPUT + echo 'EOF' >> $GITHUB_OUTPUT + - name: Set Identity + run: | + git config user.name "Github Action" + git config user.email "bot@github-actions" + - name: Create Tags + if: ${{inputs.tags || steps.fetch-upstream-tags.outputs.NEW_TAGS}} + run: | + for TAG in ${NEW_TAGS}; do + git checkout -b release/${TAG} ${TAG} + git rev-list --reverse main ^upstream/main | git cherry-pick --stdin + git tag -d ${TAG} + git tag ${TAG} release/${TAG} + done + for TAG in ${NEW_TAGS}; do git push -u origin release/${TAG}; done + env: + NEW_TAGS: ${{inputs.tags || steps.fetch-upstream-tags.outputs.NEW_TAGS}} + env: + GH_TOKEN: ${{ github.token }}