name: Build on: pull_request: branches: - master types: [opened, synchronize] paths-ignore: - 'scripts/**' - '**/*.md' push: # Build for the master branch. branches: - master release: # Publish released commit as Docker `latest` and `git_revision` images. types: - published workflow_dispatch: inputs: ref: description: 'Ref to build CLI for Ubuntu and Windows Server Core [default: latest master; examples: v0.92.0, 0a4ff9d3e4a9ab432fd5812eb18c98e03b5a7432]' required: false default: '' push_image: description: 'Push images to DockerHub [default: false; examples: true, false]' required: false default: 'false' use_latest_tag: description: 'Use `latest` tag while pushing images to DockerHub (applied to Ubuntu image only) [default: false; examples: true, false]' required: false default: 'false' jobs: build_cli: name: Build CLI runs-on: ${{matrix.os.name}} strategy: matrix: os: [{ name: ubuntu-20.04, bin-name: linux }, { name: windows-2022, bin-name: windows }, { name: macos-12, bin-name: darwin }] arch: [amd64, arm64] exclude: - os: { name: windows-2022, bin-name: windows } arch: 'arm64' steps: - uses: actions/checkout@v4 with: ref: ${{ github.event.inputs.ref }} # Allows to fetch all history for all branches and tags. Need this for proper versioning. fetch-depth: 0 - name: Set up Go uses: actions/setup-go@v5 with: go-version: '1.21' cache: true - name: Update Go modules run: go mod download -json - name: Build CLI run: make build env: GOARCH: ${{ matrix.arch }} - name: Rename CLI binary run: mv ./bin/neo-go* ./bin/neo-go-${{ matrix.os.bin-name }}-${{ matrix.arch }}${{ (matrix.os.bin-name == 'windows' && '.exe') || '' }} - name: Upload artifact uses: actions/upload-artifact@v4 with: name: neo-go-${{ matrix.os.bin-name }}-${{ matrix.arch }} path: ./bin/neo-go* if-no-files-found: error - name: Attach binary to the release as an asset if: ${{ github.event_name == 'release' }} run: gh release upload ${{ github.event.release.tag_name }} ./bin/neo-go-${{ matrix.os.bin-name }}-${{ matrix.arch }}${{ (matrix.os.bin-name == 'windows' && '.exe') || '' }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} build_image: needs: build_cli name: Build and push docker image runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v4 with: ref: ${{ github.event.inputs.ref }} fetch-depth: 0 - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to DockerHub if: ${{ github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && github.event.inputs.push_image == 'true') }} uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - name: Set vars id: setvars run: make gh-docker-vars >> $GITHUB_OUTPUT - name: Set latest tag id: setlatest if: ${{ (github.event_name == 'release' && github.event.release.target_commitish == 'master') || (github.event_name == 'workflow_dispatch' && github.event.inputs.use_latest_tag == 'true') }} run: echo "latest=,${{ steps.setvars.outputs.repo }}:latest" >> $GITHUB_OUTPUT - name: Build and push uses: docker/build-push-action@v5 with: context: . push: ${{ github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && github.event.inputs.push_image == 'true') }} platforms: linux/amd64,linux/arm64 build-args: | REPO=github.com/${{ github.repository }} VERSION=${{ steps.setvars.outputs.version }} tags: ${{ steps.setvars.outputs.repo }}:${{ steps.setvars.outputs.version }}${{ steps.setvars.outputs.suffix }}${{ steps.setlatest.outputs.latest }} build_image_wsc: needs: build_cli name: Build and push docker image (Windows Server Core) runs-on: windows-2022 steps: - uses: actions/checkout@v4 with: ref: ${{ github.event.inputs.ref }} fetch-depth: 0 # For proper `deps` make target execution. - name: Set up Go uses: actions/setup-go@v5 with: go-version: '1.21' cache: true - name: Login to DockerHub if: ${{ github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && github.event.inputs.push_image == 'true') }} uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - name: Build Docker image run: make image - name: Push image to registry if: ${{ github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && github.event.inputs.push_image == 'true') }} run: make image-push