From 42df9afeaf5582f68178aa349674428a059ebce3 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 6 Dec 2024 16:56:06 +0100 Subject: [PATCH] Fix release by using github action --- .github/workflows/build.yaml | 35 +------ .github/workflows/experimental.yaml | 38 +++----- .github/workflows/release.yaml | 127 ++++++++++++++++++++++++++ .github/workflows/template-webui.yaml | 37 ++++++++ .goreleaser.yml.tmpl | 15 +-- .semaphore/semaphore.yml | 62 ++----------- internal/release/release.go | 12 ++- script/deploy.sh | 6 +- 8 files changed, 210 insertions(+), 122 deletions(-) create mode 100644 .github/workflows/release.yaml create mode 100644 .github/workflows/template-webui.yaml diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 022db925c..a6f131353 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -16,36 +16,7 @@ env: jobs: build-webui: - runs-on: ubuntu-latest - - steps: - - name: Check out code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Setup node - uses: actions/setup-node@v4 - with: - node-version-file: webui/.nvmrc - cache: yarn - cache-dependency-path: webui/yarn.lock - - - name: Build webui - working-directory: ./webui - run: | - yarn install - yarn build - - - name: Package webui - run: | - tar czvf webui.tar.gz ./webui/static/ - - - name: Artifact webui - uses: actions/upload-artifact@v4 - with: - name: webui.tar.gz - path: webui.tar.gz + uses: ./.github/workflows/template-webui.yaml build: runs-on: ubuntu-latest @@ -97,7 +68,9 @@ jobs: name: webui.tar.gz - name: Untar webui - run: tar xvf webui.tar.gz + run: | + tar xvf webui.tar.gz + rm webui.tar.gz - name: Build env: diff --git a/.github/workflows/experimental.yaml b/.github/workflows/experimental.yaml index aadce96a8..cb64572c9 100644 --- a/.github/workflows/experimental.yaml +++ b/.github/workflows/experimental.yaml @@ -12,6 +12,10 @@ env: jobs: + build-webui: + if: github.repository == 'traefik/traefik' + uses: ./.github/workflows/template-webui.yaml + experimental: if: github.repository == 'traefik/traefik' name: Build experimental image on branch @@ -19,30 +23,6 @@ jobs: steps: - # https://github.com/marketplace/actions/checkout - - name: Check out code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Setup node - uses: actions/setup-node@v4 - with: - node-version-file: webui/.nvmrc - cache: yarn - cache-dependency-path: webui/yarn.lock - - - name: Build webui - working-directory: ./webui - run: | - yarn install - yarn build - - - name: Set up Go ${{ env.GO_VERSION }} - uses: actions/setup-go@v5 - with: - go-version: ${{ env.GO_VERSION }} - - name: Build run: make generate binary @@ -61,6 +41,16 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 + - name: Artifact webui + uses: actions/download-artifact@v4 + with: + name: webui.tar.gz + + - name: Untar webui + run: | + tar xvf webui.tar.gz + rm webui.tar.gz + - name: Build docker experimental image env: DOCKER_BUILDX_ARGS: "--push" diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 000000000..fcbce000e --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,127 @@ +name: Release + +on: + push: + tags: + - 'v*.*.*' + +env: + GO_VERSION: '1.23' + CGO_ENABLED: 0 + VERSION: ${{ github.ref_name }} + TRAEFIKER_EMAIL: "traefiker@traefik.io" + CODENAME: mimolette + +jobs: + + build-webui: + if: github.ref_type == 'tag' + uses: ./.github/workflows/template-webui.yaml + + build: + if: github.ref_type == 'tag' + runs-on: ubuntu-latest + + strategy: + matrix: + os: [ linux-amd64, linux-386, linux-arm, linux-arm64, linux-ppc64le, linux-s390x, linux-riscv64, darwin, windows-amd64, windows-arm64, windows-386, freebsd, openbsd ] + needs: + - build-webui + + steps: + - name: Check out code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Go ${{ env.GO_VERSION }} + uses: actions/setup-go@v5 + env: + # Ensure cache consistency on Linux, see https://github.com/actions/setup-go/pull/383 + ImageOS: ${{ matrix.os }} + with: + go-version: ${{ env.GO_VERSION }} + + - name: Artifact webui + uses: actions/download-artifact@v4 + with: + name: webui.tar.gz + + - name: Untar webui + run: | + tar xvf webui.tar.gz + rm webui.tar.gz + + - name: Go generate + run: go generate + + + - name: Generate goreleaser file + run: | + GORELEASER_CONFIG_FILE_PATH=$(go run ./internal/release "${{ matrix.os }}") + echo "GORELEASER_CONFIG_FILE_PATH=$GORELEASER_CONFIG_FILE_PATH" >> $GITHUB_ENV + + - name: Build with goreleaser + uses: goreleaser/goreleaser-action@v6 + with: + distribution: goreleaser + # 'latest', 'nightly', or a semver + version: '~> v2' + args: release --clean --timeout="90m" --config "${{ env.GORELEASER_CONFIG_FILE_PATH }}" + + - name: Artifact binaries + uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.os }}-binaries + path: | + dist/**/*_checksums.txt + dist/**/*.tar.gz + dist/**/*.zip + retention-days: 1 + + release: + if: github.ref_type == 'tag' + runs-on: ubuntu-latest + + needs: + - build + + steps: + - name: Check out code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Retrieve the secret and decode it to a file + env: + TRAEFIKER_RSA: ${{ secrets.TRAEFIKER_RSA }} + run: | + mkdir -p ~/.ssh + echo "${TRAEFIKER_RSA}" | base64 --decode > ~/.ssh/traefiker_rsa + + - name: Download All Artifacts + uses: actions/download-artifact@v4 + with: + path: dist/ + pattern: "*-binaries" + merge-multiple: true + + - name: Publish Release + env: + GH_TOKEN: ${{ github.token }} + run: | + cat dist/**/*_checksums.txt >> "dist/traefik_${VERSION}_checksums.txt" + rm dist/**/*_checksums.txt + tar cfz "dist/traefik-${VERSION}.src.tar.gz" \ + --exclude-vcs \ + --exclude .idea \ + --exclude .travis \ + --exclude .semaphoreci \ + --exclude .github \ + --exclude dist . + + chown -R "$(id -u)":"$(id -g)" dist/ + gh release create ${VERSION} ./dist/**/traefik*.{zip,tar.gz} ./dist/traefik*.{tar.gz,txt} --repo traefik/traefik --title ${VERSION} --notes ${VERSION} + + ./script/deploy.sh + diff --git a/.github/workflows/template-webui.yaml b/.github/workflows/template-webui.yaml new file mode 100644 index 000000000..df52d75c1 --- /dev/null +++ b/.github/workflows/template-webui.yaml @@ -0,0 +1,37 @@ +name: Build Web UI +on: + workflow_call: {} +jobs: + + build-webui: + runs-on: ubuntu-latest + + steps: + - name: Check out code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup node + uses: actions/setup-node@v4 + with: + node-version-file: webui/.nvmrc + cache: yarn + cache-dependency-path: webui/yarn.lock + + - name: Build webui + working-directory: ./webui + run: | + yarn install + yarn build + + - name: Package webui + run: | + tar czvf webui.tar.gz ./webui/static/ + + - name: Artifact webui + uses: actions/upload-artifact@v4 + with: + name: webui.tar.gz + path: webui.tar.gz + retention-days: 1 diff --git a/.goreleaser.yml.tmpl b/.goreleaser.yml.tmpl index acb524a85..e7299128c 100644 --- a/.goreleaser.yml.tmpl +++ b/.goreleaser.yml.tmpl @@ -1,12 +1,11 @@ project_name: traefik +version: 2 +[[if .GOARCH]] +dist: "./dist/[[ .GOOS ]]-[[ .GOARCH ]]" +[[else]] dist: "./dist/[[ .GOOS ]]" - -[[ if eq .GOOS "linux" ]] -before: - hooks: - - go generate -[[ end ]] +[[end]] builds: - binary: traefik @@ -21,6 +20,9 @@ builds: goos: - "[[ .GOOS ]]" goarch: + [[if .GOARCH]] + - "[[ .GOARCH ]]" + [[else]] - amd64 - '386' - arm @@ -28,6 +30,7 @@ builds: - ppc64le - s390x - riscv64 + [[end]] goarm: - '7' - '6' diff --git a/.semaphore/semaphore.yml b/.semaphore/semaphore.yml index fa09ce3c4..32f22b2b8 100644 --- a/.semaphore/semaphore.yml +++ b/.semaphore/semaphore.yml @@ -1,63 +1,13 @@ version: v1.0 -name: Traefik +name: Traefik Release - deprecated agent: machine: - type: e1-standard-4 - os_image: ubuntu2004 - -fail_fast: - stop: - when: "branch != 'master'" - -auto_cancel: - queued: - when: "branch != 'master'" - running: - when: "branch != 'master'" - -global_job_config: - prologue: - commands: - - curl -sSfL https://raw.githubusercontent.com/ldez/semgo/master/godownloader.sh | sudo sh -s -- -b "/usr/local/bin" - - sudo semgo go1.23 - - export "GOPATH=$(go env GOPATH)" - - export "SEMAPHORE_GIT_DIR=${GOPATH}/src/github.com/traefik/${SEMAPHORE_PROJECT_NAME}" - - export "PATH=${GOPATH}/bin:${PATH}" - - mkdir -vp "${SEMAPHORE_GIT_DIR}" "${GOPATH}/bin" - - export GOPROXY=https://proxy.golang.org,direct - - curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b "${GOPATH}/bin" v1.62.0 - - curl -sSfL https://gist.githubusercontent.com/traefiker/6d7ac019c11d011e4f131bb2cca8900e/raw/goreleaser.sh | bash -s -- -b "${GOPATH}/bin" - - checkout - - cache restore traefik-$(checksum go.sum) - + type: f1-standard-2 + os_image: ubuntu2204 blocks: - - name: Release - dependencies: [] - run: - when: "tag =~ '.*'" + - name: 'Do nothing' task: - agent: - machine: - type: e1-standard-8 - os_image: ubuntu2004 - secrets: - - name: traefik - env_vars: - - name: GH_VERSION - value: 2.32.1 - - name: CODENAME - value: "mimolette" - prologue: - commands: - - export VERSION=${SEMAPHORE_GIT_TAG_NAME} - - curl -sSL -o /tmp/gh_${GH_VERSION}_linux_amd64.tar.gz https://github.com/cli/cli/releases/download/v${GH_VERSION}/gh_${GH_VERSION}_linux_amd64.tar.gz - - tar -zxvf /tmp/gh_${GH_VERSION}_linux_amd64.tar.gz -C /tmp - - sudo mv /tmp/gh_${GH_VERSION}_linux_amd64/bin/gh /usr/local/bin/gh - - sudo rm -rf ~/.phpbrew ~/.kerl ~/.sbt ~/.nvm ~/.npm ~/.kiex /usr/lib/jvm /opt/az /opt/firefox /usr/lib/google-cloud-sdk ~/.rbenv ~/.pip_download_cache # Remove unnecessary data. - - sudo service docker stop && sudo umount /var/lib/docker && sudo service docker start # Unmounts the docker disk and the whole system disk is usable. jobs: - - name: Release + - name: 'Do nothing' commands: - - make release-packages - - gh release create ${SEMAPHORE_GIT_TAG_NAME} ./dist/**/traefik*.{zip,tar.gz} ./dist/traefik*.{tar.gz,txt} --repo traefik/traefik --title ${SEMAPHORE_GIT_TAG_NAME} --notes ${SEMAPHORE_GIT_TAG_NAME} - - ./script/deploy.sh + - echo "Do nothing" diff --git a/internal/release/release.go b/internal/release/release.go index d27eed270..d011982ac 100644 --- a/internal/release/release.go +++ b/internal/release/release.go @@ -25,14 +25,22 @@ func main() { ParseFiles("./.goreleaser.yml.tmpl"), ) - outputPath := path.Join(os.TempDir(), fmt.Sprintf(".goreleaser_%s.yml", goos)) + goarch := "" + outputFileName := fmt.Sprintf(".goreleaser_%s.yml", goos) + if strings.Contains(goos, "-") { + split := strings.Split(goos, "-") + goos = split[0] + goarch = split[1] + } + + outputPath := path.Join(os.TempDir(), outputFileName) output, err := os.Create(outputPath) if err != nil { log.Fatal(err) } - err = tmpl.Execute(output, map[string]string{"GOOS": goos}) + err = tmpl.Execute(output, map[string]string{"GOOS": goos, "GOARCH": goarch}) if err != nil { log.Fatal(err) } diff --git a/script/deploy.sh b/script/deploy.sh index 3c16b7446..0233235c2 100755 --- a/script/deploy.sh +++ b/script/deploy.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -e -if [ -n "${SEMAPHORE_GIT_TAG_NAME}" ]; then +if [ -n "${VERSION}" ]; then echo "Deploying..." else echo "Skipping deploy" @@ -13,8 +13,8 @@ git config --global user.name "Traefiker" # load ssh key eval "$(ssh-agent -s)" -chmod 600 /home/semaphore/.ssh/traefiker_rsa -ssh-add /home/semaphore/.ssh/traefiker_rsa +chmod 600 ~/.ssh/traefiker_rsa +ssh-add ~/.ssh/traefiker_rsa # update traefik-library-image repo (official Docker image) echo "Updating traefik-library-imag repo..."