diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index bc0915851..74f76e08b 100644 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -1,197 +1,192 @@ --- name: "bitcoin-abc-linux" enable_cache: true distro: "debian" suites: - "buster" architectures: - "amd64" -multiarch: -- "i386" packages: - "autoconf" - "automake" - "binutils-aarch64-linux-gnu" - "binutils-arm-linux-gnueabihf" - "binutils-gold" - "bsdmainutils" - "build-essential" - "ca-certificates" - "curl" - "faketime" - "g++-aarch64-linux-gnu" - "g++-arm-linux-gnueabihf" - "gcc-aarch64-linux-gnu" - "gcc-arm-linux-gnueabihf" - "git" - "gperf" -- "lib32stdc++-8-dev" -- "libc6-dev:i386" - "libtool" - "ninja-build" - "pkg-config" - "python3" # FIXME: these dependencies are only required to make CMake happy when building # native tools. They can be removed when the `NativeExecutable.cmake` gets # improved to avoid requiring all the bitcoin-abc dependencies. - "libboost-all-dev" - "libevent-dev" - "libssl-dev" repositories: - "distribution": "buster-backports" "source": "deb http://deb.debian.org/debian/ buster-backports main" packages: - "cmake" remotes: - "url": "https://github.com/Bitcoin-ABC/bitcoin-abc.git" "dir": "bitcoin" files: [] script: | WRAP_DIR=$HOME/wrapped - HOSTS="i686-pc-linux-gnu x86_64-linux-gnu arm-linux-gnueabihf aarch64-linux-gnu" + HOSTS="x86_64-linux-gnu arm-linux-gnueabihf aarch64-linux-gnu" # CMake toolchain file name differ from host name declare -A CMAKE_TOOLCHAIN_FILE - CMAKE_TOOLCHAIN_FILE[i686-pc-linux-gnu]=Linux32.cmake CMAKE_TOOLCHAIN_FILE[x86_64-linux-gnu]=Linux64.cmake CMAKE_TOOLCHAIN_FILE[arm-linux-gnueabihf]=LinuxARM.cmake CMAKE_TOOLCHAIN_FILE[aarch64-linux-gnu]=LinuxAArch64.cmake # Allow extra cmake option to be specified for each host declare -A CMAKE_EXTRA_OPTIONS # ARM assembly is supported but experimental, disable it for the release CMAKE_EXTRA_OPTIONS[arm-linux-gnueabihf]="-DSECP256K1_USE_ASM=OFF" INSTALL_COMPONENTS="bitcoind bitcoin-qt bitcoin-seeder" FAKETIME_HOST_PROGS="" FAKETIME_PROGS="date ar ranlib nm" HOST_CFLAGS="-O2 -g" HOST_CXXFLAGS="-O2 -g" HOST_LDFLAGS=-static-libstdc++ export QT_RCC_TEST=1 export QT_RCC_SOURCE_DATE_OVERRIDE=1 export GZIP="-9n" export TAR_OPTIONS="--mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME"" export TZ="UTC" export BUILD_DIR=`pwd` mkdir -p ${WRAP_DIR} if test -n "$GBUILD_CACHE_ENABLED"; then export SOURCES_PATH=${GBUILD_COMMON_CACHE} export BASE_CACHE=${GBUILD_PACKAGE_CACHE} mkdir -p ${BASE_CACHE} ${SOURCES_PATH} fi function create_global_faketime_wrappers { for prog in ${FAKETIME_PROGS}; do echo '#!/usr/bin/env bash' > ${WRAP_DIR}/${prog} echo "REAL=\`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1\`" >> ${WRAP_DIR}/${prog} echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${prog} echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${prog} echo "\$REAL \$@" >> $WRAP_DIR/${prog} chmod +x ${WRAP_DIR}/${prog} done } function create_per-host_faketime_wrappers { for i in $HOSTS; do for prog in ${FAKETIME_HOST_PROGS}; do echo '#!/usr/bin/env bash' > ${WRAP_DIR}/${i}-${prog} echo "REAL=\`which -a ${i}-${prog} | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog} echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${i}-${prog} echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${i}-${prog} echo "\$REAL \$@" >> $WRAP_DIR/${i}-${prog} chmod +x ${WRAP_DIR}/${i}-${prog} done done } # Faketime for depends so intermediate results are comparable export PATH_orig=${PATH} create_global_faketime_wrappers "2000-01-01 12:00:00" create_per-host_faketime_wrappers "2000-01-01 12:00:00" export PATH=${WRAP_DIR}:${PATH} cd bitcoin SOURCEDIR=`pwd` BASEPREFIX=`pwd`/depends # Build dependencies for each host for i in $HOSTS; do make ${MAKEOPTS} -C ${BASEPREFIX} HOST="${i}" done # Faketime for binaries export PATH=${PATH_orig} create_global_faketime_wrappers "${REFERENCE_DATETIME}" create_per-host_faketime_wrappers "${REFERENCE_DATETIME}" export PATH=${WRAP_DIR}:${PATH} mkdir -p source_package pushd source_package cmake -GNinja .. \ -DBUILD_BITCOIN_WALLET=OFF \ -DBUILD_BITCOIN_ZMQ=OFF \ -DBUILD_BITCOIN_SEEDER=OFF \ -DBUILD_BITCOIN_CLI=OFF \ -DBUILD_BITCOIN_TX=OFF \ -DBUILD_BITCOIN_QT=OFF \ -DBUILD_LIBBITCOINCONSENSUS=OFF \ -DENABLE_CLANG_TIDY=OFF \ -DENABLE_QRCODE=OFF \ -DENABLE_UPNP=OFF \ -DUSE_JEMALLOC=OFF ninja package_source SOURCEDIST=`echo bitcoin-abc-*.tar.gz` mv ${SOURCEDIST} .. popd DISTNAME=`echo ${SOURCEDIST} | sed 's/.tar.*//'` # Correct tar file order mkdir -p temp pushd temp tar xf ../$SOURCEDIST find bitcoin-abc-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST popd ORIGPATH="$PATH" # Extract the release tarball into a dir for each host and build for i in ${HOSTS}; do export PATH=${BASEPREFIX}/${i}/native/bin:${ORIGPATH} mkdir -p distsrc-${i} cd distsrc-${i} INSTALLPATH=`pwd`/installed/${DISTNAME} mkdir -p ${INSTALLPATH} tar --strip-components=1 -xf ../$SOURCEDIST cmake -GNinja .. \ -DCMAKE_TOOLCHAIN_FILE=${SOURCEDIR}/cmake/platforms/${CMAKE_TOOLCHAIN_FILE[${i}]} \ -DCLIENT_VERSION_IS_RELEASE=ON \ -DENABLE_CLANG_TIDY=OFF \ -DENABLE_REDUCE_EXPORTS=ON \ -DENABLE_STATIC_LIBSTDCXX=ON \ -DENABLE_GLIBC_BACK_COMPAT=ON \ -DCMAKE_INSTALL_PREFIX=${INSTALLPATH} \ -DCCACHE=OFF \ -DUSE_LD_GOLD=OFF \ ${CMAKE_EXTRA_OPTIONS[${i}]} ninja ninja security-check ninja symbol-check for _component in ${INSTALL_COMPONENTS}; do cmake -DCOMPONENT=${_component} -P cmake_install.cmake done cd installed find ${DISTNAME}/bin -type f -executable -exec ../contrib/devtools/split-debug.sh {} {} {}.dbg \; find ${DISTNAME}/lib -type f -exec ../contrib/devtools/split-debug.sh {} {} {}.dbg \; find ${DISTNAME} -not -name "*.dbg" | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}.tar.gz find ${DISTNAME} -name "*.dbg" | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}-debug.tar.gz cd ../../ rm -rf distsrc-${i} done mkdir -p $OUTDIR/src mv $SOURCEDIST $OUTDIR/src diff --git a/contrib/release/github-release.sh b/contrib/release/github-release.sh index 5e1045b61..61b0c919d 100755 --- a/contrib/release/github-release.sh +++ b/contrib/release/github-release.sh @@ -1,181 +1,180 @@ #!/usr/bin/env bash export LC_ALL=C set -euo pipefail SCRIPT_PATH="$(dirname "$0")" ORIGINAL_PWD=$(pwd) TOPLEVEL="$(cd "${SCRIPT_PATH}"; git rev-parse --show-toplevel)" OAUTH_TOKEN_PATH="${PWD}/.github-oauth-token" RELEASE_NOTES_DIR="${TOPLEVEL}/doc/release-notes" help_message() { echo "Create a draft Github release and upload binaries." echo "Usage: $0 " echo "-a, --asset-dir (required) Path to the top-level directory outputted by a Gitian build." echo " This directory must contain linux, osx, and win binaries in those respective sub-directories." echo "-d, --dry-run Run through the script, but do not touch existing tags, push to Github, or upload release files." echo "-h, --help Display this help message." echo "-o, --oauth-token Path to a file containing your OAuth token (defaults to: '${OAUTH_TOKEN_PATH}')." echo "-r, --release-notes Path to the release notes file (defaults to: '${RELEASE_NOTES_DIR}/release-notes-.md')." echo "-t, --tag (required) The git tag create a release for. This tag must already exist." } ASSET_DIR="" DRY_RUN="false" RELEASE_NOTES_PATH="" TAG="" # Parse command line arguments while [[ $# -gt 0 ]]; do case $1 in -a|--assets-dir) ASSET_DIR=$(cd $2; pwd) shift # shift past argument shift # shift past value ;; -d|--dry-run) DRY_RUN="true" shift # shift past argument ;; -h|--help) help_message exit 0 ;; -o|--oauth-token) OAUTH_TOKEN_PATH="$2" shift # shift past argument shift # shift past value ;; -r|--release-notes) RELEASE_NOTES_PATH="$2" shift # shift past argument shift # shift past value ;; -t|--tag) TAG="$2" shift # shift past argument shift # shift past value ;; *) echo "Unknown argument: $1" help_message exit 1 ;; esac done # jq must be installed if ! command -v jq > /dev/null; then echo "Error: 'jq' is not installed." exit 10 fi # Sanity checks on the release tag if [ -z "${TAG}" ]; then echo "Error: The release tag was not set. Try setting it with [ -t | --tag ]" exit 11 fi TAG_PATTERN="^v[0-9]*\.[0-9]*\.[0-9]*" if [[ ! ${TAG} =~ ${TAG_PATTERN} ]]; then echo "Error: Tag '${TAG}' does not match the expected versioning pattern '${TAG_PATTERN}'" exit 12 fi # Fetch OAuth token if [ ! -f "${OAUTH_TOKEN_PATH}" ]; then echo "Error: OAuth token file '${OAUTH_TOKEN_PATH}' does not exist" exit 13 fi OAUTH_TOKEN=$(cat "${OAUTH_TOKEN_PATH}") if [ -z "${OAUTH_TOKEN}" ]; then echo "Error: OAuth token is empty" exit 14 fi # Fetch remote tags and make sure the tag exists cd "${SCRIPT_PATH}" GIT_REPO="https://${OAUTH_TOKEN}@github.com/bitcoin-abc/bitcoin-abc.git" git fetch "${GIT_REPO}" tag "${TAG}" || (echo "Error: Remote does not have tag '${TAG}'." && exit 20) cd "${ORIGINAL_PWD}" VERSION=$(echo "${TAG}" | cut -c 2-) # Collect list of assets (binaries) to upload if [ -z "${ASSET_DIR}" ]; then echo "Error: Asset directory was not set. Try setting it with [ -a | --asset-dir ]" exit 30 fi ASSET_LIST=() if [ -d "${ASSET_DIR}" ]; then # Linux binaries ASSET_LIST+=("${ASSET_DIR}/linux/bitcoin-abc-${VERSION}-aarch64-linux-gnu.tar.gz") ASSET_LIST+=("${ASSET_DIR}/linux/bitcoin-abc-${VERSION}-arm-linux-gnueabihf.tar.gz") - ASSET_LIST+=("${ASSET_DIR}/linux/bitcoin-abc-${VERSION}-i686-pc-linux-gnu.tar.gz") ASSET_LIST+=("${ASSET_DIR}/linux/bitcoin-abc-${VERSION}-x86_64-linux-gnu.tar.gz") # OSX binaries ASSET_LIST+=("${ASSET_DIR}/osx/bitcoin-abc-${VERSION}-osx-unsigned.dmg") # Windows binaries ASSET_LIST+=("${ASSET_DIR}/win/bitcoin-abc-${VERSION}-win64-setup-unsigned.exe") for FILENAME in "${ASSET_LIST[@]}"; do if [ ! -f "${FILENAME}" ]; then echo "Error: Expected binary '${FILENAME}' does not exist" exit 31 fi done # Add any signature files for FILENAME in "${ASSET_DIR}"/*"-sha256sums.${VERSION}.asc"; do ASSET_LIST+=("${FILENAME}") done else echo "Error: Asset directory '${ASSET_DIR}' does not exist" exit 32 fi # Fetch release notes if [ -z "${RELEASE_NOTES_PATH}" ]; then RELEASE_NOTES_PATH="${RELEASE_NOTES_DIR}/release-notes-${VERSION}.md" fi RELEASE_NOTES=$(jq -Rs '.' "${RELEASE_NOTES_PATH}") if [ "${RELEASE_NOTES}" == '""' ]; then echo "Error: Could not fetch release notes for version '${VERSION}'" exit 40 fi # Format request data POST_DATA="{\"tag_name\": \"${TAG}\", \"name\": \"${VERSION}\", \"body\": ${RELEASE_NOTES}, \"draft\": true}" URL="https://api.github.com/repos/bitcoin-abc/bitcoin-abc/releases" if [ "${DRY_RUN}" == "true" ]; then echo "POST request data that would be sent to '${URL}':" printf '%s\n\n' "${POST_DATA}" echo "Would attempt to upload these files:" for FILENAME in "${ASSET_LIST[@]}"; do echo "${FILENAME}" done else echo "Creating draft release..." echo "Requesting '${URL}'..." RESPONSE=$(curl -X POST -H "Content-Type: application/json" -H "Authorization: token ${OAUTH_TOKEN}" -d "${POST_DATA}" "${URL}") RELEASE_ID=$(echo "${RESPONSE}" | jq '.id') UPLOAD_URL="https://uploads.github.com/repos/bitcoin-abc/bitcoin-abc/releases/${RELEASE_ID}/assets" echo "Uploading assets..." if [ ${#ASSET_LIST[@]} -gt 0 ]; then for FILEPATH in "${ASSET_LIST[@]}"; do echo "Uploading '${FILEPATH}'..." FILENAME=$(basename "${FILEPATH}") curl -X POST -H "Content-Type:application/octet-stream" -H "Authorization: token ${OAUTH_TOKEN}" --data-binary "@${FILEPATH}" "${UPLOAD_URL}?name=${FILENAME}" done fi echo echo "Done uploading assets." fi echo "Done." echo "https://github.com/Bitcoin-ABC/bitcoin-abc/releases/tag/${TAG}"