diff --git a/builder/builder.go b/builder/builder.go index 13dc055..6fd20a2 100644 --- a/builder/builder.go +++ b/builder/builder.go @@ -305,6 +305,8 @@ func (h *HeighlinerBuilder) buildChainNodeDockerImage( targetLibraries := strings.Join(chainConfig.Build.TargetLibraries, " ") + directories := strings.Join(chainConfig.Build.Directories, " ") + repoHost := chainConfig.Build.RepoHost if repoHost == "" { repoHost = "github.com" @@ -357,7 +359,9 @@ func (h *HeighlinerBuilder) buildChainNodeDockerImage( "BINARIES": binaries, "LIBRARIES": libraries, "TARGET_LIBRARIES": targetLibraries, + "DIRECTORIES": directories, "PRE_BUILD": chainConfig.Build.PreBuild, + "FINAL_IMAGE": chainConfig.Build.FinalImage, "BUILD_ENV": buildEnv, "BUILD_TAGS": buildTagsEnvVar, "BUILD_DIR": chainConfig.Build.BuildDir, diff --git a/builder/types.go b/builder/types.go index db20918..ac3df81 100644 --- a/builder/types.go +++ b/builder/types.go @@ -27,10 +27,12 @@ type ChainNodeConfig struct { Language DockerfileType `yaml:"language"` // DEPRECATED, use "dockerfile" instead Dockerfile DockerfileType `yaml:"dockerfile"` BuildTarget string `yaml:"build-target"` + FinalImage string `yaml:"final-image"` BuildDir string `yaml:"build-dir"` Binaries []string `yaml:"binaries"` Libraries []string `yaml:"libraries"` TargetLibraries []string `yaml:"target-libraries"` + Directories []string `yaml:"directories"` PreBuild string `yaml:"pre-build"` Platforms []string `yaml:"platforms"` BuildEnv []string `yaml:"build-env"` diff --git a/chains.yaml b/chains.yaml index e84ddf6..bd8b7cb 100644 --- a/chains.yaml +++ b/chains.yaml @@ -11,8 +11,79 @@ # Agoric-sdk - name: agoric - dockerfile: imported - base-image: ghcr.io/agoric/agoric-sdk + dockerfile: cargo + github-organization: Agoric + github-repo: agoric-sdk + build-env: + - LEDGER_ENABLED=false + - BUILD_TAGS=muslc + pre-build: | + apt update && apt install -y python3 g++ + + curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash + export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")" + [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm + nvm install 18 + npm i -g yarn + + set -eux + cd golang/cosmos + export GOOS=linux GOARCH=${TARGETARCH} + npm install node-addon-api --legacy-peer-deps + # make -j$(nproc) + + COMMIT=$(git log -1 --format='%H') + + COMMON_LDFLAGS="-X github.com/cosmos/cosmos-sdk/version.Name=agoric \ + -X github.com/cosmos/cosmos-sdk/version.AppName=agd \ + -X github.com/cosmos/cosmos-sdk/version.Version=$VERSION \ + -X "github.com/cosmos/cosmos-sdk/version.BuildTags=$BUILD_TAGS" \ + -X github.com/cosmos/cosmos-sdk/version.Commit=$COMMIT" + + # Build daemon lib + go build -v -mod=readonly -tags "$BUILD_TAGS" -ldflags "$COMMON_LDFLAGS" -buildmode=c-shared -o build/libagcosmosdaemon.so ./cmd/libdaemon/main.go + + # Build helper + LDFLAGS_HELPER="$COMMON_LDFLAGS -X github.com/cosmos/cosmos-sdk/version.AppName=ag-cosmos-helper" + go build -v -mod=readonly -tags "$BUILD_TAGS" -ldflags "$LDFLAGS_HELPER" -o ../../bin/ag-cosmos-helper ./cmd/helper + + # Build agd + go build -v -mod=readonly -tags "$BUILD_TAGS" -ldflags "$COMMON_LDFLAGS" -o ../../bin/agd ./cmd/agd + + # Build node deps + make node-compile-gyp + cd ../../packages + rm -rf ui-components web-components wallet-connection wallet web-components + cd .. + npm i -g yarn + yarn + yarn build + + # Move to final location + mkdir /agoric-sdk + mv packages node_modules bin golang /agoric-sdk + directories: + - /agoric-sdk + - /root/.nvm/versions/node + libraries: + - /agoric-sdk/golang/cosmos/build/libagcosmosdaemon.so + target-libraries: + - /lib/${ARCH}-linux-gnu/libdl.so.2 + - /lib/${ARCH}-linux-gnu/libm.so.6 + - /usr/lib/${ARCH}-linux-gnu/libstdc++.so.6 + - /usr/lib/gcc/${ARCH}-linux-gnu/10/libgcc_s.so + - /lib/${ARCH}-linux-gnu/libgcc_s.so.1 + final-image: | + set -eux + ln -s /agoric-sdk/bin/agd /bin/agd + ln -s /agoric-sdk/bin/ag-cosmos-helper /bin/ag-cosmos-helper + ln -s /agoric-sdk/packages/cosmic-swingset/bin/ag-chain-cosmos /bin/ag-chain-cosmos + ln -s /agoric-sdk/packages/cosmic-swingset/bin/ag-nchainz /bin/ag-nchainz + mkdir -p /go/src/github.com/strangelove-ventures/agoric-sdk/golang/cosmos/build /build/agoric-sdk/golang/cosmos/build + mv /agoric-sdk/golang/cosmos/build/libagcosmosdaemon.so /go/src/github.com/strangelove-ventures/agoric-sdk/golang/cosmos/build/ + ln -s /go/src/github.com/strangelove-ventures/agoric-sdk/golang/cosmos/build/libagcosmosdaemon.so /build/agoric-sdk/golang/cosmos/build/libagcosmosdaemon.so + ln -s /root/.nvm/versions/node/*/bin/node /bin/node + # Akash - name: akash diff --git a/dockerfile/cargo/Dockerfile b/dockerfile/cargo/Dockerfile index 71227e5..c26f81f 100644 --- a/dockerfile/cargo/Dockerfile +++ b/dockerfile/cargo/Dockerfile @@ -203,6 +203,19 @@ RUN bash -c 'set -eux;\ fi;\ done' +# Copy over directories +RUN mkdir -p /root/dir_abs && touch /root/dir_abs.list +ARG DIRECTORIES +ENV DIRECTORIES_ENV ${DIRECTORIES} +RUN bash -c 'set -eux;\ + DIRECTORIES_ARR=($DIRECTORIES_ENV);\ + i=0;\ + for DIRECTORY in "${DIRECTORIES_ARR[@]}"; do \ + cp -R $DIRECTORY /root/dir_abs/$i;\ + echo $DIRECTORY >> /root/dir_abs.list;\ + ((i = i + 1));\ + done' + # Build final image from scratch FROM scratch @@ -266,6 +279,24 @@ RUN sh -c 'i=0; while read FILE; do\ i=$((i+1));\ done < /root/lib_abs.list' +# Copy over absolute path directories +COPY --from=build-env /root/dir_abs /root/dir_abs +COPY --from=build-env /root/dir_abs.list /root/dir_abs.list + +# Move absolute path directories to their absolute locations. +RUN sh -c 'i=0; while read DIR; do\ + echo "$i: $DIR";\ + PLACEDIR="$(dirname "$DIR")";\ + mkdir -p "$PLACEDIR";\ + mv /root/dir_abs/$i $DIR;\ + i=$((i+1));\ + done < /root/dir_abs.list' + +RUN mkdir -p /usr/bin && ln -s /bin/env /usr/bin/env + +ARG FINAL_IMAGE +RUN if [ ! -z "$FINAL_IMAGE" ]; then sh -c "$FINAL_IMAGE"; fi + # Remove write utils used to construct image and tmp dir/file for lib copy. RUN rm -rf ln rm mv mkdir dirname /root/lib_abs /root/lib_abs.list diff --git a/dockerfile/cargo/native.Dockerfile b/dockerfile/cargo/native.Dockerfile index 862cd80..785f6f3 100644 --- a/dockerfile/cargo/native.Dockerfile +++ b/dockerfile/cargo/native.Dockerfile @@ -146,6 +146,19 @@ RUN bash -c 'set -eux;\ fi;\ done' +# Copy over directories +RUN mkdir -p /root/dir_abs && touch /root/dir_abs.list +ARG DIRECTORIES +ENV DIRECTORIES_ENV ${DIRECTORIES} +RUN bash -c 'set -eux;\ + DIRECTORIES_ARR=($DIRECTORIES_ENV);\ + i=0;\ + for DIRECTORY in "${DIRECTORIES_ARR[@]}"; do \ + cp -R $DIRECTORY /root/dir_abs/$i;\ + echo $DIRECTORY >> /root/dir_abs.list;\ + ((i = i + 1));\ + done' + # Use minimal busybox from infra-toolkit image for final scratch image FROM ghcr.io/strangelove-ventures/infra-toolkit:v0.0.7 AS infra-toolkit RUN addgroup --gid 1025 -S heighliner && adduser --uid 1025 -S heighliner -G heighliner @@ -216,6 +229,24 @@ RUN sh -c 'i=0; while read FILE; do\ i=$((i+1));\ done < /root/lib_abs.list' +# Copy over absolute path directories +COPY --from=build-env /root/dir_abs /root/dir_abs +COPY --from=build-env /root/dir_abs.list /root/dir_abs.list + +# Move absolute path directories to their absolute locations. +RUN sh -c 'i=0; while read DIR; do\ + echo "$i: $DIR";\ + PLACEDIR="$(dirname "$DIR")";\ + mkdir -p "$PLACEDIR";\ + mv /root/dir_abs/$i $DIR;\ + i=$((i+1));\ + done < /root/dir_abs.list' + +RUN mkdir -p /usr/bin && ln -s /bin/env /usr/bin/env + +ARG FINAL_IMAGE +RUN if [ ! -z "$FINAL_IMAGE" ]; then sh -c "$FINAL_IMAGE"; fi + # Remove write utils used to construct image and tmp dir/file for lib copy. RUN rm -rf ln rm mv mkdir dirname /root/lib_abs /root/lib_abs.list