diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b3ae3d31..a2ce0992 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -4,12 +4,50 @@ on: push: branches: - main + tags: + - v* pull_request: permissions: contents: read jobs: + build: + name: Build + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version: 1.22.x + - name: Build + run: make build + - name: Check command examples + run: | + # shellcheck disable=SC2016 + ./gojq -Rsr 'scan("```sh\n( \\$ .*?)```"; "m")[] | + gsub(" +#.*"; "") | splits(" \\$ ") | + capture("(?.+?)\n(?.+)"; "m") | + "if diff <(printf %s \(.output | @sh)) \\ + <(\(.command | gsub("gojq"; "./gojq")) 2>&1); then + echo ok: \(.command | @sh) + else + echo ng: \(.command | @sh); exit 1 + fi" + ' README.md | bash + shell: bash + - name: Cross build + run: make cross + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: goxz + path: goxz + - name: Clean + run: make clean + test: name: Test runs-on: ${{ matrix.os }} @@ -37,16 +75,72 @@ jobs: - name: Check go generate run: go generate && ! git diff | grep ^ shell: bash - - name: Check command examples in README.md - run: | - ./gojq -Rsr 'scan("```sh\n( \\$ .*?)```"; "m")[] | - gsub(" +#.*"; "") | splits(" \\$ ") | - capture("(?.+?)\n(?.+)"; "m") | - "if diff <(printf %s \(.output | @sh)) \\ - <(\(.command | gsub("gojq"; "./gojq")) 2>&1); then - echo ok: \(.command | @sh) - else - echo ng: \(.command | @sh); exit 1 - fi" - ' README.md | bash - shell: bash + + docker: + name: Docker + permissions: + packages: write + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: Docker metadata + uses: docker/metadata-action@v5 + id: metadata + with: + images: | + ${{ github.repository }} + ghcr.io/${{ github.repository }} + tags: | + type=semver,pattern={{version}},enable=${{ startsWith(github.ref, 'refs/tags/v') }} + type=semver,pattern={{major}}.{{minor}},enable=${{ startsWith(github.ref, 'refs/tags/v') }} + type=semver,pattern={{major}},enable=${{ startsWith(github.ref, 'refs/tags/v') }} + type=sha,format=long,enable=${{ !startsWith(github.ref, 'refs/tags/v') }} + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ vars.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Build and release Docker image + uses: docker/build-push-action@v5 + with: + context: . + push: ${{ startsWith(github.ref, 'refs/tags/v') }} + provenance: false + platforms: linux/amd64, linux/arm64 + tags: ${{ steps.metadata.outputs.tags }} + labels: ${{ steps.metadata.outputs.labels }} + + release: + name: Release + needs: [build, test, docker] + if: startsWith(github.ref, 'refs/tags/v') + permissions: + contents: write + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: Download artifacts + uses: actions/download-artifact@v4 + with: + name: goxz + path: goxz + - name: Setup release body + run: sed -n '/\[${{ github.ref_name }}\]/,/^$/{//!p}' CHANGELOG.md >release-body.txt + - name: Create release + uses: ncipollo/release-action@v1 + with: + name: Release ${{ github.ref_name }} + bodyFile: release-body.txt + artifacts: goxz/* diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml deleted file mode 100644 index cd65f398..00000000 --- a/.github/workflows/release.yaml +++ /dev/null @@ -1,72 +0,0 @@ -name: Release - -on: - push: - tags: - - v* - -permissions: - contents: write - packages: write - -jobs: - release: - name: Release - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - - name: Setup Go - uses: actions/setup-go@v5 - with: - go-version: 1.x - - name: Cross build - run: make cross - - name: Create Release - uses: ncipollo/release-action@v1 - with: - name: Release ${{ github.ref_name }} - artifacts: goxz/* - - docker: - name: Docker - runs-on: ubuntu-latest - needs: release - steps: - - name: Checkout code - uses: actions/checkout@v4 - - name: Docker metadata - uses: docker/metadata-action@v5 - id: metadata - with: - images: | - ${{ github.repository }} - ghcr.io/${{ github.repository }} - tags: | - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - type=semver,pattern={{major}} - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ vars.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - name: Login to GitHub Container Registry - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.GITHUB_TOKEN }} - - name: Build and release Docker image - uses: docker/build-push-action@v5 - with: - context: . - push: true - provenance: false - platforms: linux/amd64, linux/arm64 - tags: ${{ steps.metadata.outputs.tags }} - labels: ${{ steps.metadata.outputs.labels }}