mirror of
https://github.com/ublue-os/brew.git
synced 2026-11-03 21:49:43 -09:00
init: first functional homebrew tarball generator
Signed-off-by: Tulip Blossom <tulilirockz@outlook.com>
This commit is contained in:
commit
1e8f0ef137
8 changed files with 591 additions and 0 deletions
17
.github/renovate.json5
vendored
Normal file
17
.github/renovate.json5
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
{
|
||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||
"extends": [
|
||||
"github>ublue-os/renovate-config:org-inherited-config"
|
||||
],
|
||||
|
||||
"regexManagers": [
|
||||
{
|
||||
"fileMatch": ["^Containerfile$"],
|
||||
"matchStrings": [
|
||||
"https://github\\.com/ublue-os/artwork/releases/download/bluefin-v(?<version>[0-9\\-]+)/bluefin-wallpapers\\.tar\\.zstd"
|
||||
],
|
||||
"datasourceTemplate": "github-releases",
|
||||
"depNameTemplate": "ublue-os/artwork"
|
||||
}
|
||||
]
|
||||
}
|
||||
111
.github/workflows/brew-tarball.yml
vendored
Normal file
111
.github/workflows/brew-tarball.yml
vendored
Normal file
|
|
@ -0,0 +1,111 @@
|
|||
name: Generate Homebrew Tarball and Release
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
pull_request:
|
||||
paths:
|
||||
- ".github/workflows/brew-tarball.yml"
|
||||
schedule:
|
||||
- cron: "0 1 * * TUE" # Every Tuesday at 1am UTC
|
||||
|
||||
jobs:
|
||||
create_release:
|
||||
name: Create Release
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 30
|
||||
permissions:
|
||||
contents: write
|
||||
outputs:
|
||||
tag_date: ${{ steps.date.outputs.tag_date }}
|
||||
steps:
|
||||
- name: Get current date
|
||||
if: github.event_name != 'pull_request'
|
||||
id: date
|
||||
run: |
|
||||
set -x
|
||||
echo "date=$(date -u +%Y\-%m\-%d\ %H\:%M\:%S)" >> $GITHUB_OUTPUT
|
||||
echo "tag_date=$(date -u +%Y\-%m\-%d-%H-%M-%S)" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Create Release
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: softprops/action-gh-release@6da8fa9354ddfdc4aeace5fc48d7f679b5214090 # v2
|
||||
with:
|
||||
name: Homebrew Tarball (${{ steps.date.outputs.date }})
|
||||
tag_name: "homebrew-${{ steps.date.outputs.tag_date }}"
|
||||
body: |
|
||||
This is a homebrew tarball generated for the [ublue-brew](https://github.com/${{ github.repository }}/blob/${{ github.sha }}/ublue/brew/ublue-brew.spec) package.
|
||||
It exists so that images can have a consistent tarball to base to install homebrew
|
||||
make_latest: true
|
||||
|
||||
push_tarballs:
|
||||
name: Generate Homebrew Tarball and Push to Release
|
||||
runs-on: ${{ matrix.platform == 'amd64' && 'ubuntu-24.04' || 'ubuntu-24.04-arm' }}
|
||||
needs: create_release
|
||||
timeout-minutes: 30
|
||||
permissions:
|
||||
contents: write
|
||||
strategy:
|
||||
matrix:
|
||||
platform: [arm64, amd64]
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
|
||||
- name: Setup Just
|
||||
uses: extractions/setup-just@e33e0265a09d6d736e2ee1e0eb685ef1de4669ff # v3
|
||||
|
||||
- name: Generate Homebrew tarball
|
||||
id: generate_tarball
|
||||
run: |
|
||||
set -euox pipefail
|
||||
just=$(which just)
|
||||
|
||||
OUTDIR="./brew-out"
|
||||
SHASUM_DIR="./brew-sum"
|
||||
TARBALL_FILENAME="homebrew-$(arch).tar.zst"
|
||||
|
||||
mkdir -p $OUTDIR
|
||||
|
||||
podman run --rm -it \
|
||||
-v "$OUTDIR:/outdir:Z" \
|
||||
cgr.dev/chainguard/wolfi-base:latest \
|
||||
/bin/sh -c "
|
||||
set -o xtrace
|
||||
apk add curl git zstd posix-libc-utils uutils gnutar grep
|
||||
curl --retry 3 -Lo /tmp/brew-install https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh
|
||||
chmod +x /tmp/brew-install
|
||||
touch /.dockerenv
|
||||
ln -s /bin/bash /usr/bin/bash
|
||||
ls -s /usr/bin/grep /bin/grep
|
||||
env --ignore-environment PATH=/usr/bin:/bin:/usr/sbin:/sbin HOME=/home/linuxbrew NONINTERACTIVE=1 /usr/bin/bash /tmp/brew-install
|
||||
tar --zstd -cvf /outdir/${TARBALL_FILENAME} /home/linuxbrew/.linuxbrew"
|
||||
|
||||
mkdir -p $SHASUM_DIR
|
||||
for spice in 1 256 512 ; do
|
||||
"sha${spice}sum" "$OUTDIR/$TARBALL_FILENAME" | tee "$SHASUM_DIR/homebrew-$(arch).sha${spice}"
|
||||
done
|
||||
|
||||
echo "outdir=$(realpath $OUTDIR)" >> "$GITHUB_OUTPUT"
|
||||
echo "tarball_file=$(realpath $OUTDIR)/$TARBALL_FILENAME" >> "$GITHUB_OUTPUT"
|
||||
echo "shasum_dir=$(realpath $SHASUM_DIR)" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Upload to Job Artifacts
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
|
||||
with:
|
||||
name: brew-tarball-${{ matrix.platform }}
|
||||
if-no-files-found: error
|
||||
path: |
|
||||
${{ steps.generate_tarball.outputs.tarball_file }}
|
||||
${{ steps.generate_tarball.outputs.shasum_dir }}/*
|
||||
|
||||
- name: Upload Release Artifact
|
||||
if: github.event_name != 'pull_request'
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ github.token }}
|
||||
TAG_DATE: ${{ needs.create_release.outputs.tag_date }}
|
||||
TARBALL_FILE: ${{ steps.generate_tarball.outputs.tarball_file }}
|
||||
SHASUM_DIR: ${{ steps.generate_tarball.outputs.shasum_dir }}
|
||||
run: |
|
||||
gh release upload --clobber \
|
||||
"homebrew-${TAG_DATE}" \
|
||||
"${TARBALL_FILE}" \
|
||||
"${SHASUM_DIR}"/*
|
||||
243
.github/workflows/build.yml
vendored
Normal file
243
.github/workflows/build.yml
vendored
Normal file
|
|
@ -0,0 +1,243 @@
|
|||
name: Build container image
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
schedule:
|
||||
- cron: "0 1 * * SUN"
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths-ignore:
|
||||
- "**/README.md"
|
||||
workflow_dispatch:
|
||||
|
||||
env:
|
||||
IMAGE_DESC: "OCI image for Homebrew"
|
||||
IMAGE_KEYWORDS: "homebrew"
|
||||
IMAGE_LOGO_URL: "https://avatars.githubusercontent.com/u/136393846?s=200&v=4"
|
||||
IMAGE_NAME: "${{ github.event.repository.name }}"
|
||||
IMAGE_REGISTRY: "ghcr.io/${{ github.repository_owner }}"
|
||||
DEFAULT_TAG: "latest"
|
||||
|
||||
jobs:
|
||||
build_push:
|
||||
name: Build and push image
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
id-token: write
|
||||
timeout-minutes: 60
|
||||
strategy:
|
||||
fail-fast: true
|
||||
matrix:
|
||||
platform: ["amd64", "arm64"]
|
||||
runs-on: ${{ matrix.platform == 'amd64' && 'ubuntu-24.04' || 'ubuntu-24.04-arm' }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
|
||||
|
||||
- name: Build image
|
||||
run: podman build -t "${IMAGE_NAME}:${DEFAULT_TAG}" -f ./Containerfile .
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
if: github.event_name != 'pull_request' && github.ref == format('refs/heads/{0}', github.event.repository.default_branch)
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
LOGIN_USER: ${{ github.actor }}
|
||||
run: |
|
||||
echo "${GITHUB_TOKEN}" | podman login -u "${LOGIN_USER}" --password-stdin "ghcr.io"
|
||||
echo "${GITHUB_TOKEN}" | docker login -u "${LOGIN_USER}" --password-stdin "ghcr.io"
|
||||
|
||||
- name: Push to GHCR
|
||||
if: github.event_name != 'pull_request' && github.ref == format('refs/heads/{0}', github.event.repository.default_branch)
|
||||
id: push
|
||||
env:
|
||||
IMAGE_REGISTRY: ${{ env.IMAGE_REGISTRY }}
|
||||
IMAGE_NAME: ${{ env.IMAGE_NAME }}
|
||||
IMAGE_DIGEST: ${{ steps.load.outputs.digest }}
|
||||
PLATFORM: ${{ matrix.platform }}
|
||||
MAX_RETRIES: 3
|
||||
run: |
|
||||
set -x
|
||||
|
||||
for i in $(seq "${MAX_RETRIES}"); do
|
||||
podman push --digestfile=/tmp/digestfile "localhost/${IMAGE_NAME}:${DEFAULT_TAG}" "${IMAGE_REGISTRY}/${IMAGE_NAME}:${DEFAULT_TAG}-${PLATFORM}" && break || sleep $((5 * i));
|
||||
done
|
||||
echo "remote_image_digest=$(< /tmp/digestfile)" | tee "${GITHUB_OUTPUT}"
|
||||
|
||||
- name: Install Cosign
|
||||
uses: sigstore/cosign-installer@faadad0cce49287aee09b3a48701e75088a2c6ad # v4.0.0
|
||||
if: github.event_name != 'pull_request' && github.ref == format('refs/heads/{0}', github.event.repository.default_branch)
|
||||
|
||||
- name: Sign Image
|
||||
if: github.event_name != 'pull_request' && github.ref == format('refs/heads/{0}', github.event.repository.default_branch)
|
||||
env:
|
||||
REMOTE_IMAGE_DIGEST: ${{ steps.push.outputs.remote_image_digest }}
|
||||
COSIGN_EXPERIMENTAL: false
|
||||
COSIGN_PRIVATE_KEY: ${{ secrets.SIGNING_SECRET }}
|
||||
run: cosign sign -y --key env://COSIGN_PRIVATE_KEY "${IMAGE_REGISTRY}/${IMAGE_NAME}@${REMOTE_IMAGE_DIGEST}"
|
||||
|
||||
- name: Create Job Outputs
|
||||
if: github.event_name != 'pull_request' && github.ref == format('refs/heads/{0}', github.event.repository.default_branch)
|
||||
env:
|
||||
IMAGE_NAME: ${{ env.IMAGE_NAME }}
|
||||
PLATFORM: ${{ matrix.platform }}
|
||||
DIGEST: ${{ steps.push.outputs.remote_image_digest }}
|
||||
run: |
|
||||
set -x
|
||||
mkdir -p /tmp/outputs/digests
|
||||
echo "${DIGEST}" | tee "/tmp/outputs/digests/${IMAGE_NAME}-${PLATFORM}.txt"
|
||||
|
||||
- name: Upload Output Artifacts
|
||||
if: github.event_name != 'pull_request' && github.ref == format('refs/heads/{0}', github.event.repository.default_branch)
|
||||
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5
|
||||
with:
|
||||
name: ${{ env.IMAGE_NAME }}-${{ matrix.platform }}
|
||||
retention-days: 1
|
||||
if-no-files-found: error
|
||||
path: |
|
||||
/tmp/outputs/digests/*.txt
|
||||
|
||||
manifest:
|
||||
name: Create Manifest
|
||||
runs-on: ubuntu-latest
|
||||
if: always()
|
||||
needs:
|
||||
- build_push
|
||||
container:
|
||||
image: docker.io/library/alpine:latest
|
||||
options: --privileged --security-opt seccomp=unconfined
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
id-token: write
|
||||
steps:
|
||||
- name: Install dependencies
|
||||
run: apk add bash coreutils curl docker findutils fuse-overlayfs git grep jq podman sed
|
||||
|
||||
# Necessary until bootc supports Cosign v3
|
||||
- name: Install old cosign
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ github.token }}
|
||||
run: |
|
||||
# Thank you Bri! :3 @b-
|
||||
curl --retry 3 -H "Authorization: Bearer ${GITHUB_TOKEN}" -fsSLo "/usr/bin/cosign" "https://github.com/sigstore/cosign/releases/download/v2.6.1/cosign-linux-amd64"
|
||||
chmod +x /usr/bin/cosign
|
||||
|
||||
- name: Exit on failure
|
||||
shell: bash
|
||||
env:
|
||||
JOBS: ${{ toJson(needs) }}
|
||||
run: |
|
||||
for i in $(jq -r 'to_entries[] | .value.result' <<< "${JOBS}"); do
|
||||
if [ "$i" != "success" ] && [ "$i" != "skipped" ]; then
|
||||
echo "Status check not okay!"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
# This generates a timestamp like what is defined on the ArtifactHub documentation
|
||||
# E.G: 2022-02-08T15:38:15Z'
|
||||
# https://artifacthub.io/docs/topics/repositories/container-images/
|
||||
# https://linux.die.net/man/1/date
|
||||
- name: Get current date
|
||||
id: date
|
||||
run: echo "date=$(date -u +%Y\-%m\-%d\T%H\:%M\:%S\Z)" | tee "${GITHUB_OUTPUT}"
|
||||
|
||||
- name: Image Metadata
|
||||
uses: docker/metadata-action@c1e51972afc2121e065aed6d45c65596fe445f3f # v5
|
||||
id: metadata
|
||||
with:
|
||||
tags: |
|
||||
type=raw,value=${{ env.DEFAULT_TAG }}
|
||||
type=raw,value=${{ env.DEFAULT_TAG }}.{{date 'YYYYMMDD'}}
|
||||
type=raw,value={{date 'YYYYMMDD'}}
|
||||
type=ref,event=pr
|
||||
type=sha,enable=${{ github.event_name == 'pull_request' }}
|
||||
labels: |
|
||||
containers.bootc=1
|
||||
io.artifacthub.package.deprecated=false
|
||||
io.artifacthub.package.keywords=${{ env.IMAGE_KEYWORDS }}
|
||||
io.artifacthub.package.license=Apache-2.0
|
||||
io.artifacthub.package.logo-url=${{ env.IMAGE_LOGO_URL }}
|
||||
io.artifacthub.package.prerelease=false
|
||||
io.artifacthub.package.readme-url=https://raw.githubusercontent.com/${{ github.repository_owner }}/${{ env.IMAGE_NAME }}/${{ github.sha }}/README.md
|
||||
org.opencontainers.image.created=${{ steps.date.outputs.date }}
|
||||
org.opencontainers.image.description=${{ env.IMAGE_DESC }}
|
||||
org.opencontainers.image.documentation=https://raw.githubusercontent.com/${{ github.repository_owner }}/${{ env.IMAGE_NAME }}/${{ github.sha }}/README.md
|
||||
org.opencontainers.image.source=https://github.com/${{ github.repository_owner }}/${{ env.IMAGE_NAME }}/blob/${{ github.sha }}/Containerfile
|
||||
org.opencontainers.image.title=${{ env.IMAGE_NAME }}
|
||||
org.opencontainers.image.url=https://github.com/${{ github.repository_owner }}/${{ env.IMAGE_NAME }}/tree/${{ github.sha }}
|
||||
org.opencontainers.image.vendor=${{ github.repository_owner }}
|
||||
org.opencontainers.image.version=${{ env.DEFAULT_TAG }}.{{date 'YYYYMMDD'}}
|
||||
|
||||
- name: Fetch Build Outputs
|
||||
if: github.event_name != 'pull_request' && github.ref == format('refs/heads/{0}', github.event.repository.default_branch)
|
||||
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6
|
||||
with:
|
||||
pattern: ${{ env.IMAGE_NAME }}-*
|
||||
merge-multiple: true
|
||||
path: /tmp/artifacts
|
||||
|
||||
- name: Load Outputs
|
||||
if: github.event_name != 'pull_request' && github.ref == format('refs/heads/{0}', github.event.repository.default_branch)
|
||||
shell: bash
|
||||
id: load-outputs
|
||||
run: |
|
||||
set -x
|
||||
OUTCSV="$(mktemp)"
|
||||
for digest_file in /tmp/artifacts/*.txt; do
|
||||
# Extract the platform from the file name
|
||||
PLATFORM="$(basename "${digest_file}" ".txt" | sed 's/.*-//g')"
|
||||
IMAGE_NAME="$(basename "${digest_file}" ".txt" | grep -Po ".*-" | sed 's/-$//')"
|
||||
DIGEST="$(< "${digest_file}")"
|
||||
echo "${PLATFORM},${IMAGE_NAME},${DIGEST}" | tee -a "${OUTCSV}"
|
||||
done
|
||||
echo "OUTPUT_CSV=$(base32 -w 0 < "${OUTCSV}")" | tee -a "${GITHUB_OUTPUT}"
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
if: github.event_name != 'pull_request' && github.ref == format('refs/heads/{0}', github.event.repository.default_branch)
|
||||
env:
|
||||
REGISTRY: ghcr.io
|
||||
run: |
|
||||
echo "${{ secrets.GITHUB_TOKEN }}" | podman login -u "${{ github.actor }}" --password-stdin "${REGISTRY}"
|
||||
echo "${{ secrets.GITHUB_TOKEN }}" | docker login -u "${{ github.actor }}" --password-stdin "${REGISTRY}"
|
||||
|
||||
- name: Publish manifest with unified architecture and sign
|
||||
shell: bash
|
||||
if: github.event_name != 'pull_request' && github.ref == format('refs/heads/{0}', github.event.repository.default_branch)
|
||||
env:
|
||||
COSIGN_EXPERIMENTAL: false
|
||||
COSIGN_PRIVATE_KEY: ${{ secrets.SIGNING_SECRET }}
|
||||
LABELS: ${{ steps.metadata.outputs.labels }}
|
||||
OUTPUT_CSV: ${{ steps.load-outputs.outputs.OUTPUT_CSV }}
|
||||
TAGS: ${{ steps.metadata.outputs.tags }}
|
||||
run: |
|
||||
set -x
|
||||
|
||||
OUTPUT_CSV_FILE="$(mktemp)"
|
||||
echo "${OUTPUT_CSV}" | base32 -d | tee "${OUTPUT_CSV_FILE}"
|
||||
|
||||
# This is insanely dumb, please PR if you have a better solution ~ @tulilirockz :3c
|
||||
IMAGES=$(cat "${OUTPUT_CSV_FILE}" | while IFS=$'\n' read -r ENTRY ; do echo "${ENTRY}" | cut -d, -f2 ; done | sort | uniq | tr "\n" " " | sed 's/.$//')
|
||||
for TARGET_IMAGE in ${IMAGES} ; do
|
||||
TARGET_MANIFEST="${IMAGE_REGISTRY}/${TARGET_IMAGE}"
|
||||
podman manifest create "${TARGET_MANIFEST}"
|
||||
|
||||
PLATFORMS=$(grep -F -e "${IMAGE}" "${OUTPUT_CSV_FILE}" | while IFS=$'\n' read -r ENTRY ; do echo "${ENTRY}" | cut -d, -f1 ; done | sort | uniq | tr "\n" " " | sed 's/.$//')
|
||||
for TARGET_PLATFORM in ${PLATFORMS} ; do
|
||||
TARGET_DIGEST="$(grep -F -e ",${TARGET_IMAGE}," "${OUTPUT_CSV_FILE}" | grep -F -e "${TARGET_PLATFORM}" | cut -d, -f3 | tr -d "\n")"
|
||||
podman manifest add "${TARGET_MANIFEST}" "${TARGET_MANIFEST}@${TARGET_DIGEST}" --arch "${TARGET_PLATFORM}"
|
||||
done
|
||||
|
||||
while IFS= read -r LABEL; do
|
||||
podman manifest annotate --index --annotation "${LABEL}" "${TARGET_MANIFEST}"
|
||||
done <<< "${LABELS}"
|
||||
|
||||
while IFS= read -r TAG; do
|
||||
podman manifest push --all=false --digestfile=/tmp/digestfile "${TARGET_MANIFEST}" "${TARGET_MANIFEST}:${TAG}"
|
||||
done <<< "${TAGS}"
|
||||
|
||||
cosign sign -y --key env://COSIGN_PRIVATE_KEY "${TARGET_MANIFEST}@$(< /tmp/digestfile)"
|
||||
done
|
||||
7
Containerfile
Normal file
7
Containerfile
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
FROM docker.io/library/alpine:latest AS build
|
||||
|
||||
RUN exit 1
|
||||
|
||||
FROM scratch AS ctx
|
||||
COPY /system_files/shared /system_files/shared/
|
||||
COPY --from=build /out/homebrew.tar.zstd /system_files/usr/share/homebrew.tar.zstd
|
||||
2
Justfile
Normal file
2
Justfile
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
build:
|
||||
podman build -t localhost/bluefin-brew:latest -f ./Containerfile .
|
||||
201
LICENSE
Normal file
201
LICENSE
Normal file
|
|
@ -0,0 +1,201 @@
|
|||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
6
README.md
Normal file
6
README.md
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
# brew
|
||||
|
||||
Repository for generating Homebrew tarballs for redistribution on image-based systems via an OCI image
|
||||
|
||||
This includes general settings you'd want to use when using homebrew on a `bootc` system, including a tarball and services for setting it up
|
||||
|
||||
4
cosign.pub
Normal file
4
cosign.pub
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
-----BEGIN PUBLIC KEY-----
|
||||
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEqMA/DNasRR+uWtCi0jcLQePscPlm
|
||||
EB96KdUB9r/drOGJvcI+p+HEcE20ji/gSiKzHCmKO3hUEHCUMNmg0THyLA==
|
||||
-----END PUBLIC KEY-----
|
||||
Loading…
Reference in a new issue