From 37830f11567b6537320510b9dfc11631deceb1eb Mon Sep 17 00:00:00 2001 From: Bryan Stitt Date: Sun, 5 Feb 2023 00:13:14 -0800 Subject: [PATCH] Jenkinsfile from llamanodes/erigon --- Jenkinsfile | 145 +++++++++++++++++++++--------- web3_proxy/src/rpcs/blockchain.rs | 1 + 2 files changed, 104 insertions(+), 42 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 50679b97..471b2bc7 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,42 +1,84 @@ -def amd_image -def arm_image -def intel_image -def restoreMTime() { - sh ''' +def buildAndPush() { + // env.BRANCH_NAME is set to the git branch name by default + // env.REGISTRY is the repository url for this pipeline + // env.GIT_SHORT is the git short hash of the currently checked out repo + // env.LATEST_BRANCH is the branch name that gets tagged latest + // env.ARCH is the system architecture. some apps can be generic (amd64, arm64), + // but apps that compile for specific hardware (like web3-proxy) will need more specific tags (amd64_epyc2, arm64_graviton2, intel_xeon3, etc.) + + // TODO: check that this system actually matches the given arch + sh '''#!/bin/bash + set -eux -o pipefail + + [ -n "$GIT_SHORT" ] + [ -n "$GIT_SHORT" ] + [ -n "$REGISTRY" ] + [ -n "$ARCH" ] + + # deterministic mtime on .git keeps Dockerfiles that do 'ADD . .' or similar + # without this, the build process always thinks the directory has changes git restore-mtime - touch -t $(git show -s --date=format:'%Y%m%d%H%M.%S' --format=%cd HEAD) .git + touch -t "$(git show -s --date=format:'%Y%m%d%H%M.%S' --format=%cd HEAD)" .git + + function buildAndPush { + image=$1 + buildcache=$2 + + buildctl build \ + --frontend=dockerfile.v0 \ + --local context=. \ + --local dockerfile=. \ + --output "type=image,name=${image},push=true" \ + --export-cache type=s3,region=us-east-2,bucket=llamarpc-buildctl-cache,name=${buildcache} \ + --import-cache type=s3,region=us-east-2,bucket=llamarpc-buildctl-cache,name=${buildcache} \ + ; + } + + BUILDCACHE="${REGISTRY}:buildcache_${ARCH}" + + # build and push a docker image tagged with the short git commit + buildAndPush "${REGISTRY}:git_${GIT_SHORT}_${ARCH}" "${BUILDCACHE}" + + # push an image tagged with the branch + # since buildAndPush just ran above, this should be very quick + # TODO: maybe replace slashes in the name with dashes or underscores + buildAndPush "${REGISTRY}:branch_${BRANCH_NAME}_${ARCH}" "${BUILDCACHE}" + + if [ "${BRANCH_NAME}" = "${LATEST_BRANCH}" ]; then + buildAndPush "${REGISTRY}:latest_${ARCH}" "${BUILDCACHE}" + fi ''' } - pipeline { agent any - options { - ansiColor('xterm') - } environment { - DOCKER_GIT_TAG="$AWS_ECR_URL/web3-proxy:${GIT_COMMIT.substring(0,8)}" + // AWS_ECR_URL needs to be set in jenkin's config. + // AWS_ECR_URL could really be any docker registry. we just use ECR so that we don't have to manage it + REGISTRY="${AWS_ECR_URL}/web3-proxy" + + // branch that should get tagged with "latest_$arch" (stable, main, master, etc.) + LATEST_BRANCH="stable" + + // non-buildkit builds are officially deprecated + // buildkit is much faster and handles caching much better than the default build process. DOCKER_BUILDKIT=1 + + GIT_SHORT="${GIT_COMMIT.substring(0,8)}" } stages { stage('build and push') { parallel { - stage('Build and push amd64_epyc2 image') { + stage('build and push amd64_epyc2 image') { agent { label 'amd64_epyc2' } + environment { + ARCH="amd64_epyc2" + } steps { script { - DOCKER_GIT_TAG_AMD="$DOCKER_GIT_TAG" + "_amd64_epyc2" - restoreMTime() - try { - amd_image = docker.build("$DOCKER_GIT_TAG_AMD") - } catch (e) { - def err = "amd64_epyc2 build failed: ${e}" - error(err) - } - amd_image.push() - amd_image.push('latest_amd64_epyc2') + buildAndPush() } } } @@ -44,18 +86,12 @@ pipeline { agent { label 'arm64_graviton2' } + environment { + ARCH="arm64_graviton2" + } steps { script { - DOCKER_GIT_TAG_ARM="$DOCKER_GIT_TAG" + "_arm64_graviton2" - restoreMTime() - try { - arm_image = docker.build("$DOCKER_GIT_TAG_ARM") - } catch (e) { - def err = "arm64_graviton2 build failed: ${e}" - error(err) - } - arm_image.push() - arm_image.push('latest_arm64_graviton2') + buildAndPush() } } } @@ -63,22 +99,47 @@ pipeline { agent { label 'intel_xeon3' } + environment { + ARCH="intel_xeon3" + } steps { script { - DOCKER_GIT_TAG_INTEL="$DOCKER_GIT_TAG" + "_intel_xeon3" - restoreMTime() - try { - intel_image = docker.build("$DOCKER_GIT_TAG_INTEL") - } catch (e) { - def err = "intel_xeon3 build failed: ${e}" - error(err) - } - intel_image.push() - intel_image.push('latest_intel_xeon3') + buildAndPush() } } } } + + } + stage('create (experimental) manifest') { + agent any + steps { + script { + sh '''#!/bin/bash + set -eux -o pipefail + + [ -n "$BRANCH_NAME" ] + [ -n "$GIT_SHORT" ] + [ -n "$LATEST_BRANCH" ] + [ -n "$REGISTRY" ] + + function manifest { + repo=$1 + + docker manifest create "${repo}" --amend "${repo}_arm64_graviton2" --amend "${repo}_amd64_epyc2" --amend "${repo}_intel_xeon3" + + docker manifest push --purge "${repo}" + } + + manifest "${REGISTRY}:git_${GIT_SHORT}" + manifest "${REGISTRY}:branch_${BRANCH_NAME}" + + if [ "${BRANCH_NAME}" = "${LATEST_BRANCH}" ]; then + manifest "${REGISTRY}:latest" + fi + ''' + } + } } } } diff --git a/web3_proxy/src/rpcs/blockchain.rs b/web3_proxy/src/rpcs/blockchain.rs index 20a1be0f..2e43cd5d 100644 --- a/web3_proxy/src/rpcs/blockchain.rs +++ b/web3_proxy/src/rpcs/blockchain.rs @@ -389,6 +389,7 @@ impl Web3Connections { // multiple blocks with the same fork! if consensus_saved_block.hash() == old_head_block.hash() { // no change in hash. no need to use head_block_sender + // TODO: trace level if rpc is backup debug!( "con {}{}/{}/{}/{} con={} rpc={}@{}", includes_backups_str,