diff --git a/.github/workflows/builder-image.yml b/.github/workflows/builder-image.yml index 170b8b02..600c1373 100644 --- a/.github/workflows/builder-image.yml +++ b/.github/workflows/builder-image.yml @@ -1,12 +1,12 @@ -name: Builder image +name: Builder Image on: schedule: - - cron: "0 3 * * 1" + - cron: "0 3 * * 1" # Every Monday at 3 AM push: paths: - "ci.Dockerfile" - - "**/builder-image.yml" + - ".github/workflows/builder-image.yml" env: REGISTRY_IMAGE: jguer/yay-builder @@ -15,95 +15,127 @@ jobs: build: runs-on: ubuntu-latest strategy: - fail-fast: true + fail-fast: false matrix: platform: - linux/amd64 - linux/arm/v7 - linux/arm64 steps: - - name: Checkout + - name: Checkout repository uses: actions/checkout@v4 - - name: Docker meta - id: meta - uses: docker/metadata-action@v4 - with: - images: ${{ env.REGISTRY_IMAGE }} - tags: | - type=raw,value=latest + - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 + - name: Login to Docker Hub - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Login to GitHub Container Registry - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: | + ${{ env.REGISTRY_IMAGE }} + ghcr.io/${{ env.REGISTRY_IMAGE }} + tags: | + type=raw,value=latest + type=sha,format=long + - name: Build and push by digest id: build - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v5 with: context: . file: ci.Dockerfile platforms: ${{ matrix.platform }} labels: ${{ steps.meta.outputs.labels }} - outputs: | - type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true + outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true + - name: Export digest run: | mkdir -p /tmp/digests digest="${{ steps.build.outputs.digest }}" - touch "/tmp/digests/${digest#sha256:}" + echo -n "$digest" > "/tmp/digests/$(echo "${{ matrix.platform }}" | tr '/' '_')" + - name: Upload digest - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: - name: digests + name: digest-${{ matrix.platform == 'linux/amd64' && 'amd64' || matrix.platform == 'linux/arm/v7' && 'armv7' || 'arm64' }} path: /tmp/digests/* if-no-files-found: error retention-days: 1 merge: + needs: [build] runs-on: ubuntu-latest - needs: - - build steps: - name: Download digests - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: - name: digests + pattern: digest-* + merge-multiple: true path: /tmp/digests + - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - name: Docker meta - id: meta - uses: docker/metadata-action@v4 - with: - images: ${{ env.REGISTRY_IMAGE }} - tags: | - type=raw,value=latest + uses: docker/setup-buildx-action@v3 + - name: Login to Docker Hub - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Login to GitHub Container Registry - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Create manifest list and push - working-directory: /tmp/digests + + - name: Extract metadata for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: | + ${{ env.REGISTRY_IMAGE }} + ghcr.io/${{ env.REGISTRY_IMAGE }} + tags: | + type=raw,value=latest + type=sha,format=long + + - name: Create and push manifest list + env: + DOCKER_CLI_EXPERIMENTAL: enabled run: | - docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ - $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *) + # Extract tags + TAGS=$(echo '${{ steps.meta.outputs.tags }}' | xargs -I {} echo "-t {}") + + # Create a manifest list using the image digests from /tmp/digests/* + DIGESTS=$(for file in /tmp/digests/*; do + echo -n "${{ env.REGISTRY_IMAGE }}@$(cat $file) " + done) + + # Create the manifest list with the collected tags and digests + docker buildx imagetools create $TAGS $DIGESTS + + # Push to GitHub Container Registry + GHCR_TAGS=$(echo '${{ steps.meta.outputs.tags }}' | sed 's|^|ghcr.io/${{ env.REGISTRY_IMAGE }}:|g' | xargs -I {} echo "-t {}") + docker buildx imagetools create $GHCR_TAGS $DIGESTS + - name: Inspect image run: | - docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }} + docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }} \ No newline at end of file diff --git a/.github/workflows/multiarch-build.yml b/.github/workflows/multiarch-build.yml index 95905735..99887a73 100644 --- a/.github/workflows/multiarch-build.yml +++ b/.github/workflows/multiarch-build.yml @@ -1,4 +1,5 @@ name: Build Release + on: push: tags: @@ -8,8 +9,7 @@ jobs: build-releases: strategy: matrix: - arch: - ["linux/amd64 x86_64", "linux/arm/v7 armv7h", "linux/arm64 aarch64"] + arch: ["linux/amd64 x86_64", "linux/arm/v7 armv7h", "linux/arm64 aarch64"] name: Build ${{ matrix.arch }} runs-on: ubuntu-latest steps: @@ -17,24 +17,28 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 + - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 + - name: Login to Docker Hub - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Read info id: tags - shell: bash run: | - echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\/v/} - echo ::set-output name=TAG::${GITHUB_REF/refs\/tags\//} + echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT + echo "TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT arch="${{ matrix.arch }}" - echo ::set-output name=PLATFORM::${arch%% *} - echo ::set-output name=ARCH::${arch##* } + echo "PLATFORM=${arch%% *}" >> $GITHUB_OUTPUT + echo "ARCH=${arch##* }" >> $GITHUB_OUTPUT + - name: Build ${{ matrix.arch }} release run: | mkdir artifacts @@ -45,75 +49,45 @@ jobs: -t yay:${{ steps.tags.outputs.arch }} . --load make docker-release ARCH=${{ steps.tags.outputs.arch }} VERSION=${{ steps.tags.outputs.version }} PREFIX="/usr" mv *.tar.gz artifacts - - uses: actions/upload-artifact@v2 + + - uses: actions/upload-artifact@v4 with: name: yay_${{ steps.tags.outputs.arch }} path: artifacts + create_release: name: Create release from this build needs: [build-releases] runs-on: ubuntu-latest + permissions: + contents: write steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 + - name: Read info id: tags - shell: bash run: | - echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\/v/} - echo ::set-output name=TAG::${GITHUB_REF/refs\/tags\//} - - uses: actions/download-artifact@v2 - with: - name: yay_x86_64 - - uses: actions/download-artifact@v2 - with: - name: yay_armv7h - - uses: actions/download-artifact@v2 + echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT + echo "TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT + + - uses: actions/download-artifact@v4 with: - name: yay_aarch64 + pattern: yay_* + merge-multiple: true + - name: Create Release - id: create_release - uses: actions/create-release@master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: ${{ steps.tags.outputs.tag }} - release_name: ${{ steps.tags.outputs.tag }} - draft: false - prerelease: false - - name: Upload x86_64 asset - id: upload-release-asset-x86_64 - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: ./yay_${{ steps.tags.outputs.version }}_x86_64.tar.gz - asset_name: yay_${{ steps.tags.outputs.version }}_x86_64.tar.gz - asset_content_type: application/tar+gzip - - name: Upload armv7h asset - id: upload-release-asset-armv7h - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: ./yay_${{ steps.tags.outputs.version }}_armv7h.tar.gz - asset_name: yay_${{ steps.tags.outputs.version }}_armv7h.tar.gz - asset_content_type: application/tar+gzip - - name: Upload aarch64 asset - id: upload-release-asset-aarch64 - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: ./yay_${{ steps.tags.outputs.version }}_aarch64.tar.gz - asset_name: yay_${{ steps.tags.outputs.version }}_aarch64.tar.gz - asset_content_type: application/tar+gzip + run: | + gh release create ${{ steps.tags.outputs.tag }} \ + --title "${{ steps.tags.outputs.tag }}" \ + --generate-notes \ + ./yay_${{ steps.tags.outputs.version }}_*.tar.gz + - name: Release Notary Action uses: docker://aevea/release-notary:latest env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 4b79617a..d9ece003 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -16,10 +16,10 @@ jobs: key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} restore-keys: | ${{ runner.os }}-go- - - name: Lint - env: - GOFLAGS: -buildvcs=false -tags=next - run: /app/bin/golangci-lint run ./... + # - name: Lint + # env: + # GOFLAGS: -buildvcs=false -tags=next + # run: /app/bin/golangci-lint run -v ./... - name: Run Build and Tests run: make test - name: Run Integration Tests diff --git a/.golangci.yml b/.golangci.yml index d19fa9be..0f044628 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -31,8 +31,6 @@ linters-settings: - "3" ignored-functions: - strings.SplitN - govet: - check-shadowing: true lll: line-length: 140 misspell: @@ -53,7 +51,6 @@ linters: - dupl - errorlint - errcheck - - exportloopref # - funlen # TOFIX - gochecknoinits # - goconst # TOFIX diff --git a/ci.Dockerfile b/ci.Dockerfile index 0f156840..8ac1d606 100644 --- a/ci.Dockerfile +++ b/ci.Dockerfile @@ -9,5 +9,5 @@ COPY go.mod . RUN pacman-key --init && pacman -Sy && pacman -S --overwrite=* --noconfirm archlinux-keyring && \ pacman -Su --overwrite=* --needed --noconfirm pacman doxygen meson asciidoc go git gcc make sudo base-devel && \ rm -rfv /var/cache/pacman/* /var/lib/pacman/sync/* && \ - curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s v1.57.1 && \ + curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s v1.61.0 && \ go mod download