diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 6b5d0e7d34457..a0e1491e2f7c1 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -4,10 +4,12 @@ on: paths: - .github/workflows/docker.yml - Dockerfile + - dagger/** push: paths: - .github/workflows/docker.yml - Dockerfile + - dagger/** branches-ignore: - master release: @@ -34,7 +36,8 @@ jobs: with: version: "latest" verb: call - args: test --src . + args: test-all --src . --commit-sha ${{ github.sha }} --brew-version "$(git describe --tags --dirty --abbrev=7)" + engine-stop: false - name: Publish uses: dagger/dagger-for-github@v5 @@ -44,73 +47,13 @@ jobs: with: version: "latest" verb: call - args: publish-all --src . --hub-username matipan --hub-token HOMEBREW_BREW_DOCKER_TOKEN --gh-username franela --gh-token HOMEBREW_BREW_GITHUB_PACKAGES_TOKEN --commit-sha ${{ github.sha }} + args: | + publish-all --src . + --hub-username brewtestbot \ + --hub-token HOMEBREW_BREW_DOCKER_TOKEN \ + --gh-username BrewTestBot \ + --gh-token HOMEBREW_BREW_GITHUB_PACKAGES_TOKEN \ + --commit-sha ${{ github.sha }} \ + --brew-version "${GITHUB_REF:10}" - #ubuntu: - #if: startsWith(github.repository, 'Homebrew/') - #runs-on: ubuntu-22.04 - #strategy: - #fail-fast: false - #matrix: - #version: ["18.04", "20.04", "22.04", "24.04"] - #steps: - #- name: Checkout - #uses: actions/checkout@v4 - #with: - #fetch-depth: 0 - #persist-credentials: false - - #- name: Fetch origin/master from Git - #run: git fetch origin master - - #- name: Build Docker image - #run: | - #brew_version="$(git describe --tags --dirty --abbrev=7)" - #echo "Building for Homebrew ${brew_version}" - #docker build -t brew \ - #--build-arg=version=${{matrix.version}} \ - #--label org.opencontainers.image.created="$(date --rfc-3339=seconds --utc)" \ - #--label org.opencontainers.image.url="https://brew.sh" \ - #--label org.opencontainers.image.documentation="https://docs.brew.sh" \ - #--label org.opencontainers.image.source="https://github.com/${GITHUB_REPOSITORY}" \ - #--label org.opencontainers.image.version="${brew_version}" \ - #--label org.opencontainers.image.revision="${GITHUB_SHA}" \ - #--label org.opencontainers.image.vendor="${GITHUB_REPOSITORY_OWNER}" \ - #--label org.opencontainers.image.licenses="BSD-2-Clause" \ - #. - - #- name: Run brew test-bot --only-setup - #run: docker run --rm brew brew test-bot --only-setup - - #- name: Deploy the tagged Docker image to GitHub Packages - #if: startsWith(github.ref, 'refs/tags/') - #run: | - #brew_version="${GITHUB_REF:10}" - #echo "brew_version=${brew_version}" >> "${GITHUB_ENV}" - #echo ${{secrets.HOMEBREW_BREW_GITHUB_PACKAGES_TOKEN}} | docker login ghcr.io -u BrewTestBot --password-stdin - #docker tag brew "ghcr.io/homebrew/ubuntu${{matrix.version}}:${brew_version}" - #docker push "ghcr.io/homebrew/ubuntu${{matrix.version}}:${brew_version}" - #docker tag brew "ghcr.io/homebrew/ubuntu${{matrix.version}}:latest" - #docker push "ghcr.io/homebrew/ubuntu${{matrix.version}}:latest" - - #- name: Deploy the tagged Docker image to Docker Hub - #if: startsWith(github.ref, 'refs/tags/') - #run: | - #echo ${{secrets.HOMEBREW_BREW_DOCKER_TOKEN}} | docker login -u brewtestbot --password-stdin - #docker tag brew "homebrew/ubuntu${{matrix.version}}:${brew_version}" - #docker push "homebrew/ubuntu${{matrix.version}}:${brew_version}" - #docker tag brew "homebrew/ubuntu${{matrix.version}}:latest" - #docker push "homebrew/ubuntu${{matrix.version}}:latest" - - #- name: Deploy the homebrew/brew Docker image to GitHub Packages and Docker Hub - #if: startsWith(github.ref, 'refs/tags/') && matrix.version == '22.04' - #run: | - #docker tag brew "ghcr.io/homebrew/brew:${brew_version}" - #docker push "ghcr.io/homebrew/brew:${brew_version}" - #docker tag brew "ghcr.io/homebrew/brew:latest" - #docker push "ghcr.io/homebrew/brew:latest" - #docker tag brew "homebrew/brew:${brew_version}" - #docker push "homebrew/brew:${brew_version}" - #docker tag brew "homebrew/brew:latest" - #docker push "homebrew/brew:latest" diff --git a/Dockerfile b/Dockerfile index 93e18cad64651..8f088acf74e0a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -48,7 +48,7 @@ RUN apt-get update \ && rm -rf /var/lib/apt/lists/* \ && sed -i -E 's/^(USERGROUPS_ENAB\s+)yes$/\1no/' /etc/login.defs \ && localedef -i en_US -f UTF-8 en_US.UTF-8 \ - && useradd --create-home --shell /bin/bash --user-group linuxbrew \ + && useradd -u 1001 --create-home --shell /bin/bash --user-group linuxbrew \ && echo 'linuxbrew ALL=(ALL) NOPASSWD:ALL' >>/etc/sudoers \ && su - linuxbrew -c 'mkdir ~/.linuxbrew' @@ -58,13 +58,20 @@ ENV PATH="/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin:${PATH} XDG_CACHE_HOME=/home/linuxbrew/.cache WORKDIR /home/linuxbrew -RUN --mount=type=cache,target=Homebrew/Library/Homebrew/vendor/portable-ruby,uid=1000 \ - --mount=type=cache,target=Homebrew/Library/Taps,uid=1000 \ - --mount=type=cache,target=.cache,uid=1000 \ + +RUN --mount=type=cache,target=/tmp/homebrew-core,uid=1001,sharing=locked \ + # Clone the homebre-core repo into /tmp/homebrew-core or pull latest changes if it exists + git clone https://github.com/homebrew/homebrew-core /tmp/homebrew-core || { cd /tmp/homebrew-core && git pull; } \ + && mkdir -p /home/linuxbrew/.linuxbrew/Homebrew/Library/Taps/homebrew/homebrew-core \ + && cp -r /tmp/homebrew-core /home/linuxbrew/.linuxbrew/Homebrew/Library/Taps/homebrew/ + + +RUN --mount=type=cache,target=/home/linuxbrew/.cache,uid=1001 \ + --mount=type=cache,target=/home/linuxbrew/.bundle,uid=1001 \ mkdir -p \ .linuxbrew/bin \ - .linuxbrew/etc \ .linuxbrew/include \ + .linuxbrew/etc \ .linuxbrew/lib \ .linuxbrew/opt \ .linuxbrew/sbin \ diff --git a/dagger/main.go b/dagger/main.go index 2b3eb985c968b..4f6a340a2d652 100644 --- a/dagger/main.go +++ b/dagger/main.go @@ -4,15 +4,16 @@ import ( "context" "fmt" "time" + + "golang.org/x/sync/errgroup" ) -// var versions = []string{"20.04", "18.04", "16.04"} -var versions = []string{"20.04"} +var versions = []string{"24.04", "22.04", "20.04", "18.04"} type Brew struct{} // BaseContainer returns the container from homebrew's Dockerfile. -func (m *Brew) BaseContainer(src *Directory, version, commitSha, githubRepo, repoOwner, baseImageVersion string) *Container { +func (m *Brew) BaseContainer(src *Directory, version, commitSha, githubRepo, repoOwner, baseImageVersion string, brewVersion string) *Container { return src.DockerBuild(DirectoryDockerBuildOpts{ BuildArgs: []BuildArg{ {Name: "version", Value: baseImageVersion}, @@ -22,52 +23,90 @@ func (m *Brew) BaseContainer(src *Directory, version, commitSha, githubRepo, rep WithLabel("org.opencontainers.image.licenses", "BSD-2-Clause"). WithLabel("org.opencontainers.image.documentation", "https://docs.brew.sh"). // TODO: you have got to fix this - WithLabel("org.opencontainers.image.created", time.Now().UTC().Format(time.RFC3339)). + WithLabel("org.opencontainers.image.created", time.Now().UTC().Format("2006-01-02 15:04:05-07:00")). WithLabel("org.opencontainers.image.source", "https://github.com/"+githubRepo). - WithLabel("org.opencontainers.image.version", version). + WithLabel("org.opencontainers.image.version", brewVersion). WithLabel("org.opencontainers.image.revision", commitSha). WithLabel("org.opencontainers.image.vendor", repoOwner) } -func (m *Brew) PublishAll(ctx context.Context, src *Directory, hubUsername string, hubToken *Secret, ghUsername string, ghToken *Secret, commitSHA string) error { - if err := m.Publish(ctx, src, "docker.io", hubUsername, hubToken, commitSHA); err != nil { +// publishes to both docker.io and ghcr registries +func (m *Brew) PublishAll(ctx context.Context, src *Directory, hubUsername string, hubToken *Secret, ghUsername string, ghToken *Secret, commitSHA string, brewVersion string) error { + if err := m.Publish(ctx, src, "docker.io", hubUsername, hubToken, commitSHA, brewVersion); err != nil { return err } - return m.Publish(ctx, src, "ghcr.io", ghUsername, ghToken, commitSHA) + return m.Publish(ctx, src, "ghcr.io", ghUsername, ghToken, commitSHA, brewVersion) } -func (m *Brew) Publish(ctx context.Context, src *Directory, registry, username string, token *Secret, commitSHA string) error { +// publishes image to specified registry +func (m *Brew) Publish(ctx context.Context, src *Directory, registry, username string, token *Secret, commitSHA string, brewVersion string) error { for _, version := range versions { - c := m.BaseContainer(src, version, commitSHA, "franela/brew", "franela", version) + c := m.BaseContainer(src, version, commitSHA, "franela/brew", "franela", version, brewVersion) addr, err := c. WithRegistryAuth(registry, username, token). - Publish(ctx, registry+"/franela/brew-ubuntu:"+version) + Publish(ctx, registry+"/"+username+"/brew-ubuntu:"+version) if err != nil { return err } fmt.Println("published at", addr) addr, err = c. - Publish(ctx, registry+"/franela/brew-ubuntu:latest") + Publish(ctx, registry+"/"+username+"/brew-ubuntu:latest") if err != nil { return err } + if version == "22.04" { + addr, err = c. + Publish(ctx, registry+"/"+username+"/brew:latest") + if err != nil { + return err + } + } + fmt.Println("published at", addr) } return nil } -func (m *Brew) Test(ctx context.Context, src *Directory) error { +// runs brew test-bot against latest ubuntu image +func (m *Brew) Test(ctx context.Context, + src *Directory, + // +default="24.04" + version string, + // +default="" + commitSHA string, + // +default="" + brewVersion string, +) error { + _, err := m.BaseContainer(src, version, commitSHA, "franela/brew", "franela", version, brewVersion). + WithExec([]string{"brew", "test-bot", "--only-setup"}).Sync(ctx) + if err != nil { + return err + } + + return nil +} + +// runs brew test-bot against all versions +func (m *Brew) TestAll(ctx context.Context, + src *Directory, + // +default="" + commitSHA string, + // +default="" + brewVersion string, +) error { + eg := errgroup.Group{} + for _, version := range versions { - _, err := m.BaseContainer(src, version, "foo", "franela/brew", "franela", version). - WithExec([]string{"brew", "test-bot", "--only-setup"}).Sync(ctx) - if err != nil { + eg.Go(func() error { + _, err := m.BaseContainer(src, version, commitSHA, "franela/brew", "franela", version, brewVersion). + WithExec([]string{"brew", "test-bot", "--only-setup"}).Sync(ctx) return err - } + }) } - return nil + return eg.Wait() }