From 72820ee84c5b7297e3666a724f1b7656f363491b Mon Sep 17 00:00:00 2001 From: Kim Altintop Date: Mon, 4 Feb 2019 17:33:10 +0100 Subject: [PATCH] Provide public CI --- .ci/check-haskell-format.sh | 2 +- .ci/ci-cache.sh | 31 ------------------ .ci/travis-install.sh | 27 +++++++++++++++ .travis.yml | 49 ++++++++++++++++++++++++++++ README.md | 2 ++ cloudbuild.yaml | 58 --------------------------------- src/Network/Gossip/IO/Peer.hs | 8 +++++ src/Network/Gossip/IO/Socket.hs | 10 +++++- src/Network/Socket/Serialise.hs | 10 ++++-- stack.yaml | 6 ++-- 10 files changed, 107 insertions(+), 96 deletions(-) delete mode 100755 .ci/ci-cache.sh create mode 100755 .ci/travis-install.sh create mode 100644 .travis.yml delete mode 100644 cloudbuild.yaml diff --git a/.ci/check-haskell-format.sh b/.ci/check-haskell-format.sh index 2b54c7f..2444822 100755 --- a/.ci/check-haskell-format.sh +++ b/.ci/check-haskell-format.sh @@ -4,7 +4,7 @@ set -euo pipefail shopt -s globstar -PATH=$HOME/.local/bin:$PATH +PATH=$HOME/.cabal/bin:$PATH base=$(mktemp -d "/tmp/gossip-base.XXXXX") for f in **/**.hs; do diff --git a/.ci/ci-cache.sh b/.ci/ci-cache.sh deleted file mode 100755 index e060717..0000000 --- a/.ci/ci-cache.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -function load-cache() { - bucket="gs://gossip-build-cache" - key="stack-work-$(sha256sum < stack.yaml | cut -d ' ' -f 1)".tar.gz - gsutil -m cp -r "$bucket/v1/*" "$bucket/$key" . || true - for f in stack.tar.gz "$key"; do - if [[ -e $f ]]; then - tar xzf "$f" - fi - done -} - -function save-cache() { - bucket="gs://gossip-build-cache" - key="stack-work-$(sha256sum < stack.yaml | cut -d ' ' -f 1)".tar.gz - if ! gsutil ls "$bucket/$key"; then - tar czf "$key" .stack-work - gsutil -m cp "$key" "$bucket/$key" || true - fi - - rm -rf .stack/indices/Hackage/00-index.tar* - tar czf stack.tar.gz .stack - - if ! sha256sum --check stack.tar.gz.sha256; then - sha256sum stack.tar.gz > stack.tar.gz.sha256 - gsutil -m cp stack.tar.gz* "$bucket/v1/" || true - fi -} diff --git a/.ci/travis-install.sh b/.ci/travis-install.sh new file mode 100755 index 0000000..f9673fc --- /dev/null +++ b/.ci/travis-install.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +set -xeuo pipefail + +: ${GHCVER?} +: ${CABALVER?} + +travis_retry () { + $* || (sleep 1 && $*) || (sleep 2 && $*) +} + +gpg --version + +if ! [ -x $HOME/.ghcup/bin/ghcup ]; then + mkdir -p $HOME/.ghcup/bin + cd $HOME/.ghcup/bin + travis_retry curl -LO https://github.com/haskell/ghcup/releases/download/0.0.7/ghcup + travis_retry curl -LO https://github.com/haskell/ghcup/releases/download/0.0.7/ghcup.asc + travis_retry gpg --keyserver keyserver.ubuntu.com --recv-keys 256844E8AE55008AF197C1B7511B62C09D50CD28 + gpg --verify ghcup.asc ghcup + chmod +x $HOME/.ghcup/bin/ghcup +fi + +export PATH="$HOME/.cabal/bin:$HOME/.ghcup/bin:$PATH" + +ghcup set "$GHCVER" || ghcup install "$GHCVER" && ghcup set "$GHCVER" +ghcup install-cabal "$CABALVER" diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..b8f486d --- /dev/null +++ b/.travis.yml @@ -0,0 +1,49 @@ +language: c + +dist: xenial + +matrix: + include: + - env: GHCVER=8.6.3 CABALVER=2.4.1.0 + os: linux + sudo: required + - env: GHCVER=8.4.4 CABALVER=2.4.1.0 + os: linux + sudo: required + +addons: + apt: + packages: + - libnuma-dev + +before_install: + - .ci/travis-install.sh + - export PATH="$HOME/.cabal/bin:$HOME/.ghcup/bin:$PATH" + +install: + - cabal v2-update + - cabal v2-install -j stylish-haskell hlint + +script: + - .ci/check-haskell-format.sh + - hlint . + - cabal v2-configure --enable-tests + # wtflol: + - 'echo -e "package gossip\n ghc-options: -Werror" >> cabal.project.local' + - cat cabal.project.local + - cabal v2-build -j all + - cabal v2-test -j all + +cache: + directories: + - $HOME/.cabal/packages + - $HOME/.cabal/store + - $HOME/.cabal/bin + - $HOME/.ghcup + +before_cache: + - rm -fv $HOME/.cabal/packages/hackage.haskell.org/build-reports.log + - rm -fv $HOME/.cabal/packages/hackage.haskell.org/00-index* + - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index* + - rm -fv $HOME/.cabal/packages/hackage.haskell.org/*.json + - rm -fv $HOME/.cabal/packages/hackage.haskell.org/hackage-security-lock diff --git a/README.md b/README.md index c95814d..9882c6e 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[![Build Status](https://travis-ci.org/oscoin/gossip.svg?branch=master)](https://travis-ci.org/oscoin/gossip) + # Gossip Experimental Gossip Protocol(s). diff --git a/cloudbuild.yaml b/cloudbuild.yaml deleted file mode 100644 index b3ef76b..0000000 --- a/cloudbuild.yaml +++ /dev/null @@ -1,58 +0,0 @@ -timeout: 3600s # Cache misses are slow to rebuild -steps: - - id: "Load cache" - name: gcr.io/cloud-builders/gsutil - entrypoint: "bash" - args: - - "-c" - - | - source .ci/ci-cache.sh - load-cache - - - id: "Build deps" - name: "eu.gcr.io/opensourcecoin/haskell:8.4.4" - env: ["STACK_ROOT=/workspace/.stack"] - entrypoint: "bash" - dir: "/tmp" - args: - - "-c" - - | - stack config set system-ghc --global true - stack config set install-ghc --global false - stack install stylish-haskell hlint weeder - - - id: "Format (haskell)" - waitFor: ["Build deps"] - name: "eu.gcr.io/opensourcecoin/haskell:8.4.4" - args: ["./.ci/check-haskell-format.sh"] - - - id: "Lint (hlint)" - waitFor: ["Build deps"] - name: "eu.gcr.io/opensourcecoin/haskell:8.4.4" - args: ["/builder/home/.local/bin/hlint", "."] - - - id: "Test & Build" - waitFor: ["Build deps"] - name: "eu.gcr.io/opensourcecoin/haskell:8.4.4" - env: - - STACK_ROOT=/workspace/.stack - args: - - stack - - build - - "--test" - - "--no-terminal" - - "--pedantic" - - - id: "Lint (weeder)" - name: "eu.gcr.io/opensourcecoin/haskell:8.4.4" - env: ["STACK_ROOT=/workspace/.stack"] # weeder uses stack under the hood - args: ["/builder/home/.local/bin/weeder", "."] - - - id: "Save cache" - name: gcr.io/cloud-builders/gsutil - entrypoint: "bash" - args: - - "-c" - - | - source .ci/ci-cache.sh - save-cache diff --git a/src/Network/Gossip/IO/Peer.hs b/src/Network/Gossip/IO/Peer.hs index 6fefdf3..0dfb3ce 100644 --- a/src/Network/Gossip/IO/Peer.hs +++ b/src/Network/Gossip/IO/Peer.hs @@ -1,3 +1,5 @@ +{-# LANGUAGE CPP #-} + -- | -- Copyright : 2018 Monadic GmbH -- License : BSD3 @@ -17,7 +19,9 @@ import Control.Applicative (liftA2) import Control.Monad.Fail (fail) import Data.Hashable (Hashable(..), hashUsing) import Data.Word (Word8) +#if !MIN_VERSION_network(3,0,0) import GHC.Stack (HasCallStack) +#endif import Network.Socket import Network.Socket.Serialise (decodeSockAddr, encodeSockAddr) import Prelude hiding (fail) @@ -59,8 +63,10 @@ instance Hashable n => Hashable (Peer n) where hashAddr s (SockAddrUnix path) = s `hashWithSalt` (2 :: Word8) `hashWithSalt` path +#if !MIN_VERSION_network(3,0,0) -- hashAddr s (SockAddrCan x) = canNotSupported hashAddr _ _ = canNotSupported +#endif hashPortNum = hashUsing fromEnum @@ -77,5 +83,7 @@ knownPeer nid host port = Peer nid <$> resolve -------------------------------------------------------------------------------- +#if !MIN_VERSION_network(3,0,0) canNotSupported :: HasCallStack => a canNotSupported = error "CAN addresses not supported" +#endif diff --git a/src/Network/Gossip/IO/Socket.hs b/src/Network/Gossip/IO/Socket.hs index 196ca17..1ecd824 100644 --- a/src/Network/Gossip/IO/Socket.hs +++ b/src/Network/Gossip/IO/Socket.hs @@ -41,7 +41,9 @@ import Data.Maybe (isJust) import Data.Text (Text) import Data.Void import qualified Focus +#if !MIN_VERSION_network(3,0,0) import GHC.Stack (HasCallStack) +#endif import Network.Socket ( AddrInfo(..) , AddrInfoFlag(..) @@ -155,7 +157,9 @@ listen eval host port = do (Sock.addrProtocol addr) Sock.setSocketOption sock Sock.ReuseAddr 1 Sock.bind sock (Sock.addrAddress addr) -#if MIN_VERSION_network(2,7,0) +#if MIN_VERSION_network(3,0,0) + Sock.setCloseOnExecIfNeeded =<< Sock.fdSocket sock +#elif MIN_VERSION_network(2,7,0) Sock.setCloseOnExecIfNeeded $ Sock.fdSocket sock #endif Sock.listen sock 10 @@ -280,12 +284,16 @@ family :: SockAddr -> Sock.Family family Sock.SockAddrInet{} = Sock.AF_INET family Sock.SockAddrInet6{} = Sock.AF_INET6 family Sock.SockAddrUnix{} = Sock.AF_UNIX +#if !MIN_VERSION_network(3,0,0) --family Sock.SockAddrCan{} = Sock.AF_CAN family _ = canNotSupported +#endif withSocket :: SockAddr -> (Socket -> IO a) -> IO a withSocket addr = bracket (Sock.socket (family addr) Stream Sock.defaultProtocol) Sock.close +#if !MIN_VERSION_network(3,0,0) canNotSupported :: HasCallStack => a canNotSupported = error "CAN addresses not supported" +#endif diff --git a/src/Network/Socket/Serialise.hs b/src/Network/Socket/Serialise.hs index 116c81c..2d9feab 100644 --- a/src/Network/Socket/Serialise.hs +++ b/src/Network/Socket/Serialise.hs @@ -1,3 +1,4 @@ +{-# LANGUAGE CPP #-} module Network.Socket.Serialise ( encodeSockAddr , decodeSockAddr @@ -8,7 +9,9 @@ import Codec.Serialise (decode, encode) import Codec.Serialise.Decoding (Decoder, decodeListLen, decodeWord) import Codec.Serialise.Encoding (Encoding, encodeListLen, encodeWord) import Control.Applicative (liftA2) +#if !MIN_VERSION_network(3,0,0) import GHC.Stack (HasCallStack) +#endif import Network.Socket (SockAddr(..)) import qualified Network.Socket as Sock @@ -34,8 +37,10 @@ encodeSockAddr = \case <> encodeWord 2 <> encode path +#if !MIN_VERSION_network(3,0,0) -- SockAddrCan{} -> _ -> canNotSupported +#endif where encodePort = encode . fromEnum encodeHost = encode . Sock.hostAddressToTuple @@ -52,7 +57,7 @@ decodeSockAddr = do <*> decodeHost6 <*> decode (2, 2) -> SockAddrUnix <$> decode - _ -> fail canNotSupported + _ -> fail "Network.Socket.Serialise: Invalid wire tagging" where decodePort = toEnum <$> decode decodeHost = Sock.tupleToHostAddress <$> decode @@ -60,6 +65,7 @@ decodeSockAddr = do -------------------------------------------------------------------------------- +#if !MIN_VERSION_network(3,0,0) canNotSupported :: HasCallStack => a canNotSupported = error "CAN addresses not supported" - +#endif diff --git a/stack.yaml b/stack.yaml index b233c0b..07fda5a 100644 --- a/stack.yaml +++ b/stack.yaml @@ -1,6 +1,6 @@ -resolver: lts-12.17 +resolver: lts-13.6 packages: - . extra-deps: -- hedgehog-quickcheck-0.1 -- serialise-0.2.1.0 +- focus-0.1.5.2@sha256:fc5c76a5be3a9a1c456106d6f389939299c7e05a1a24938b909f043e36a3e37b +- stm-containers-0.2.16@sha256:e98efa8dcf0045ea8a78a04b4e2763cf2d8bc33aad0750e2f30a67f8f4e933b1