diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 89246065..1c268cb3 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -1,10 +1,7 @@ -name: Build & Push +name: Push Docker Images # Build & Push builds the finschia docker image on every tag push on: - pull_request: - branches: - - main push: tags: - "v[0-9]+.[0-9]+.[0-9]+" # Push events to matching v*, i.e. v1.0, v20.15.10 @@ -12,16 +9,20 @@ on: env: registry: docker.io - repository: finschia/finschianode + DOCKER_REPOSITORY: finschia/finschianode + RUNNER_BASE_IMAGE_ALPINE: alpine:3.17 jobs: - build: + docker_build_and_push: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - name: Check out the repo + uses: actions/checkout@v3 with: fetch-depth: 0 + - name: Create a context for buildx run: docker context create buildx + - name: Set up docker buildx id: buildx uses: docker/setup-buildx-action@v2 @@ -29,25 +30,59 @@ jobs: endpoint: buildx config-inline: | [registry."docker.io"] - - name: login to the registry + + - name: Login to the registry uses: docker/login-action@v2 - if: github.event_name != 'pull_request' with: registry: ${{env.registry}} username: ${{secrets.DOCKERHUB_USERNAME}} password: ${{secrets.DOCKERHUB_TOKEN}} - - name: extract metadata for docker + + - name: Find go version + id: find_go_version + run: | + GO_VERSION=$(cat go.mod | grep -E 'go [0-9].[0-9]+' | cut -d ' ' -f 2) + echo "GO_VERSION=$GO_VERSION" >> $GITHUB_ENV + + - name: Find Ostracon version + id: find_ostracon_version + run: | + OST_VERSION=$(go list -m github.com/Finschia/ostracon | sed 's:.* ::') + echo "OST_VERSION=$OST_VERSION" >> $GITHUB_ENV + + - name: Parse tag + id: tag + run: | + ref='refs/tags/' + if [[ ${{ github.ref }} == *${ref}* ]]; then + VERSION=$(echo ${{ github.ref_name }} | sed "s/v//") + echo "VERSION=$VERSION" >> $GITHUB_ENV + else + echo "VERSION=${{ github.sha }}" >> $GITHUB_ENV + fi + + - name: Extract metadata for docker id: meta uses: docker/metadata-action@v4 with: - images: ${{env.registry}}/${{env.repository}} + images: ${{env.registry}}/${{env.DOCKER_REPOSITORY}} tags: | type=semver,pattern={{version}} - - name: docker build + + # Build Docker image + - name: Build and push uses: docker/build-push-action@v4 with: - push: ${{github.event_name != 'pull_request'}} - build-args: ARCH=x86_64 - tags: ${{steps.meta.outputs.tags}} + file: Dockerfile + context: . + push: true + platforms: linux/amd64,linux/arm64 + build-args: | + GO_VERSION=${{ env.GO_VERSION }} + RUNNER_IMAGE=${{ env.RUNNER_BASE_IMAGE_ALPINE }} + GIT_VERSION=${{ env.VERSION }} + GIT_COMMIT=${{ github.sha }} + OST_VERSION=${{ env.OST_VERSION }} + tags: | + ${{ env.DOCKER_REPOSITORY }}:${{ env.VERSION }} labels: ${{steps.meta.outputs.labels}} - platforms: linux/amd64 diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml index 56fd579c..86872664 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release-build.yml @@ -17,170 +17,87 @@ jobs: uses: actions/checkout@v3.1.0 - name: "Create compressed repository source" run: | - git archive --format=tar --prefix "finschia-${{ env.VERSION }}/" HEAD | gzip -9n > finschia-${{ env.VERSION }}.tgz - md5sum finschia-${{ env.VERSION }}.tgz > finschia-${{ env.VERSION }}.tgz.md5 - sha256sum finschia-${{ env.VERSION }}.tgz > finschia-${{ env.VERSION }}.tgz.sha256 + git archive --format=tar.gz --prefix="fnsad-${{ env.VERSION }}/" HEAD -o fnsad-${{ env.VERSION }}.tar.gz - name: "Store compressed source" uses: actions/upload-artifact@v3 with: name: release-${{ env.VERSION }} path: | - finschia-${{ env.VERSION }}.tgz - finschia-${{ env.VERSION }}.tgz.md5 - finschia-${{ env.VERSION }}.tgz.sha256 + fnsad-${{ env.VERSION }}.tar.gz - build_for_linux: - name: "Release Build for Linux" - needs: create_tarball + + build_for_linux_static: + name: "Release Build for linux(static)" runs-on: ubuntu-latest strategy: matrix: arch: [ amd64, arm64 ] - include: - - arch: amd64 - cc: x86_64-linux-gnu-gcc - cxx: x86_64-linux-gnu-g++ - libwasmvm: libwasmvm.x86_64.so - - arch: arm64 - cc: aarch64-linux-gnu-gcc - cxx: aarch64-linux-gnu-g++ - libwasmvm: libwasmvm.aarch64.so + steps: - - name: "Set tag as version" + - name: Set tag as version run: echo "VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV # set env.VERSION=v0.0.0 - - name: "Update runtime" - run: | - sudo apt update - sudo apt upgrade -y - sudo apt install -y build-essential g++-x86-64-linux-gnu g++-aarch64-linux-gnu wget - - name: "Install go" - uses: actions/setup-go@v4 - with: - go-version: '1.18' - check-latest: true - - name: "Print go environment for debugging" - run: go env - - name: "Download compressed repository source" - uses: actions/download-artifact@v3 + + - name: Check out the repo + uses: actions/checkout@v3 with: - name: release-${{ env.VERSION }} - - name: "Extract compressed repository source" - run: tar zxf finschia-${{ env.VERSION }}.tgz --strip-components=1 + fetch-depth: 0 - - name: "Set ID=${{ env.VERSION }}-linux-${{ matrix.arch }}" + - name: Set ID=${{ env.VERSION }}-linux-${{ matrix.arch }} run: echo "ID=${{ env.VERSION }}-linux-${{ matrix.arch }}" >> $GITHUB_ENV - - name: "Build release bundle: linux-${{ matrix.arch }}" - run: | - go env -w GOARCH=${{ matrix.arch }} - make clean build-release-bundle CC=${{ matrix.cc }} CXX=${{ matrix.cxx }} - - name: "Create checksum: linux-${{ matrix.arch }}" - run: | - cd ./build - ls -laF - md5sum finschia-${{ env.ID }}.tgz > ./finschia-${{ env.ID }}.md5 - sha256sum finschia-${{ env.ID }}.tgz > ./finschia-${{ env.ID }}.sha256 - - name: "Store artifact: linux-${{ matrix.arch }}" - uses: actions/upload-artifact@v3 - with: - name: release-${{ env.VERSION }} - path: | - ./build/finschia-${{ env.ID }}.tgz - ./build/finschia-${{ env.ID }}.md5 - ./build/finschia-${{ env.ID }}.sha256 - - build_for_darwin: - name: "Release Build for macOS" - needs: create_tarball - runs-on: macOS-latest - strategy: - matrix: - arch: [ "amd64", "arm64" ] - include: - - arch: amd64 - libwasmvm: libwasmvm.dylib - - arch: arm64 - libwasmvm: libwasmvm.dylib - steps: - - name: "Set tag as version" - run: echo "VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV # set env.VERSION=v0.0.0 - - name: "Setup Xcode" - run: sudo xcode-select --switch /Applications/Xcode.app - - name: "Install md5sum" - run: | - brew update - brew install md5sha1sum - - name: "Install go" - uses: actions/setup-go@v4 - with: - go-version: '1.18' - check-latest: true - - name: "Print go environment" - run: go env - - name: "Download compressed repository source" - uses: actions/download-artifact@v3 - with: - name: release-${{ env.VERSION }} - - name: "Extract compressed repository source" - run: tar zxf finschia-${{ env.VERSION }}.tgz --strip-components=1 - - name: "Set ID=${{ env.VERSION }}-darwin-${{ matrix.arch }}" - run: echo "ID=${{ env.VERSION }}-darwin-${{ matrix.arch }}" >> $GITHUB_ENV - - name: "Build release bundle: darwin-${{ matrix.arch }}" - run: | - go env -w GOARCH=${{ matrix.arch }} - make clean build-release-bundle - - name: "Create checksum: darwin-${{ matrix.arch }}" + - name: Compile finschia run: | + make build-reproducible-${{ matrix.arch }} cd ./build - ls -laF - md5sum finschia-${{ env.ID }}.tgz > ./finschia-${{ env.ID }}.md5 - shasum -a 256 finschia-${{ env.ID }}.tgz > ./finschia-${{ env.ID }}.sha256 - - name: "Store artifact: darwin-${{ matrix.arch }}" + mv fnsad-linux-${{ matrix.arch }} fnsad-${{ env.ID }} + + - name: Store artifact linux-${{ matrix.arch }} uses: actions/upload-artifact@v3 with: name: release-${{ env.VERSION }} path: | - ./build/finschia-${{ env.ID }}.tgz - ./build/finschia-${{ env.ID }}.md5 - ./build/finschia-${{ env.ID }}.sha256 + ./build/fnsad-${{ env.ID }} create_release: - name: "Create Release" - needs: [ build_for_linux, build_for_darwin ] + name: Create Release + needs: [ build_for_linux_static, create_tarball ] runs-on: ubuntu-latest steps: - - name: "Set tag as version" + - name: Set tag as version run: echo "VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV # set env.VERSION=v0.0.0 - - name: "Download artifacts" + - name: Download artifacts uses: actions/download-artifact@v3 with: name: release-${{ env.VERSION }} - - name: "Extract compressed repository source" - run: tar zxf finschia-${{ env.VERSION }}.tgz --strip-components=1 finschia-${{ env.VERSION }}/RELEASE_NOTE.md - - name: "List artifact files for debugging" - run: "ls -laF" - - name: "Create build report" + + - name: Extract compressed repository source + run: | + tar zxvf fnsad-${{ env.VERSION }}.tar.gz --strip-components=1 fnsad-${{ env.VERSION }}/RELEASE_NOTE.md + + - name: Create build report run: | - echo "App: finschia" > build_report.txt + echo "App: finschia" >> build_report.txt echo "Version: ${{ env.VERSION }}" >> build_report.txt echo "Commit: ${{ github.sha }}" >> build_report.txt echo "Checksums MD5:" >> build_report.txt - echo " `cat finschia-${{ env.VERSION }}-linux-amd64.md5`" >> build_report.txt - echo " `cat finschia-${{ env.VERSION }}-linux-arm64.md5`" >> build_report.txt - echo " `cat finschia-${{ env.VERSION }}.tgz.md5`" >> build_report.txt + md5sum fnsad-${{ env.VERSION }}* | sed 's/^/ /' >> build_report.txt echo "Checksums SHA256:" >> build_report.txt - echo " `cat finschia-${{ env.VERSION }}-linux-amd64.sha256`" >> build_report.txt - echo " `cat finschia-${{ env.VERSION }}-linux-arm64.sha256`" >> build_report.txt - echo " `cat finschia-${{ env.VERSION }}.tgz.sha256`" >> build_report.txt - - name: "Create release note" + sha256sum fnsad-${{ env.VERSION }}* | sed 's/^/ /' >> build_report.txt + + - name: Create sha256sum + run: | + sha256sum fnsad-${{ env.VERSION }}* >> sha256sum.txt + + - name: Create release note run: | cat ./RELEASE_NOTE.md > release_note.txt echo '' >> release_note.txt echo '```text' >> release_note.txt cat ./build_report.txt >> release_note.txt - echo '```' >> build_report.txt - - name: "Create release" + echo '```' >> release_note.txt + + - name: Create release id: create_release uses: actions/create-release@v1 env: @@ -192,48 +109,42 @@ jobs: draft: true prerelease: false - - name: "Upload artifact: finschia-${{ env.VERSION }}-linux-amd64" - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ github.token }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: finschia-${{ env.VERSION }}-linux-amd64.tgz - asset_name: finschia-${{ env.VERSION }}-linux-amd64.tgz - asset_content_type: application/octet-stream - - name: "Upload artifact: finschia-${{ env.VERSION }}-linux-arm64" + - name: Upload sha256sum uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ github.token }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: finschia-${{ env.VERSION }}-linux-arm64.tgz - asset_name: finschia-${{ env.VERSION }}-linux-arm64.tgz - asset_content_type: application/octet-stream - - name: "Upload artifact: finschia-${{ env.VERSION }}-dawrin-amd64" + asset_path: ./sha256sum.txt + asset_name: sha256sum.txt + asset_content_type: application/file + + - name: Upload linux-amd64 artifact uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ github.token }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: finschia-${{ env.VERSION }}-darwin-amd64.tgz - asset_name: finschia-${{ env.VERSION }}-darwin-amd64.tgz - asset_content_type: application/octet-stream - - name: "Upload artifact: finschia-${{ env.VERSION }}-dawrin-arm64" + asset_path: ./fnsad-${{ env.VERSION }}-linux-amd64 + asset_name: fnsad-${{ env.VERSION }}-linux-amd64 + asset_content_type: application/binary + + - name: Upload linux-arm64 artifact uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ github.token }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: finschia-${{ env.VERSION }}-darwin-arm64.tgz - asset_name: finschia-${{ env.VERSION }}-darwin-arm64.tgz - asset_content_type: application/octet-stream - - name: "Upload artifact: compressed repository source" + asset_path: ./fnsad-${{ env.VERSION }}-linux-arm64 + asset_name: fnsad-${{ env.VERSION }}-linux-arm64 + asset_content_type: application/binary + + - name: Upload compression uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ github.token }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: finschia-${{ env.VERSION }}.tgz - asset_name: finschia-${{ env.VERSION }}.tgz - asset_content_type: application/gzip + asset_path: ./fnsad-${{ env.VERSION }}.tar.gz + asset_name: fnsad-${{ env.VERSION }}.tar.gz + asset_content_type: application/gzip \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index a5df8ae1..1e3450ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### Features ### Improvements +* (build) [\#221](https://github.com/Finschia/finschia/pull/221) compile static binary as release assets and docker image * (swagger) [\#223](https://github.com/Finschia/finschia/pull/223) add integrated swagger for finschia ### Bug Fixes diff --git a/Dockerfile b/Dockerfile index a122ed77..5ba866e7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,49 +1,66 @@ +# syntax=docker/dockerfile:1 + # Simple usage with a mounted data directory: -# > docker build --platform="linux/amd64" -t finschia/finschianode . --build-arg ARCH=x86_64 +# > make docker-build # > docker run -it -p 26656:26656 -p 26657:26657 -v ~/.finschia:/root/.finschia -v finschia/finschianode fnsad init # > docker run -it -p 26656:26656 -p 26657:26657 -v ~/.finschia:/root/.finschia -v finschia/finschianode fnsad start --rpc.laddr=tcp://0.0.0.0:26657 --p2p.laddr=tcp://0.0.0.0:26656 -FROM golang:1.18-alpine AS build-env -ARG ARCH=$ARCH + +ARG GO_VERSION="1.18" +ARG RUNNER_IMAGE="alpine:3.17" + +FROM golang:${GO_VERSION}-alpine AS build-env + ARG FINSCHIA_BUILD_OPTIONS="" +ARG GIT_VERSION +ARG GIT_COMMIT +ARG OST_VERSION # Set up OS dependencies -ENV PACKAGES curl wget make cmake git libc-dev bash gcc g++ linux-headers eudev-dev python3 perl -RUN apk add --update --no-cache $PACKAGES +RUN apk add --no-cache ca-certificates build-base linux-headers curl # Set WORKDIR to finschia WORKDIR /finschia-build/finschia -# prepare dbbackend before building; this can be cached -COPY ./Makefile ./ -COPY ./contrib ./contrib -COPY ./sims.mk ./ -RUN make dbbackend FINSCHIA_BUILD_OPTIONS="$(FINSCHIA_BUILD_OPTIONS)" - # Install GO dependencies -COPY ./go.mod /finschia-build/finschia/go.mod -COPY ./go.sum /finschia-build/finschia/go.sum -RUN go mod download +COPY go.mod go.sum ./ +RUN --mount=type=cache,target=/root/.cache/go-build \ + --mount=type=cache,target=/root/go/pkg/mod \ + go mod download # Install libwasmvm.*.a -COPY ./builders/scripts/install-libwasmvm.sh ./ -RUN sh install-libwasmvm.sh && rm install-libwasmvm.sh - -RUN ln -s /lib/libwasmvm_muslc.${ARCH}.a /usr/lib/libwasmvm_muslc.a +RUN ARCH=$(uname -m) && WASMVM_VERSION=$(go list -m github.com/Finschia/wasmvm | awk '{print $2}' | grep -o 'v\d\+\.\d\+\.\d\+-\d\+\.\d\+\.\d\+') && \ + curl -L -f -o /lib/libwasmvm_muslc.a https://github.com/Finschia/wasmvm/releases/download/$WASMVM_VERSION/libwasmvm_muslc.$ARCH.a && ls -al /lib/libwasmvm_muslc.a && \ + # verify checksum + curl -L -f -o /tmp/checksums.txt https://github.com/Finschia/wasmvm/releases/download/$WASMVM_VERSION/checksums.txt && ls -al /tmp/checksums.txt && \ + sha256sum /lib/libwasmvm_muslc.a | grep $(cat /tmp/checksums.txt | grep libwasmvm_muslc.$ARCH | cut -d ' ' -f 1) # Add source files COPY . . -# Make install -RUN BUILD_TAGS=muslc make install CGO_ENABLED=1 FINSCHIA_BUILD_OPTIONS="$FINSCHIA_BUILD_OPTIONS" +# Build fnsad binary +RUN --mount=type=cache,target=/root/.cache/go-build \ + --mount=type=cache,target=/root/go/pkg/mod \ + GOWORK=off go build \ + -mod=readonly \ + -tags "netgo,ledger,muslc,goleveldb" \ + -ldflags \ + "-X github.com/Finschia/finschia-sdk/version.Name=finschia \ + -X github.com/Finschia/finschia-sdk/version.AppName=fnsad \ + -X github.com/Finschia/finschia-sdk/version.Version=${GIT_VERSION} \ + -X github.com/Finschia/finschia-sdk/version.Commit=${GIT_COMMIT} \ + -X github.com/Finschia/ostracon/version.TMCoreSemVer=${OST_VERSION} \ + -X github.com/Finschia/finschia-sdk/types.DBBackend=goleveldb \ + -X github.com/Finschia/finschia-sdk/version.BuildTags=netgo,ledger,muslc,goleveldb \ + -w -s -linkmode=external -extldflags '-Wl,-z,muldefs -static'" \ + -trimpath \ + -o /finschia-build/finschia/build/fnsad \ + /finschia-build/finschia/cmd/fnsad + # Final image -FROM alpine:edge +FROM ${RUNNER_IMAGE} WORKDIR /root -# Set up OS dependencies -RUN apk add --update --no-cache libstdc++ ca-certificates - # Copy over binaries from the build-env -COPY --from=build-env /go/bin/fnsad /usr/bin/fnsad - +COPY --from=build-env /finschia-build/finschia/build/fnsad /usr/bin/fnsad diff --git a/Makefile b/Makefile index 47f53e92..cbe0d0b1 100644 --- a/Makefile +++ b/Makefile @@ -14,6 +14,7 @@ endif PACKAGES_SIMTEST=$(shell go list ./... | grep '/simulation') LEDGER_ENABLED ?= true SDK_PACK := $(shell go list -m github.com/Finschia/finschia-sdk | sed 's/ /\@/g') +GO_VERSION := $(shell cat go.mod | grep -E 'go [0-9].[0-9]+' | cut -d ' ' -f 2) OST_VERSION := $(shell go list -m github.com/Finschia/ostracon | sed 's:.* ::') # grab everything after the space in "github.com/Finschia/ostracon v0.34.7" DOCKER := $(shell which docker) BUILDDIR ?= $(CURDIR)/build @@ -115,7 +116,7 @@ ldflags = -X github.com/Finschia/finschia-sdk/version.Name=finschia \ -X github.com/Finschia/finschia-sdk/version.Version=$(VERSION) \ -X github.com/Finschia/finschia-sdk/version.Commit=$(COMMIT) \ -X github.com/Finschia/finschia-sdk/types.DBBackend=$(DB_BACKEND) \ - -X "github.com/Finschia/finschia-sdk/version.BuildTags=$(build_tags_comma_sep)" \ + -X github.com/Finschia/finschia-sdk/version.BuildTags=$(build_tags_comma_sep) \ -X github.com/Finschia/ostracon/version.TMCoreSemVer=$(OST_VERSION) ifeq ($(LINK_STATICALLY),true) @@ -164,13 +165,6 @@ build: BUILD_ARGS=-o $(BUILDDIR)/ build: go.sum $(BUILDDIR)/ dbbackend $(LIBSODIUM_TARGET) CGO_CFLAGS=$(CGO_CFLAGS) CGO_LDFLAGS=$(CGO_LDFLAGS) CGO_ENABLED=$(CGO_ENABLED) go build -mod=readonly $(BUILD_FLAGS) $(BUILD_ARGS) ./... -build-static: go.sum $(BUILDDIR)/ - docker build -t finschia/finschianode:latest -f builders/Dockerfile.static . --build-arg ARCH=$(ARCH) --platform="$(TARGET_PLATFORM)" - -build-static-centos7: go.sum $(BUILDDIR)/ - docker build -t finschia/finschia-builder:static_centos7 -f builders/Dockerfile.static_centos7 . - docker run -it --rm -v $(shell pwd):/code -e FINSCHIA_BUILD_OPTIONS="$(FINSCHIA_BUILD_OPTIONS)" finschia/finschia-builder:static_centos7 - # USAGE: go env -w GOARCH={amd64|arm64} && make clean build-release-bundle VERSION=v0.0.0 RELEASE_BUNDLE=finschia-$(VERSION)-$(shell go env GOOS)-$(shell go env GOARCH) LIBWASMVM_VERSION=$(shell go list -m github.com/Finschia/wasmvm | awk '{print $$2}') @@ -236,8 +230,46 @@ else dbbackend: endif -build-docker: - docker build --build-arg FINSCHIA_BUILD_OPTIONS="$(FINSCHIA_BUILD_OPTIONS)" --build-arg ARCH=$(ARCH) -t finschia/finschianode . --platform="$(TARGET_PLATFORM)" +build-reproducible: build-reproducible-amd64 build-reproducible-arm64 + +build-reproducible-amd64: go.sum + mkdir -p $(BUILDDIR) + $(DOCKER) buildx create --name finschiabuilder || true + $(DOCKER) buildx use finschiabuilder + $(DOCKER) buildx build \ + --build-arg GO_VERSION=$(GO_VERSION) \ + --build-arg GIT_VERSION=$(VERSION) \ + --build-arg GIT_COMMIT=$(COMMIT) \ + --build-arg OST_VERSION=$(OST_VERSION) \ + --build-arg RUNNER_IMAGE=alpine:3.17 \ + --platform linux/amd64 \ + -t finschia/finschianode:local-amd64 \ + --load \ + -f Dockerfile . + $(DOCKER) rm -f finschiabinary || true + $(DOCKER) create -ti --name finschiabinary finschia/finschianode:local-amd64 + $(DOCKER) cp finschiabinary:/usr/bin/fnsad $(BUILDDIR)/fnsad-linux-amd64 + $(DOCKER) rm -f finschiabinary + +build-reproducible-arm64: go.sum + mkdir -p $(BUILDDIR) + $(DOCKER) buildx create --name finschiabuilder || true + $(DOCKER) buildx use finschiabuilder + $(DOCKER) buildx build \ + --build-arg GO_VERSION=$(GO_VERSION) \ + --build-arg GIT_VERSION=$(VERSION) \ + --build-arg GIT_COMMIT=$(COMMIT) \ + --build-arg OST_VERSION=$(OST_VERSION) \ + --build-arg RUNNER_IMAGE=alpine:3.17 \ + --platform linux/arm64 \ + -t finschia/finschianode:local-arm64 \ + --load \ + -f Dockerfile . + $(DOCKER) rm -f finschiabinary || true + $(DOCKER) create -ti --name finschiabinary finschia/finschianode:local-arm64 + $(DOCKER) cp finschiabinary:/usr/bin/fnsad $(BUILDDIR)/fnsad-linux-arm64 + $(DOCKER) rm -f finschiabinary + build-contract-tests-hooks: mkdir -p $(BUILDDIR) @@ -315,10 +347,28 @@ benchmark: test-integration: build @go test -mod=readonly -p 4 `go list ./cli_test/...` $(CLI_TEST_BUILD_FLAGS) -v -test-integration-multi-node: build-docker +test-integration-multi-node: docker-build @go test -mod=readonly -p 4 `go list ./cli_test/...` $(CLI_MULTI_BUILD_FLAGS) -v +############################################################################### +### Docker ### +############################################################################### + +RUNNER_BASE_IMAGE_ALPINE := alpine:3.17 + +docker-build: + @DOCKER_BUILDKIT=1 docker build \ + -t finschia/finschianode:local \ + -t finschia/finschianode:local-distroless \ + --build-arg GO_VERSION=$(GO_VERSION) \ + --build-arg RUNNER_IMAGE=$(RUNNER_BASE_IMAGE_ALPINE) \ + --build-arg GIT_VERSION=$(VERSION) \ + --build-arg GIT_COMMIT=$(COMMIT) \ + --build-arg OST_VERSION=$(OST_VERSION) \ + --platform=$(TARGET_PLATFORM) \ + -f Dockerfile . + ############################################################################### ### Linting ### ############################################################################### @@ -339,11 +389,22 @@ format: build-docker-finschianode: $(MAKE) -C networks/local +localnet-docker-build: + @DOCKER_BUILDKIT=1 docker build \ + -t finschia/finschianode:localnet \ + --build-arg GO_VERSION=$(GO_VERSION) \ + --build-arg RUNNER_IMAGE=$(RUNNER_BASE_IMAGE_ALPINE) \ + --build-arg GIT_VERSION=$(VERSION) \ + --build-arg GIT_COMMIT=$(COMMIT) \ + --build-arg OST_VERSION=$(OST_VERSION) \ + --platform=$(TARGET_PLATFORM) \ + -f builders/Dockerfile.static . + # Run a 4-node testnet locally -localnet-start: localnet-stop build-static localnet-build-nodes +localnet-start: localnet-stop localnet-docker-build localnet-build-nodes localnet-build-nodes: - docker run --rm -v $(CURDIR)/mytestnet:/data finschia/finschianode \ + docker run --rm -v $(CURDIR)/mytestnet:/data finschia/finschianode:localnet \ testnet init-files --v 4 -o /data --starting-ip-address 192.168.10.2 --keyring-backend=test docker-compose up -d diff --git a/README.md b/README.md index 1114f95f..d134558d 100644 --- a/README.md +++ b/README.md @@ -18,18 +18,18 @@ This repository hosts `Finschia`. This repository is forked from [gaia](https:// ## Docker **Build Docker Image** ``` -make build-docker # build docker image +make docker-build # build docker image ``` or ``` -make build-docker WITH_CLEVELDB=yes GITHUB_TOKEN=${YOUR_GITHUB_TOKEN} # build docker image with cleveldb +make docker-build WITH_CLEVELDB=yes GITHUB_TOKEN=${YOUR_GITHUB_TOKEN} # build docker image with cleveldb ``` _Note1_ If you are using M1 mac, you need to specify build args like this: ``` -make build-docker ARCH=aarch64 +make docker-build ARCH=aarch64 ``` **Configure** diff --git a/builders/Dockerfile.static b/builders/Dockerfile.static index bb64a7cb..f6c98b32 100644 --- a/builders/Dockerfile.static +++ b/builders/Dockerfile.static @@ -2,13 +2,19 @@ # > docker build --platform="linux/amd64" -t finschia/finschianode -f builders/Dockerfile.static . --build-arg ARCH=x86_64 # > docker run -it -p 26656:26656 -p 26657:26657 -v ~/.finschia:/root/.finschia -v finschia/finschianode fnsad init # > docker run -it -p 26656:26656 -p 26657:26657 -v ~/.finschia:/root/.finschia -v finschia/finschianode fnsad start --rpc.laddr=tcp://0.0.0.0:26657 --p2p.laddr=tcp://0.0.0.0:26656 -FROM golang:1.18-alpine AS build-env + +ARG GO_VERSION="1.18" +ARG RUNNER_IMAGE="alpine:3.17" + +FROM golang:${GO_VERSION}-alpine AS build-env + ARG FINSCHIA_BUILD_OPTIONS="" -ARG ARCH=$ARCH +ARG GIT_VERSION +ARG GIT_COMMIT +ARG OST_VERSION # Set up OS dependencies -ENV PACKAGES curl wget make cmake git libc-dev bash gcc g++ linux-headers eudev-dev python3 perl -RUN apk add --update --no-cache $PACKAGES +RUN apk add --no-cache ca-certificates build-base linux-headers curl # Set WORKDIR to finschia WORKDIR /finschia-build/finschia @@ -16,33 +22,50 @@ WORKDIR /finschia-build/finschia #COPY ./Makefile ./ #COPY ./contrib ./contrib #COPY ./sims.mk ./ -COPY ./go.mod /finschia-build/finschia/go.mod -COPY ./go.sum /finschia-build/finschia/go.sum - # Install GO dependencies -RUN go mod download +COPY go.mod go.sum ./ +RUN --mount=type=cache,target=/root/.cache/go-build \ + --mount=type=cache,target=/root/go/pkg/mod \ + go mod download # Install libwasmvm.*.a -COPY ./builders/scripts/install-libwasmvm.sh ./ -RUN sh install-libwasmvm.sh && rm install-libwasmvm.sh - -RUN ln -s /lib/libwasmvm_muslc.${ARCH}.a /usr/lib/libwasmvm_muslc.a +RUN ARCH=$(uname -m) && WASMVM_VERSION=$(go list -m github.com/Finschia/wasmvm | awk '{print $2}' | grep -o 'v\d\+\.\d\+\.\d\+-\d\+\.\d\+\.\d\+') && \ + curl -L -f -o /lib/libwasmvm_muslc.a https://github.com/Finschia/wasmvm/releases/download/$WASMVM_VERSION/libwasmvm_muslc.$ARCH.a && ls -al /lib/libwasmvm_muslc.a && \ + # verify checksum + curl -L -f -o /tmp/checksums.txt https://github.com/Finschia/wasmvm/releases/download/$WASMVM_VERSION/checksums.txt && ls -al /tmp/checksums.txt && \ + sha256sum /lib/libwasmvm_muslc.a | grep $(cat /tmp/checksums.txt | grep libwasmvm_muslc.$ARCH | cut -d ' ' -f 1) # Add source files COPY . . # prepare dbbackend before building; this can be cached -RUN make dbbackend FINSCHIA_BUILD_OPTIONS="$FINSCHIA_BUILD_OPTIONS" +#RUN make dbbackend FINSCHIA_BUILD_OPTIONS="$FINSCHIA_BUILD_OPTIONS" -# Make install -RUN BUILD_TAGS=muslc make build CGO_ENABLED=1 +# Build fnsad binary +RUN --mount=type=cache,target=/root/.cache/go-build \ + --mount=type=cache,target=/root/go/pkg/mod \ + GOWORK=off go build \ + -mod=readonly \ + -tags "netgo,ledger,muslc,goleveldb" \ + -ldflags \ + "-X github.com/Finschia/finschia-sdk/version.Name=finschia \ + -X github.com/Finschia/finschia-sdk/version.AppName=fnsad \ + -X github.com/Finschia/finschia-sdk/version.Version=${GIT_VERSION} \ + -X github.com/Finschia/finschia-sdk/version.Commit=${GIT_COMMIT} \ + -X github.com/Finschia/ostracon/version.TMCoreSemVer=${OST_VERSION} \ + -X github.com/Finschia/finschia-sdk/types.DBBackend=goleveldb \ + -X github.com/Finschia/finschia-sdk/version.BuildTags=netgo,ledger,muslc,goleveldb \ + -w -s -linkmode=external -extldflags '-Wl,-z,muldefs -static'" \ + -trimpath \ + -o /finschia-build/finschia/build/fnsad \ + /finschia-build/finschia/cmd/fnsad # Final image -FROM alpine:edge +FROM ${RUNNER_IMAGE} # Set up OS dependencies -RUN apk add --update --no-cache libstdc++ ca-certificates +#RUN apk add --update --no-cache libstdc++ ca-certificates COPY networks/local/finschianode/wrapper.sh /usr/bin/wrapper.sh VOLUME /finschia @@ -53,4 +76,4 @@ WORKDIR /finschia EXPOSE 26656 26657 ENTRYPOINT ["/usr/bin/wrapper.sh"] CMD ["start"] -STOPSIGNAL SIGTERM +STOPSIGNAL SIGTERM \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index bacf4127..6c95c1b1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,7 +3,7 @@ version: '3' services: fnsadnode0: container_name: fnsadnode0 - image: "finschia/finschianode" + image: "finschia/finschianode:localnet" ports: - "26656-26657:26656-26657" environment: @@ -17,7 +17,7 @@ services: fnsadnode1: container_name: fnsadnode1 - image: "finschia/finschianode" + image: "finschia/finschianode:localnet" ports: - "26659-26660:26656-26657" environment: @@ -31,7 +31,7 @@ services: fnsadnode2: container_name: fnsadnode2 - image: "finschia/finschianode" + image: "finschia/finschianode:localnet" environment: - ID=2 - LOG=${LOG:-finschia.log} @@ -45,7 +45,7 @@ services: fnsadnode3: container_name: fnsadnode3 - image: "finschia/finschianode" + image: "finschia/finschianode:localnet" environment: - ID=3 - LOG=${LOG:-finschia.log}