From 5f74f8c265e3d59ba6897d5c4ba65dbc1f473774 Mon Sep 17 00:00:00 2001 From: "Denis S. Soldatov aka General-Beck" Date: Tue, 23 Jan 2018 01:50:52 +0300 Subject: [PATCH] update gitlab build from master Signed-off-by: Denis S. Soldatov aka General-Beck --- .gitlab-ci.yml | 548 ++---------------- mac/Parity Ethereum.xcodeproj/project.pbxproj | 12 +- mac/Parity.pkgproj | 2 +- mac/Parity/AppDelegate.swift | 43 +- .../AppIcon.appiconset/Parity.png | Bin 118116 -> 52644 bytes .../statusIcon.imageset/Parity-1.png | Bin 372 -> 679 bytes .../statusIcon.imageset/Parity-2.png | Bin 1326 -> 3670 bytes .../statusIcon.imageset/Parity.png | Bin 707 -> 1742 bytes mac/Parity/GetBSDProcessList.swift | 12 +- mac/install-readme.txt | 4 +- mac/uninstall-parity.sh | 3 +- nsis/installer.nsi | 19 +- scripts/cov.sh | 33 +- scripts/gitlab-build.sh | 292 ++++++++++ scripts/gitlab-test.sh | 102 ++++ scripts/snapcraft.yaml | 4 +- 16 files changed, 507 insertions(+), 567 deletions(-) create mode 100755 scripts/gitlab-build.sh create mode 100755 scripts/gitlab-test.sh diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 87b227388..90e59f9c9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -4,13 +4,15 @@ stages: - push-release - build variables: - SIMPLECOV: "true" RUST_BACKTRACE: "1" RUSTFLAGS: "" CARGOFLAGS: "" CI_SERVER_NAME: "GitLab CI" + LIBSSL: "libssl1.0.0 (>=1.0.0)" cache: key: "$CI_BUILD_STAGE-$CI_BUILD_REF_NAME" + paths: + - target untracked: true linux-stable: stage: build @@ -22,77 +24,14 @@ linux-stable: - triggers script: - rustup default stable - - cargo build -j $(nproc) --release --features final $CARGOFLAGS - - cargo build -j $(nproc) --release -p evmbin - - cargo build -j $(nproc) --release -p ethstore-cli - - cargo build -j $(nproc) --release -p ethkey-cli - - strip target/release/parity - - strip target/release/parity-evm - - strip target/release/ethstore - - strip target/release/ethkey - - export SHA3=$(target/release/parity tools hash target/release/parity) - - md5sum target/release/parity > parity.md5 - - sh scripts/deb-build.sh amd64 - - cp target/release/parity deb/usr/bin/parity - - cp target/release/parity-evm deb/usr/bin/parity-evm - - cp target/release/ethstore deb/usr/bin/ethstore - - cp target/release/ethkey deb/usr/bin/ethkey - - export VER=$(grep -m 1 version Cargo.toml | awk '{print $3}' | tr -d '"' | tr -d "\n") - - dpkg-deb -b deb "parity_"$VER"_amd64.deb" - - md5sum "parity_"$VER"_amd64.deb" > "parity_"$VER"_amd64.deb.md5" - - aws configure set aws_access_key_id $s3_key - - aws configure set aws_secret_access_key $s3_secret - - if [[ $CI_BUILD_REF_NAME =~ ^(master|beta|stable|nightly)$ ]]; then export S3_BUCKET=builds-parity-published; else export S3_BUCKET=builds-parity; fi - - aws s3 rm --recursive s3://$S3_BUCKET/$CI_BUILD_REF_NAME/x86_64-unknown-linux-gnu - - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/x86_64-unknown-linux-gnu/parity --body target/release/parity - - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/x86_64-unknown-linux-gnu/parity.md5 --body parity.md5 - - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/x86_64-unknown-linux-gnu/"parity_"$VER"_amd64.deb" --body "parity_"$VER"_amd64.deb" - - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/x86_64-unknown-linux-gnu/"parity_"$VER"_amd64.deb.md5" --body "parity_"$VER"_amd64.deb.md5" - - curl --data "commit=$CI_BUILD_REF&sha3=$SHA3&filename=parity&secret=$RELEASES_SECRET" http://update.parity.io:1337/push-build/$CI_BUILD_REF_NAME/x86_64-unknown-linux-gnu - - curl --data "commit=$CI_BUILD_REF&sha3=$SHA3&filename=parity&secret=$RELEASES_SECRET" http://update.parity.io:1338/push-build/$CI_BUILD_REF_NAME/x86_64-unknown-linux-gnu + # ARGUMENTS: 1. BUILD_PLATFORM (target for binaries) 2. PLATFORM (target for cargo) 3. ARC (architecture) 4. & 5. CC & CXX flags + - scripts/gitlab-build.sh x86_64-unknown-linux-gnu x86_64-unknown-linux-gnu amd64 gcc g++ tags: - - rust - rust-stable artifacts: paths: - - target/release/parity - - target/release/parity-evm - - target/release/ethstore - - target/release/ethkey + - parity.zip name: "stable-x86_64-unknown-linux-gnu_parity" -linux-snap: - stage: build - image: parity/snapcraft:gitlab-ci - only: - - snap - - beta - - tags - - triggers - script: - - export VER=$(grep -m 1 version Cargo.toml | awk '{print $3}' | tr -d '"' | tr -d "\n") - - cd snap - - rm -rf *snap - - sed -i 's/master/'"$VER"'/g' snapcraft.yaml - - echo "Version:"$VER - - snapcraft - - ls - - cp "parity_"$CI_BUILD"_REF_NAME_amd64.snap" "parity_"$VER"_amd64.snap" - - md5sum "parity_"$VER"_amd64.snap" > "parity_"$VER"_amd64.snap.md5" - - aws configure set aws_access_key_id $s3_key - - aws configure set aws_secret_access_key $s3_secret - - if [[ $CI_BUILD_REF_NAME =~ ^(master|beta|stable|nightly)$ ]]; then export S3_BUCKET=builds-parity-published; else export S3_BUCKET=builds-parity; fi - - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/x86_64-unknown-linux-gnu/"parity_"$VER"_amd64.snap" --body "parity_"$VER"_amd64.snap" - - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/x86_64-unknown-linux-gnu/"parity_"$VER"_amd64.snap.md5" --body "parity_"$VER"_amd64.snap.md5" - - curl --data "commit=$CI_BUILD_REF&sha3=$SHA3&filename=parity&secret=$RELEASES_SECRET" http://update.parity.io:1337/push-build/$CI_BUILD_REF_NAME/x86_64-unknown-linux-gnu - - curl --data "commit=$CI_BUILD_REF&sha3=$SHA3&filename=parity&secret=$RELEASES_SECRET" http://update.parity.io:1338/push-build/$CI_BUILD_REF_NAME/x86_64-unknown-linux-gnu - tags: - - rust - - rust-stable - artifacts: - paths: - - scripts/parity_*_amd64.snap - name: "stable-x86_64-unknown-snap-gnu_parity" - allow_failure: true linux-stable-debian: stage: build image: parity/rust-debian:gitlab-ci @@ -102,81 +41,14 @@ linux-stable-debian: - stable - triggers script: - - cargo build -j $(nproc) --release --features final $CARGOFLAGS - - cargo build -j $(nproc) --release -p evmbin - - cargo build -j $(nproc) --release -p ethstore-cli - - cargo build -j $(nproc) --release -p ethkey-cli - - strip target/release/parity - - strip target/release/parity-evm - - strip target/release/ethstore - - strip target/release/ethkey - - export SHA3=$(target/release/parity tools hash target/release/parity) - - md5sum target/release/parity > parity.md5 - - sh scripts/deb-build.sh amd64 - - cp target/release/parity deb/usr/bin/parity - - cp target/release/parity-evm deb/usr/bin/parity-evm - - cp target/release/ethstore deb/usr/bin/ethstore - - cp target/release/ethkey deb/usr/bin/ethkey - - export VER=$(grep -m 1 version Cargo.toml | awk '{print $3}' | tr -d '"' | tr -d "\n") - - dpkg-deb -b deb "parity_"$VER"_amd64.deb" - - md5sum "parity_"$VER"_amd64.deb" > "parity_"$VER"_amd64.deb.md5" - - aws configure set aws_access_key_id $s3_key - - aws configure set aws_secret_access_key $s3_secret - - if [[ $CI_BUILD_REF_NAME =~ ^(master|beta|stable|nightly)$ ]]; then export S3_BUCKET=builds-parity-published; else export S3_BUCKET=builds-parity; fi - - aws s3 rm --recursive s3://$S3_BUCKET/$CI_BUILD_REF_NAME/x86_64-unknown-debian-gnu - - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/x86_64-unknown-debian-gnu/parity --body target/release/parity - - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/x86_64-unknown-debian-gnu/parity.md5 --body parity.md5 - - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/x86_64-unknown-debian-gnu/"parity_"$VER"_amd64.deb" --body "parity_"$VER"_amd64.deb" - - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/x86_64-unknown-debian-gnu/"parity_"$VER"_amd64.deb.md5" --body "parity_"$VER"_amd64.deb.md5" - - curl --data "commit=$CI_BUILD_REF&sha3=$SHA3&filename=parity&secret=$RELEASES_SECRET" http://update.parity.io:1337/push-build/$CI_BUILD_REF_NAME/x86_64-unknown-debian-gnu - - curl --data "commit=$CI_BUILD_REF&sha3=$SHA3&filename=parity&secret=$RELEASES_SECRET" http://update.parity.io:1338/push-build/$CI_BUILD_REF_NAME/x86_64-unknown-debian-gnu + - export LIBSSL="libssl1.1 (>=1.1.0)" + - scripts/gitlab-build.sh x86_64-unknown-debian-gnu x86_64-unknown-linux-gnu amd64 gcc g++ tags: - - rust - rust-debian artifacts: paths: - - target/release/parity + - parity.zip name: "stable-x86_64-unknown-debian-gnu_parity" -linux-beta: - stage: build - image: parity/rust:gitlab-ci - only: - - beta - - tags - - stable - - triggers - script: - - rustup default beta - - cargo build -j $(nproc) --release $CARGOFLAGS - - strip target/release/parity - tags: - - rust - - rust-beta - artifacts: - paths: - - target/release/parity - name: "beta-x86_64-unknown-linux-gnu_parity" - allow_failure: true -linux-nightly: - stage: build - image: parity/rust:gitlab-ci - only: - - beta - - tags - - stable - - triggers - script: - - rustup default nightly - - cargo build -j $(nproc) --release $CARGOFLAGS - - strip target/release/parity - tags: - - rust - - rust-nightly - artifacts: - paths: - - target/release/parity - name: "nigthly-x86_64-unknown-linux-gnu_parity" - allow_failure: true linux-centos: stage: build image: parity/rust-centos:gitlab-ci @@ -186,42 +58,12 @@ linux-centos: - stable - triggers script: - - export CXX="g++" - - export CC="gcc" - - export PLATFORM=x86_64-unknown-centos-gnu - - cargo build -j $(nproc) --release --features final $CARGOFLAGS - - cargo build -j $(nproc) --release -p evmbin - - cargo build -j $(nproc) --release -p ethstore-cli - - cargo build -j $(nproc) --release -p ethkey-cli - - strip target/release/parity - - strip target/release/parity-evm - - strip target/release/ethstore - - strip target/release/ethkey - - md5sum target/release/parity > parity.md5 - - md5sum target/release/parity-evm > parity-evm.md5 - - md5sum target/release/ethstore > ethstore.md5 - - md5sum target/release/ethkey > ethkey.md5 - - export SHA3=$(target/release/parity tools hash target/release/parity) - - aws configure set aws_access_key_id $s3_key - - aws configure set aws_secret_access_key $s3_secret - - if [[ $CI_BUILD_REF_NAME =~ ^(master|beta|stable|nightly)$ ]]; then export S3_BUCKET=builds-parity-published; else export S3_BUCKET=builds-parity; fi - - aws s3 rm --recursive s3://$S3_BUCKET/$CI_BUILD_REF_NAME/x86_64-unknown-centos-gnu - - aws s3api put-object --bucket builds-parity --key $CI_BUILD_REF_NAME/x86_64-unknown-centos-gnu/parity --body target/release/parity - - aws s3api put-object --bucket builds-parity --key $CI_BUILD_REF_NAME/x86_64-unknown-centos-gnu/parity.md5 --body parity.md5 - - aws s3api put-object --bucket builds-parity --key $CI_BUILD_REF_NAME/x86_64-unknown-centos-gnu/parity-evm --body target/release/parity-evm - - aws s3api put-object --bucket builds-parity --key $CI_BUILD_REF_NAME/x86_64-unknown-centos-gnu/parity-evm.md5 --body parity-evm.md5 - - aws s3api put-object --bucket builds-parity --key $CI_BUILD_REF_NAME/x86_64-unknown-centos-gnu/ethstore --body target/release/ethstore - - aws s3api put-object --bucket builds-parity --key $CI_BUILD_REF_NAME/x86_64-unknown-centos-gnu/ethstore.md5 --body ethstore.md5 - - aws s3api put-object --bucket builds-parity --key $CI_BUILD_REF_NAME/x86_64-unknown-centos-gnu/ethkey --body target/release/ethkey - - aws s3api put-object --bucket builds-parity --key $CI_BUILD_REF_NAME/x86_64-unknown-centos-gnu/ethkey.md5 --body ethkey.md5 - - curl --data "commit=$CI_BUILD_REF&sha3=$SHA3&filename=parity&secret=$RELEASES_SECRET" http://update.parity.io:1337/push-build/$CI_BUILD_REF_NAME/$PLATFORM - - curl --data "commit=$CI_BUILD_REF&sha3=$SHA3&filename=parity&secret=$RELEASES_SECRET" http://update.parity.io:1338/push-build/$CI_BUILD_REF_NAME/$PLATFORM + - scripts/gitlab-build.sh x86_64-unknown-centos-gnu x86_64-unknown-linux-gnu x86_64 gcc g++ tags: - - rust - rust-centos artifacts: paths: - - target/release/parity + - parity.zip name: "x86_64-unknown-centos-gnu_parity" linux-i686: stage: build @@ -232,47 +74,13 @@ linux-i686: - stable - triggers script: - - export HOST_CC=gcc - - export HOST_CXX=g++ - - export COMMIT=$(git rev-parse HEAD) - - export PLATFORM=i686-unknown-linux-gnu - - cargo build -j $(nproc) --target $PLATFORM --features final --release $CARGOFLAGS - - cargo build -j $(nproc) --target $PLATFORM --release -p evmbin - - cargo build -j $(nproc) --target $PLATFORM --release -p ethstore-cli - - cargo build -j $(nproc) --target $PLATFORM --release -p ethkey-cli - - strip target/$PLATFORM/release/parity - - strip target/$PLATFORM/release/parity-evm - - strip target/$PLATFORM/release/ethstore - - strip target/$PLATFORM/release/ethkey - - strip target/$PLATFORM/release/parity - - md5sum target/$PLATFORM/release/parity > parity.md5 - - export SHA3=$(target/$PLATFORM/release/parity tools hash target/$PLATFORM/release/parity) - - sh scripts/deb-build.sh i386 - - cp target/$PLATFORM/release/parity deb/usr/bin/parity - - cp target/$PLATFORM/release/parity-evm deb/usr/bin/parity-evm - - cp target/$PLATFORM/release/ethstore deb/usr/bin/ethstore - - cp target/$PLATFORM/release/ethkey deb/usr/bin/ethkey - - export VER=$(grep -m 1 version Cargo.toml | awk '{print $3}' | tr -d '"' | tr -d "\n") - - dpkg-deb -b deb "parity_"$VER"_i386.deb" - - md5sum "parity_"$VER"_i386.deb" > "parity_"$VER"_i386.deb.md5" - - aws configure set aws_access_key_id $s3_key - - aws configure set aws_secret_access_key $s3_secret - - if [[ $CI_BUILD_REF_NAME =~ ^(master|beta|stable|nightly)$ ]]; then export S3_BUCKET=builds-parity-published; else export S3_BUCKET=builds-parity; fi - - aws s3 rm --recursive s3://$S3_BUCKET/$CI_BUILD_REF_NAME/$PLATFORM - - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$PLATFORM/parity --body target/$PLATFORM/release/parity - - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$PLATFORM/parity.md5 --body parity.md5 - - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$PLATFORM/"parity_"$VER"_i386.deb" --body "parity_"$VER"_i386.deb" - - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$PLATFORM/"parity_"$VER"_i386.deb.md5" --body "parity_"$VER"_i386.deb.md5" - - curl --data "commit=$CI_BUILD_REF&sha3=$SHA3&filename=parity&secret=$RELEASES_SECRET" http://update.parity.io:1337/push-build/$CI_BUILD_REF_NAME/$PLATFORM - - curl --data "commit=$CI_BUILD_REF&sha3=$SHA3&filename=parity&secret=$RELEASES_SECRET" http://update.parity.io:1338/push-build/$CI_BUILD_REF_NAME/$PLATFORM + - scripts/gitlab-build.sh i686-unknown-linux-gnu i686-unknown-linux-gnu i386 gcc g++ tags: - - rust - rust-i686 artifacts: paths: - - target/i686-unknown-linux-gnu/release/parity + - parity.zip name: "i686-unknown-linux-gnu" - allow_failure: true linux-armv7: stage: build image: parity/rust-armv7:gitlab-ci @@ -282,55 +90,13 @@ linux-armv7: - stable - triggers script: - - export CC=arm-linux-gnueabihf-gcc - - export CXX=arm-linux-gnueabihf-g++ - - export HOST_CC=gcc - - export HOST_CXX=g++ - - export PLATFORM=armv7-unknown-linux-gnueabihf - - rm -rf .cargo - - mkdir -p .cargo - - echo "[target.$PLATFORM]" >> .cargo/config - - echo "linker= \"arm-linux-gnueabihf-gcc\"" >> .cargo/config - - cat .cargo/config - - cargo build -j $(nproc) --target $PLATFORM --features final --release $CARGOFLAGS - - cargo build -j $(nproc) --target $PLATFORM --release -p evmbin - - cargo build -j $(nproc) --target $PLATFORM --release -p ethstore-cli - - cargo build -j $(nproc) --target $PLATFORM --release -p ethkey-cli - - md5sum target/$PLATFORM/release/parity > parity.md5 - - export SHA3=$(target/$PLATFORM/release/parity tools hash target/$PLATFORM/release/parity) - - sh scripts/deb-build.sh i386 - - arm-linux-gnueabihf-strip target/$PLATFORM/release/parity - - arm-linux-gnueabihf-strip target/$PLATFORM/release/parity-evm - - arm-linux-gnueabihf-strip target/$PLATFORM/release/ethstore - - arm-linux-gnueabihf-strip target/$PLATFORM/release/ethkey - - export SHA3=$(rhash --sha3-256 target/$PLATFORM/release/parity -p %h) - - md5sum target/$PLATFORM/release/parity > parity.md5 - - sh scripts/deb-build.sh armhf - - cp target/$PLATFORM/release/parity deb/usr/bin/parity - - cp target/$PLATFORM/release/parity-evm deb/usr/bin/parity-evm - - cp target/$PLATFORM/release/ethstore deb/usr/bin/ethstore - - cp target/$PLATFORM/release/ethkey deb/usr/bin/ethkey - - export VER=$(grep -m 1 version Cargo.toml | awk '{print $3}' | tr -d '"' | tr -d "\n") - - dpkg-deb -b deb "parity_"$VER"_armhf.deb" - - md5sum "parity_"$VER"_armhf.deb" > "parity_"$VER"_armhf.deb.md5" - - aws configure set aws_access_key_id $s3_key - - aws configure set aws_secret_access_key $s3_secret - - if [[ $CI_BUILD_REF_NAME =~ ^(master|beta|stable|nightly)$ ]]; then export S3_BUCKET=builds-parity-published; else export S3_BUCKET=builds-parity; fi - - aws s3 rm --recursive s3://$S3_BUCKET/$CI_BUILD_REF_NAME/$PLATFORM - - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$PLATFORM/parity --body target/$PLATFORM/release/parity - - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$PLATFORM/parity.md5 --body parity.md5 - - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$PLATFORM/"parity_"$VER"_armhf.deb" --body "parity_"$VER"_armhf.deb" - - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$PLATFORM/"parity_"$VER"_armhf.deb.md5" --body "parity_"$VER"_armhf.deb.md5" - - curl --data "commit=$CI_BUILD_REF&sha3=$SHA3&filename=parity&secret=$RELEASES_SECRET" http://update.parity.io:1337/push-build/$CI_BUILD_REF_NAME/$PLATFORM - - curl --data "commit=$CI_BUILD_REF&sha3=$SHA3&filename=parity&secret=$RELEASES_SECRET" http://update.parity.io:1338/push-build/$CI_BUILD_REF_NAME/$PLATFORM + - scripts/gitlab-build.sh armv7-unknown-linux-gnueabihf armv7-unknown-linux-gnueabihf armhf arm-linux-gnueabihf-gcc arm-linux-gnueabihf-g++ tags: - - rust - rust-arm artifacts: paths: - - target/armv7-unknown-linux-gnueabihf/release/parity + - parity.zip name: "armv7_unknown_linux_gnueabihf_parity" - allow_failure: true linux-arm: stage: build image: parity/rust-arm:gitlab-ci @@ -340,52 +106,13 @@ linux-arm: - stable - triggers script: - - export CC=arm-linux-gnueabihf-gcc - - export CXX=arm-linux-gnueabihf-g++ - - export HOST_CC=gcc - - export HOST_CXX=g++ - - export PLATFORM=arm-unknown-linux-gnueabihf - - rm -rf .cargo - - mkdir -p .cargo - - echo "[target.$PLATFORM]" >> .cargo/config - - echo "linker= \"arm-linux-gnueabihf-gcc\"" >> .cargo/config - - cat .cargo/config - - cargo build -j $(nproc) --target $PLATFORM --features final --release $CARGOFLAGS - - cargo build -j $(nproc) --target $PLATFORM --release -p evmbin - - cargo build -j $(nproc) --target $PLATFORM --release -p ethstore-cli - - cargo build -j $(nproc) --target $PLATFORM --release -p ethkey-cli - - arm-linux-gnueabihf-strip target/$PLATFORM/release/parity - - arm-linux-gnueabihf-strip target/$PLATFORM/release/parity-evm - - arm-linux-gnueabihf-strip target/$PLATFORM/release/ethstore - - arm-linux-gnueabihf-strip target/$PLATFORM/release/ethkey - - export SHA3=$(rhash --sha3-256 target/$PLATFORM/release/parity -p %h) - - md5sum target/$PLATFORM/release/parity > parity.md5 - - sh scripts/deb-build.sh armhf - - cp target/$PLATFORM/release/parity deb/usr/bin/parity - - cp target/$PLATFORM/release/parity-evm deb/usr/bin/parity-evm - - cp target/$PLATFORM/release/ethstore deb/usr/bin/ethstore - - cp target/$PLATFORM/release/ethkey deb/usr/bin/ethkey - - export VER=$(grep -m 1 version Cargo.toml | awk '{print $3}' | tr -d '"' | tr -d "\n") - - dpkg-deb -b deb "parity_"$VER"_armhf.deb" - - md5sum "parity_"$VER"_armhf.deb" > "parity_"$VER"_armhf.deb.md5" - - aws configure set aws_access_key_id $s3_key - - aws configure set aws_secret_access_key $s3_secret - - if [[ $CI_BUILD_REF_NAME =~ ^(master|beta|stable|nightly)$ ]]; then export S3_BUCKET=builds-parity-published; else export S3_BUCKET=builds-parity; fi - - aws s3 rm --recursive s3://$S3_BUCKET/$CI_BUILD_REF_NAME/$PLATFORM - - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$PLATFORM/parity --body target/$PLATFORM/release/parity - - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$PLATFORM/parity.md5 --body parity.md5 - - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$PLATFORM/"parity_"$VER"_armhf.deb" --body "parity_"$VER"_armhf.deb" - - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$PLATFORM/"parity_"$VER"_armhf.deb.md5" --body "parity_"$VER"_armhf.deb.md5" - - curl --data "commit=$CI_BUILD_REF&sha3=$SHA3&filename=parity&secret=$RELEASES_SECRET" http://update.parity.io:1337/push-build/$CI_BUILD_REF_NAME/$PLATFORM - - curl --data "commit=$CI_BUILD_REF&sha3=$SHA3&filename=parity&secret=$RELEASES_SECRET" http://update.parity.io:1338/push-build/$CI_BUILD_REF_NAME/$PLATFORM + - scripts/gitlab-build.sh arm-unknown-linux-gnueabihf arm-unknown-linux-gnueabihf armhf arm-linux-gnueabihf-gcc arm-linux-gnueabihf-g++ tags: - - rust - rust-arm artifacts: paths: - - target/arm-unknown-linux-gnueabihf/release/parity + - parity.zip name: "arm-unknown-linux-gnueabihf_parity" - allow_failure: true linux-aarch64: stage: build image: parity/rust-arm64:gitlab-ci @@ -395,50 +122,29 @@ linux-aarch64: - stable - triggers script: - - export CC=aarch64-linux-gnu-gcc - - export CXX=aarch64-linux-gnu-g++ - - export HOST_CC=gcc - - export HOST_CXX=g++ - - export PLATFORM=aarch64-unknown-linux-gnu - - rm -rf .cargo - - mkdir -p .cargo - - echo "[target.$PLATFORM]" >> .cargo/config - - echo "linker= \"aarch64-linux-gnu-gcc\"" >> .cargo/config - - cat .cargo/config - - cargo build -j $(nproc) --target $PLATFORM --features final --release $CARGOFLAGS - - cargo build -j $(nproc) --target $PLATFORM --release -p evmbin - - cargo build -j $(nproc) --target $PLATFORM --release -p ethstore-cli - - cargo build -j $(nproc) --target $PLATFORM --release -p ethkey-cli - - aarch64-linux-gnu-strip target/$PLATFORM/release/parity - - aarch64-linux-gnu-strip target/$PLATFORM/release/parity-evm - - aarch64-linux-gnu-strip target/$PLATFORM/release/ethstore - - aarch64-linux-gnu-strip target/$PLATFORM/release/ethkey - - export SHA3=$(rhash --sha3-256 target/$PLATFORM/release/parity -p %h) - - md5sum target/$PLATFORM/release/parity > parity.md5 - - sh scripts/deb-build.sh arm64 - - cp target/$PLATFORM/release/parity deb/usr/bin/parity - - cp target/$PLATFORM/release/parity-evm deb/usr/bin/parity-evm - - cp target/$PLATFORM/release/ethstore deb/usr/bin/ethstore - - cp target/$PLATFORM/release/ethkey deb/usr/bin/ethkey - - export VER=$(grep -m 1 version Cargo.toml | awk '{print $3}' | tr -d '"' | tr -d "\n") - - dpkg-deb -b deb "parity_"$VER"_arm64.deb" - - md5sum "parity_"$VER"_arm64.deb" > "parity_"$VER"_arm64.deb.md5" - - aws configure set aws_access_key_id $s3_key - - aws configure set aws_secret_access_key $s3_secret - - if [[ $CI_BUILD_REF_NAME =~ ^(master|beta|stable|nightly)$ ]]; then export S3_BUCKET=builds-parity-published; else export S3_BUCKET=builds-parity; fi - - aws s3 rm --recursive s3://$S3_BUCKET/$CI_BUILD_REF_NAME/$PLATFORM - - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$PLATFORM/parity.md5 --body parity.md5 - - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$PLATFORM/"parity_"$VER"_arm64.deb" --body "parity_"$VER"_arm64.deb" - - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$PLATFORM/"parity_"$VER"_arm64.deb.md5" --body "parity_"$VER"_arm64.deb.md5" - - curl --data "commit=$CI_BUILD_REF&sha3=$SHA3&filename=parity&secret=$RELEASES_SECRET" http://update.parity.io:1337/push-build/$CI_BUILD_REF_NAME/$PLATFORM - - curl --data "commit=$CI_BUILD_REF&sha3=$SHA3&filename=parity&secret=$RELEASES_SECRET" http://update.parity.io:1338/push-build/$CI_BUILD_REF_NAME/$PLATFORM + - scripts/gitlab-build.sh aarch64-unknown-linux-gnu aarch64-unknown-linux-gnu arm64 aarch64-linux-gnu-gcc aarch64-linux-gnu-g++ tags: - - rust - rust-arm artifacts: paths: - - target/aarch64-unknown-linux-gnu/release/parity + - parity.zip name: "aarch64-unknown-linux-gnu_parity" +linux-snap: + stage: build + image: parity/snapcraft:gitlab-ci + only: + - stable + - beta + - tags + - triggers + script: + - scripts/gitlab-build.sh x86_64-unknown-snap-gnu x86_64-unknown-linux-gnu amd64 gcc g++ + tags: + - rust-stable + artifacts: + paths: + - scripts/parity_*_amd64.snap + name: "stable-x86_64-unknown-snap-gnu_parity" allow_failure: true darwin: stage: build @@ -447,41 +153,13 @@ darwin: - tags - stable - triggers - script: | - export COMMIT=$(git rev-parse HEAD) - export PLATFORM=x86_64-apple-darwin - rustup default stable - cargo clean - cargo build -j 8 --features final --release #$CARGOFLAGS - cargo build -j 8 --release -p ethstore-cli #$CARGOFLAGS - cargo build -j 8 --release -p ethkey-cli #$CARGOFLAGS - cargo build -j 8 --release -p evmbin #$CARGOFLAGS - rm -rf parity.md5 - md5sum target/release/parity > parity.md5 - export SHA3=$(target/release/parity tools hash target/release/parity) - cd mac - xcodebuild -configuration Release - cd .. - packagesbuild -v mac/Parity.pkgproj - productsign --sign 'Developer ID Installer: PARITY TECHNOLOGIES LIMITED (P2PX3JU8FT)' target/release/Parity\ Ethereum.pkg target/release/Parity\ Ethereum-signed.pkg - export VER=$(grep -m 1 version Cargo.toml | awk '{print $3}' | tr -d '"' | tr -d "\n") - mv target/release/Parity\ Ethereum-signed.pkg "parity-"$VER"-macos-installer.pkg" - md5sum "parity-"$VER"-macos-installer.pkg" >> "parity-"$VER"-macos-installer.pkg.md5" - aws configure set aws_access_key_id $s3_key - aws configure set aws_secret_access_key $s3_secret - if [[ $CI_BUILD_REF_NAME =~ ^(master|beta|stable|nightly)$ ]]; then export S3_BUCKET=builds-parity-published; else export S3_BUCKET=builds-parity; fi - aws s3 rm --recursive s3://$S3_BUCKET/$CI_BUILD_REF_NAME/$PLATFORM - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$PLATFORM/parity --body target/release/parity - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$PLATFORM/parity.md5 --body parity.md5 - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$PLATFORM/"parity-"$VER"-macos-installer.pkg" --body "parity-"$VER"-macos-installer.pkg" - aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$PLATFORM/"parity-"$VER"-macos-installer.pkg.md5" --body "parity-"$VER"-macos-installer.pkg.md5" - curl --data "commit=$CI_BUILD_REF&sha3=$SHA3&filename=parity&secret=$RELEASES_SECRET" http://update.parity.io:1337/push-build/$CI_BUILD_REF_NAME/$PLATFORM - curl --data "commit=$CI_BUILD_REF&sha3=$SHA3&filename=parity&secret=$RELEASES_SECRET" http://update.parity.io:1338/push-build/$CI_BUILD_REF_NAME/$PLATFORM + script: + - scripts/gitlab-build.sh x86_64-apple-darwin x86_64-apple-darwin macos gcc g++ tags: - osx artifacts: paths: - - target/release/parity + - parity.zip name: "x86_64-apple-darwin_parity" windows: cache: @@ -494,62 +172,12 @@ windows: - stable - triggers script: - - set PLATFORM=x86_64-pc-windows-msvc - - set INCLUDE=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include;C:\vs2015\VC\include;C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt - - set LIB=C:\vs2015\VC\lib;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10240.0\ucrt\x64 - - set RUST_BACKTRACE=1 - - set RUSTFLAGS=%RUSTFLAGS% - - rustup default stable-x86_64-pc-windows-msvc - - cargo clean - - cargo build --features final --release #%CARGOFLAGS% - - cargo build --release -p ethstore-cli #%CARGOFLAGS% - - cargo build --release -p ethkey-cli #%CARGOFLAGS% - - cargo build --release -p evmbin #%CARGOFLAGS% - - signtool sign /f %keyfile% /p %certpass% target\release\parity.exe - - target\release\parity.exe tools hash target\release\parity.exe > parity.sha3 - - set /P SHA3= InstallParity.exe.md5 - - zip win-installer.zip InstallParity.exe InstallParity.exe.md5 - - md5sums win-installer.zip > win-installer.zip.md5 - - cd ..\target\release\ - - md5sums parity.exe > parity.exe.md5 - - zip parity.zip parity.exe parity.md5 - - md5sums parity.zip > parity.zip.md5 - - cd ..\.. - - aws configure set aws_access_key_id %s3_key% - - aws configure set aws_secret_access_key %s3_secret% - - echo %CI_BUILD_REF_NAME% - - echo %CI_BUILD_REF_NAME% | findstr /R "master" >nul 2>&1 && set S3_BUCKET=builds-parity-published|| set S3_BUCKET=builds-parity - - echo %CI_BUILD_REF_NAME% | findstr /R "beta" >nul 2>&1 && set S3_BUCKET=builds-parity-published|| set S3_BUCKET=builds-parity - - echo %CI_BUILD_REF_NAME% | findstr /R "stable" >nul 2>&1 && set S3_BUCKET=builds-parity-published|| set S3_BUCKET=builds-parity - - echo %CI_BUILD_REF_NAME% | findstr /R "nightly" >nul 2>&1 && set S3_BUCKET=builds-parity-published|| set S3_BUCKET=builds-parity - - echo %S3_BUCKET% - - aws s3 rm --recursive s3://%S3_BUCKET%/%CI_BUILD_REF_NAME%/x86_64-pc-windows-msvc - - aws s3api put-object --bucket %S3_BUCKET% --key %CI_BUILD_REF_NAME%/x86_64-pc-windows-msvc/parity.exe --body target\release\parity.exe - - aws s3api put-object --bucket %S3_BUCKET% --key %CI_BUILD_REF_NAME%/x86_64-pc-windows-msvc/parity.exe.md5 --body target\release\parity.exe.md5 - - aws s3api put-object --bucket %S3_BUCKET% --key %CI_BUILD_REF_NAME%/x86_64-pc-windows-msvc/parity.zip --body target\release\parity.zip - - aws s3api put-object --bucket %S3_BUCKET% --key %CI_BUILD_REF_NAME%/x86_64-pc-windows-msvc/parity.zip.md5 --body target\release\parity.zip.md5 - - aws s3api put-object --bucket %S3_BUCKET% --key %CI_BUILD_REF_NAME%/x86_64-pc-windows-msvc/InstallParity.exe --body nsis\InstallParity.exe - - aws s3api put-object --bucket %S3_BUCKET% --key %CI_BUILD_REF_NAME%/x86_64-pc-windows-msvc/InstallParity.exe.md5 --body nsis\InstallParity.exe.md5 - - aws s3api put-object --bucket %S3_BUCKET% --key %CI_BUILD_REF_NAME%/x86_64-pc-windows-msvc/win-installer.zip --body nsis\win-installer.zip - - aws s3api put-object --bucket %S3_BUCKET% --key %CI_BUILD_REF_NAME%/x86_64-pc-windows-msvc/win-installer.zip.md5 --body nsis\win-installer.zip.md5 - - curl --data "commit=%CI_BUILD_REF%&sha3=%SHA3%&filename=parity.exe&secret=%RELEASES_SECRET%" http://update.parity.io:1337/push-build/%CI_BUILD_REF_NAME%/%PLATFORM% - - curl --data "commit=%CI_BUILD_REF%&sha3=%SHA3%&filename=parity.exe&secret=%RELEASES_SECRET%" http://update.parity.io:1338/push-build/%CI_BUILD_REF_NAME%/%PLATFORM% + - sh scripts/gitlab-build.sh x86_64-pc-windows-msvc x86_64-pc-windows-msvc installer "" "" "" tags: - rust-windows artifacts: paths: - - target/release/parity.exe - - target/release/parity.pdb - - nsis/InstallParity.exe + - parity.zip name: "x86_64-pc-windows-msvc_parity" docker-build: stage: build @@ -559,10 +187,10 @@ docker-build: before_script: - docker info script: - - if [ "$CI_BUILD_REF_NAME" == "beta-release" ]; then DOCKER_TAG="latest"; else DOCKER_TAG=$CI_BUILD_REF_NAME; fi + - DOCKER_TAG=$CI_BUILD_REF_NAME - echo "Tag:" $DOCKER_TAG - docker login -u $Docker_Hub_User_Parity -p $Docker_Hub_Pass_Parity - - sh scripts/docker-build.sh $DOCKER_TAG + - scripts/docker-build.sh $DOCKER_TAG - docker logout tags: - docker @@ -571,63 +199,16 @@ test-coverage: only: - master script: - - git submodule update --init --recursive - - rm -rf target/* - - rm -rf js/.coverage - - scripts/cov.sh - # - COVERAGE=$(grep -Po 'covered":.*?[^\\]"' target/cov/index.json | grep "[0-9]*\.[0-9]" -o) - # - echo "Coverage:" $COVERAGE + - scripts/gitlab-test.sh test-coverage tags: - kcov allow_failure: true -test-darwin: - stage: test - only: - - triggers - variables: - RUST_BACKTRACE: 1 - script: - - git submodule update --init --recursive - - if [ $RUST_FILES_MODIFIED -eq 0 ]; then echo "Skipping Rust tests since no Rust files modified."; else ./test.sh $CARGOFLAGS; fi - tags: - - osx - allow_failure: true -test-windows: - stage: test - only: - - triggers - variables: - RUST_BACKTRACE: 1 - script: - - git submodule update --init --recursive - - echo cargo test --features json-tests -p rlp -p ethash -p ethcore -p ethcore-bigint -p parity-dapps -p parity-rpc -p ethcore-util -p ethcore-network -p ethcore-io -p ethkey -p ethstore -p ethsync -p ethcore-ipc -p ethcore-ipc-tests -p ethcore-ipc-nano -p parity-rpc-client -p parity %CARGOFLAGS% --verbose --release - tags: - - rust-windows - allow_failure: true test-rust-stable: stage: test image: parity/rust:gitlab-ci - variables: - RUST_BACKTRACE: 1 script: - - git submodule update --init --recursive - - rustup show - - if [ $RUST_FILES_MODIFIED -eq 0 ]; then echo "Skipping Rust tests since no Rust files modified."; else ./test.sh $CARGOFLAGS; fi - - if [ "$CI_BUILD_REF_NAME" == "nightly" ]; then sh scripts/aura-test.sh; fi + - scripts/gitlab-test.sh stable tags: - - rust - - rust-stable -js-test: - stage: test - image: parity/rust:gitlab-ci - script: - - git submodule update --init --recursive - - if [ $JS_FILES_MODIFIED -eq 0 ]; then echo "Skipping JS deps install since no JS files modified."; else ./js/scripts/install-deps.sh;fi - - if [ $JS_OLD_FILES_MODIFIED -eq 0 ]; then echo "Skipping JS (old) deps install since no JS files modified."; else ./js-old/scripts/install-deps.sh;fi - - if [ $JS_FILES_MODIFIED -eq 0 ]; then echo "Skipping JS lint since no JS files modified."; else ./js/scripts/lint.sh && ./js/scripts/test.sh && ./js/scripts/build.sh; fi - - if [ $JS_OLD_FILES_MODIFIED -eq 0 ]; then echo "Skipping JS (old) lint since no JS files modified."; else ./js-old/scripts/lint.sh && ./js-old/scripts/test.sh && ./js-old/scripts/build.sh; fi - tags: - - rust - rust-stable test-rust-beta: stage: test @@ -635,14 +216,9 @@ test-rust-beta: - triggers - master image: parity/rust:gitlab-ci - variables: - RUST_BACKTRACE: 1 script: - - git submodule update --init --recursive - - rustup default beta - - if [ $RUST_FILES_MODIFIED -eq 0 ]; then echo "Skipping Rust tests since no Rust files modified."; else ./test.sh $CARGOFLAGS; fi + - scripts/gitlab-test.sh beta tags: - - rust - rust-beta allow_failure: true test-rust-nightly: @@ -651,16 +227,19 @@ test-rust-nightly: - triggers - master image: parity/rust:gitlab-ci - variables: - RUST_BACKTRACE: 1 script: - - git submodule update --init --recursive - - rustup default nightly - - if [ $RUST_FILES_MODIFIED -eq 0 ]; then echo "Skipping Rust tests since no Rust files modified."; else ./test.sh $CARGOFLAGS; fi + - scripts/gitlab-test.sh nightly tags: - rust - rust-nightly allow_failure: true +js-test: + stage: test + image: parity/rust:gitlab-ci + script: + - scripts/gitlab-test.sh js-test + tags: + - rust-stable js-release: stage: js-build only: @@ -671,16 +250,7 @@ js-release: - triggers image: parity/rust:gitlab-ci script: - - rustup default stable - - echo $JS_FILES_MODIFIED - - if [ $JS_FILES_MODIFIED -eq 0 ]; then echo "Skipping JS deps install since no JS files modified."; else ./js/scripts/install-deps.sh;fi - - if [ $JS_FILES_MODIFIED -eq 0 ]; then echo "Skipping JS rebuild since no JS files modified."; else ./js/scripts/build.sh && ./js/scripts/push-precompiled.sh; fi - - - echo $JS_OLD_FILES_MODIFIED - - if [ $JS_OLD_FILES_MODIFIED -eq 0 ]; then echo "Skipping JS (old) deps install since no JS files modified."; else ./js-old/scripts/install-deps.sh;fi - - if [ $JS_OLD_FILES_MODIFIED -eq 0 ]; then echo "Skipping JS (old) rebuild since no JS files modified."; else ./js-old/scripts/build.sh && ./js-old/scripts/push-precompiled.sh; fi - - - if [ $JS_FILES_MODIFIED -eq 0 ] && [ $JS_OLD_FILES_MODIFIED -eq 0 ]; then echo "Skipping Cargo update since no JS files modified."; else ./js/scripts/push-cargo.sh; fi + - scripts/gitlab-test.sh js-release tags: - javascript push-release: @@ -695,13 +265,3 @@ push-release: - curl --data "secret=$RELEASES_SECRET" http://update.parity.io:1338/push-release/$CI_BUILD_REF_NAME/$CI_BUILD_REF tags: - curl - -# --------------------------------------------------------------------------- -.functions: &functions | - export JS_FILES_MODIFIED=$(git --no-pager diff --name-only master...$CI_BUILD_REF | grep ^js/ | wc -l) - export JS_OLD_FILES_MODIFIED=$(git --no-pager diff --name-only master...$CI_BUILD_REF | grep ^js-old/ | wc -l) - export RUST_FILES_MODIFIED=$(git --no-pager diff --name-only master...$CI_BUILD_REF | grep -v -e ^js -e ^\\. -e ^LICENSE -e ^README.md -e ^test.sh -e ^windows/ -e ^scripts/ -e^mac/ -e ^nsis/ | wc -l) - -before_script: - - *functions - diff --git a/mac/Parity Ethereum.xcodeproj/project.pbxproj b/mac/Parity Ethereum.xcodeproj/project.pbxproj index 913feec70..2e41be637 100644 --- a/mac/Parity Ethereum.xcodeproj/project.pbxproj +++ b/mac/Parity Ethereum.xcodeproj/project.pbxproj @@ -13,6 +13,8 @@ 0ACF9AC71E30FAB600D5C935 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0ACF9AC51E30FAB600D5C935 /* MainMenu.xib */; }; 0AE564F11E3CE42C00BD01F7 /* GetBSDProcessList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE564F01E3CE42C00BD01F7 /* GetBSDProcessList.swift */; }; 0AED4DA01E3E22F800BF87C0 /* ethstore in CopyFiles */ = {isa = PBXBuildFile; fileRef = 0AED4D9F1E3E22F800BF87C0 /* ethstore */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 84CF92B3200E559900AD6E78 /* parity-evm in CopyFiles */ = {isa = PBXBuildFile; fileRef = 84CF92B2200E559900AD6E78 /* parity-evm */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 84CF92B6200E56AE00AD6E78 /* ethkey in CopyFiles */ = {isa = PBXBuildFile; fileRef = 84CF92B5200E56AE00AD6E78 /* ethkey */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -22,6 +24,8 @@ dstPath = ""; dstSubfolderSpec = 6; files = ( + 84CF92B6200E56AE00AD6E78 /* ethkey in CopyFiles */, + 84CF92B3200E559900AD6E78 /* parity-evm in CopyFiles */, 0AED4DA01E3E22F800BF87C0 /* ethstore in CopyFiles */, 0A7A475D1E3D2CDD0093D1AB /* parity in CopyFiles */, ); @@ -38,6 +42,8 @@ 0ACF9AC81E30FAB600D5C935 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 0AE564F01E3CE42C00BD01F7 /* GetBSDProcessList.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GetBSDProcessList.swift; sourceTree = ""; }; 0AED4D9F1E3E22F800BF87C0 /* ethstore */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; name = ethstore; path = ../target/release/ethstore; sourceTree = ""; }; + 84CF92B2200E559900AD6E78 /* parity-evm */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; name = "parity-evm"; path = "../target/release/parity-evm"; sourceTree = ""; }; + 84CF92B5200E56AE00AD6E78 /* ethkey */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; name = ethkey; path = ../target/release/ethkey; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -54,6 +60,8 @@ 0ACF9AB51E30FAB600D5C935 = { isa = PBXGroup; children = ( + 84CF92B5200E56AE00AD6E78 /* ethkey */, + 84CF92B2200E559900AD6E78 /* parity-evm */, 0AED4D9F1E3E22F800BF87C0 /* ethstore */, 0A7A475C1E3D2CDD0093D1AB /* parity */, 0ACF9AC01E30FAB600D5C935 /* Parity Ethereum */, @@ -110,7 +118,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0800; - LastUpgradeCheck = 0800; + LastUpgradeCheck = 0820; ORGANIZATIONNAME = "Parity Technologies"; TargetAttributes = { 0ACF9ABD1E30FAB600D5C935 = { @@ -192,6 +200,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -241,6 +250,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; diff --git a/mac/Parity.pkgproj b/mac/Parity.pkgproj index 560f8b022..6c411d228 100755 --- a/mac/Parity.pkgproj +++ b/mac/Parity.pkgproj @@ -462,7 +462,7 @@ OVERWRITE_PERMISSIONS VERSION - 1.9.0 + 1.10.0 UUID 2DCD5B81-7BAF-4DA1-9251-6274B089FD36 diff --git a/mac/Parity/AppDelegate.swift b/mac/Parity/AppDelegate.swift index c017e79bd..d65c1d601 100644 --- a/mac/Parity/AppDelegate.swift +++ b/mac/Parity/AppDelegate.swift @@ -1,4 +1,4 @@ -// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// Copyright 2015-2018 Parity Technologies (UK) Ltd. // This file is part of Parity. // Parity is free software: you can redistribute it and/or modify @@ -22,12 +22,12 @@ import Cocoa class AppDelegate: NSObject, NSApplicationDelegate { @IBOutlet weak var statusMenu: NSMenu! @IBOutlet weak var startAtLogonMenuItem: NSMenuItem! - + let statusItem = NSStatusBar.system().statusItem(withLength: NSVariableStatusItemLength) var parityPid: Int32? = nil var commandLine: [String] = [] let defaultDefaults = "{\"fat_db\":false,\"mode\":\"passive\",\"mode.alarm\":3600,\"mode.timeout\":300,\"pruning\":\"fast\",\"tracing\":false}" - + func menuAppPath() -> String { return Bundle.main.executablePath! } @@ -40,20 +40,20 @@ class AppDelegate: NSObject, NSApplicationDelegate { return NSRunningApplication.runningApplications(withBundleIdentifier: Bundle.main.bundleIdentifier!).count > 1 } - + func isParityRunning() -> Bool { if let pid = self.parityPid { return kill(pid, 0) == 0 } return false } - + func killParity() { if let pid = self.parityPid { kill(pid, SIGKILL) } } - + func openUI() { let parity = Process() parity.launchPath = self.parityPath() @@ -61,29 +61,29 @@ class AppDelegate: NSObject, NSApplicationDelegate { parity.arguments!.append("ui") parity.launch() } - + func writeConfigFiles() { let basePath = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first? .appendingPathComponent(Bundle.main.bundleIdentifier!, isDirectory: true) - + if FileManager.default.fileExists(atPath: basePath!.path) { return } - + do { let defaultsFileDir = basePath?.appendingPathComponent("chains").appendingPathComponent("ethereum") let defaultsFile = defaultsFileDir?.appendingPathComponent("user_defaults") - + try FileManager.default.createDirectory(atPath: (defaultsFileDir?.path)!, withIntermediateDirectories: true, attributes: nil) if !FileManager.default.fileExists(atPath: defaultsFile!.path) { try defaultDefaults.write(to: defaultsFile!, atomically: false, encoding: String.Encoding.utf8) } - + let configFile = basePath?.appendingPathComponent("config.toml") } catch {} } - + func autostartEnabled() -> Bool { return itemReferencesInLoginItems().existingReference != nil } @@ -123,7 +123,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { } return (nil, nil) } - + func toggleLaunchAtStartup() { let itemReferences = itemReferencesInLoginItems() let shouldBeToggled = (itemReferences.existingReference == nil) @@ -155,7 +155,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { func launchParity() { self.commandLine = CommandLine.arguments.dropFirst().filter({ $0 != "ui"}) - + let processes = GetBSDProcessList()! let parityProcess = processes.index(where: { var name = $0.kp_proc.p_comm @@ -166,7 +166,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { } return str == "parity" }) - + if parityProcess == nil { let parity = Process() let p = self.parityPath() @@ -178,7 +178,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { self.parityPid = processes[parityProcess!].kp_proc.p_pid } } - + func applicationDidFinishLaunching(_ aNotification: Notification) { if self.isAlreadyRunning() { openUI() @@ -188,12 +188,12 @@ class AppDelegate: NSObject, NSApplicationDelegate { self.writeConfigFiles() self.launchParity() - Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true, block: {_ in + Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true, block: {_ in if !self.isParityRunning() { NSApplication.shared().terminate(self) } }) - + let icon = NSImage(named: "statusIcon") icon?.isTemplate = true // best for dark mode statusItem.image = icon @@ -206,19 +206,18 @@ class AppDelegate: NSObject, NSApplicationDelegate { } return true } - + @IBAction func quitClicked(_ sender: NSMenuItem) { self.killParity() NSApplication.shared().terminate(self) } - + @IBAction func openClicked(_ sender: NSMenuItem) { self.openUI() } - + @IBAction func startAtLogonClicked(_ sender: NSMenuItem) { self.toggleLaunchAtStartup() } } - diff --git a/mac/Parity/Assets.xcassets/AppIcon.appiconset/Parity.png b/mac/Parity/Assets.xcassets/AppIcon.appiconset/Parity.png index 97d5fd1894108b273c1e27902c4efe7f53f9a237..a7f085dab7a3db0028b50aa965f0ddb690affcff 100644 GIT binary patch literal 52644 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 Woc5(X90$rXLPJ&iTG3VOhyMpTW;J#I literal 118116 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 diff --git a/mac/Parity/Assets.xcassets/statusIcon.imageset/Parity-1.png b/mac/Parity/Assets.xcassets/statusIcon.imageset/Parity-1.png index 040d444e2bfc2dc39b2715cf187226f0dd324249..75767ebd7d6fe6b52b9edc86cd76c7528a3b3ee8 100644 GIT binary patch delta 609 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 b+P?w2M=?*bRt94L015yANkvXXu0mjf0%bB? delta 637 zcmV-@0)qX{4Z{VHQGek96b=Pe>I}6vlt=`82FF)55=j z(94K4ZK09E%SDEZbkRZxT9k_d2?HghWg7_u7cNCC2trVZB7-7wQ7Yj=hytT1B#>&Q z8D*B(<}(h{d-i7L>BjkBV7@cwo_pr}x#vQF00FibLYuHh27izRlmofIA}|en1AcDS zkG2BmfEwTxuo~xi1GH^)U~2W}H-N)&oLB_DI%Kzi$VNDGQ5#$aihMWkS@B;$hh&H3?0MjTWX-@2>2{>bnVrBA@K(H28>|3TMlTy^my=7T zekx6*%2VOcYk#F@7f@o1UrC_90~nRg3CXUB_xW|EU4~l4pPE8l4-sGrcrIS7sJ-;# zOcXh_l6Cq6D-=fcKK)AG->-V-XcctE^fyxXOn zn0fyQ%y@NZ*hD7;JORD{yFJ>=QTq>gSsarym&DgP>wlz=^f$}KakmT8flq4nHB10^ zd=B_o;I^L=`LuYQc%cu6CV?0FSyxC?o=1%AfjNVmy8pv|;IU?!Cp=W)=7<*nV+nNk z0@Zq)I0D?$p?J{iq(7t7v>4emP?p4;t5?yU1+FThrTTu%9E^XFXWpX@g|LjQ0$oPl z1T@5PAa-9ik}2ftnt%U%*rS7P%(U?~;5*O=3 ([kinfo_proc]?) { - + var done = false var result: [kinfo_proc]? var err: Int32 - + repeat { let name = [CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0]; let namePointer = name.withUnsafeBufferPointer { UnsafeMutablePointer(mutating: $0.baseAddress) } var length: Int = 0 - + err = sysctl(namePointer, u_int(name.count), nil, &length, nil, 0) if err == -1 { err = errno } - + if err == 0 { let count = length / MemoryLayout.stride result = [kinfo_proc](repeating: kinfo_proc(), count: count) @@ -54,6 +54,6 @@ public func GetBSDProcessList() -> ([kinfo_proc]?) { } } } while err == 0 && !done - + return result } diff --git a/mac/install-readme.txt b/mac/install-readme.txt index a68d18ae9..51f0330bb 100644 --- a/mac/install-readme.txt +++ b/mac/install-readme.txt @@ -3,8 +3,6 @@ Parity Wallet Welcome to Parity Wallet, your all-in-one Ethereum node and wallet. -WARNING: This installer is **EXPERIMENTAL**. Use it at your own risk. - -If you continue, Parity will be installed as a user service. You will be able to use the Parity Wallet through your browser by using the menu bar icon, following the shortcut in the Launchpad or navigating to http://localhost:8080/ in your browser. +If you continue, Parity will be installed as a user service. You will be able to use the Parity Wallet through your browser by using the menu bar icon, following the shortcut in the Launchpad or navigating to http://localhost:8180/ in your browser. Parity is distributed under the terms of the GPL. diff --git a/mac/uninstall-parity.sh b/mac/uninstall-parity.sh index a1575308b..840dba1f6 100755 --- a/mac/uninstall-parity.sh +++ b/mac/uninstall-parity.sh @@ -9,5 +9,4 @@ fi PLIST=~/Library/LaunchAgents/io.parity.ethereum.plist su $SUDO_USER -c "launchctl stop io.parity.ethereum" su $SUDO_USER -c "launchctl unload $PLIST" -rm -f /usr/local/libexec/parity /usr/local/libexec/uninstall-parity.sh /usr/local/bin/ethstore $PLIST - +rm -f /usr/local/libexec/parity /usr/local/libexec/uninstall-parity.sh /usr/local/bin/ethstore /usr/local/bin/ethkey /usr/local/bin/parity-evm $PLIST diff --git a/nsis/installer.nsi b/nsis/installer.nsi index 1e93b2255..03daf3bc2 100644 --- a/nsis/installer.nsi +++ b/nsis/installer.nsi @@ -6,17 +6,17 @@ !define SYNC_TERM 0x00100001 !define APPNAME "Parity" -!define COMPANYNAME "Parity" +!define COMPANYNAME "Parity Technologies" !define DESCRIPTION "Fast, light, robust Ethereum implementation" !define VERSIONMAJOR 1 -!define VERSIONMINOR 9 +!define VERSIONMINOR 10 !define VERSIONBUILD 0 !define ARGS "" !define FIRST_START_ARGS "--mode=passive ui" !addplugindir .\ -!define HELPURL "https://github.com/paritytech/parity/wiki" # "Support Information" link +!define HELPURL "https://paritytech.github.io/wiki/" # "Support Information" link !define UPDATEURL "https://github.com/paritytech/parity/releases" # "Product Updates" link !define ABOUTURL "https://github.com/paritytech/parity" # "Publisher" link !define INSTALLSIZE 26120 @@ -88,14 +88,13 @@ section "install" !insertmacro TerminateApp # Files added here should be removed by the uninstaller (see section "uninstall") - file /oname=parity.exe ..\target\release\parity.exe + file /oname=parity.exe ..\target\x86_64-pc-windows-msvc\release\parity.exe + file /oname=parity-evm.exe ..\target\x86_64-pc-windows-msvc\release\parity-evm.exe + file /oname=ethstore.exe ..\target\x86_64-pc-windows-msvc\release\ethstore.exe + file /oname=ethkey.exe ..\target\x86_64-pc-windows-msvc\release\ethkey.exe file /oname=ptray.exe ..\windows\ptray\x64\Release\ptray.exe file "logo.ico" - file vc_redist.x64.exe - - ExecWait '"$INSTDIR\vc_redist.x64.exe" /passive /norestart' - delete $INSTDIR\vc_redist.x64.exe # Add any other files for the install directory (license files, app data, etc) here # Uninstaller - See function un.onInit and section "uninstall" for configuration @@ -167,6 +166,9 @@ section "uninstall" # Remove files delete $INSTDIR\parity.exe + delete $INSTDIR\parity-evm.exe + delete $INSTDIR\ethstore.exe + delete $INSTDIR\ethkey.exe delete $INSTDIR\ptray.exe delete $INSTDIR\logo.ico @@ -187,4 +189,3 @@ section "uninstall" DeleteRegValue HKLM "Software\Microsoft\Windows\CurrentVersion\Run" "${APPNAME}" DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "${APPNAME}" sectionEnd - diff --git a/scripts/cov.sh b/scripts/cov.sh index 9be89a3df..bd733703c 100755 --- a/scripts/cov.sh +++ b/scripts/cov.sh @@ -12,42 +12,21 @@ ### Running coverage set -x - -KCOV=${1:-kcov} - -if ! type $KCOV > /dev/null; then - echo "Install kcov first (details inside this file). Aborting." - exit 1 -fi - -RUSTFLAGS="-C link-dead-code" cargo test --all --exclude parity-ipfs-api --exclude evmjit --no-run || exit $? - - +RUSTFLAGS="-C link-dead-code" cargo test --all --exclude evmjit --no-run || exit $? KCOV_TARGET="target/cov" KCOV_FLAGS="--verify" -EXCLUDE="/usr/lib,\ -/usr/include,\ -$HOME/.cargo,\ -$HOME/.multirust,\ -rocksdb,\ -secp256k1 -" - -rm -rf $KCOV_TARGET +EXCLUDE="/usr/lib,/usr/include,$HOME/.cargo,$HOME/.multirust,rocksdb,secp256k1" mkdir -p $KCOV_TARGET echo "Cover RUST" for FILE in `find target/debug/deps ! -name "*.*"` -do - $KCOV --exclude-pattern $EXCLUDE $KCOV_FLAGS $KCOV_TARGET $FILE -done - -$KCOV --exclude-pattern $EXCLUDE $KCOV_FLAGS $KCOV_TARGET target/debug/parity-* + do + timeout --signal=SIGKILL 5m kcov --exclude-pattern $EXCLUDE $KCOV_FLAGS $KCOV_TARGET $FILE + done +timeout --signal=SIGKILL 5m kcov --exclude-pattern $EXCLUDE $KCOV_FLAGS $KCOV_TARGET target/debug/parity-* echo "Cover JS" cd js npm install&&npm run test:coverage cd .. -codecov bash <(curl -s https://codecov.io/bash)&& echo "Uploaded code coverage" - exit 0 diff --git a/scripts/gitlab-build.sh b/scripts/gitlab-build.sh new file mode 100755 index 000000000..876658822 --- /dev/null +++ b/scripts/gitlab-build.sh @@ -0,0 +1,292 @@ +#!/bin/bash + +set -e # fail on any error +set -u # treat unset variables as error +#ARGUMENTS: 1. BUILD_PLATFORM (target for binaries) 2. PLATFORM (target for cargo) 3. ARC (architecture) 4. & 5. CC & CXX flags +BUILD_PLATFORM=$1 +PLATFORM=$2 +ARC=$3 +CC=$4 +CXX=$5 +VER="$(grep -m 1 version Cargo.toml | awk '{print $3}' | tr -d '"' | tr -d "\n")" +S3WIN="" +echo "--------------------" +echo "Build for platform: " $BUILD_PLATFORM +echo "Cargo target: " $PLATFORM +echo "CC&CXX flags: " $CC ", " $CXX +echo "Architecture: " $ARC +echo "Libssl version: " $LIBSSL +echo "Parity version: " $VER +echo "Branch: " $CI_BUILD_REF_NAME +echo "--------------------" + +set_env () { + echo "Set ENVIROMENT" + export HOST_CC=gcc + export HOST_CXX=g++ + rm -rf .cargo + mkdir -p .cargo + echo "[target.$PLATFORM]" >> .cargo/config + echo "linker= \"$CC\"" >> .cargo/config + cat .cargo/config +} +set_env_win () { + set PLATFORM=x86_64-pc-windows-msvc + set INCLUDE="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include;C:\vs2015\VC\include;C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt" + set LIB="C:\vs2015\VC\lib;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10240.0\ucrt\x64" + set RUST_BACKTRACE=1 + #export RUSTFLAGS=$RUSTFLAGS + rustup default stable-x86_64-pc-windows-msvc + echo "MsBuild.exe windows\ptray\ptray.vcxproj /p:Platform=x64 /p:Configuration=Release" > msbuild.cmd + echo "@ signtool sign /f "\%"1 /p "\%"2 /tr http://timestamp.comodoca.com /du https://parity.io "\%"3" > sign.cmd +} +build () { + echo "Build parity:" + cargo build --target $PLATFORM --features final --release + echo "Build evmbin:" + cargo build --target $PLATFORM --release -p evmbin + echo "Build ethstore-cli:" + cargo build --target $PLATFORM --release -p ethstore-cli + echo "Build ethkey-cli:" + cargo build --target $PLATFORM --release -p ethkey-cli +} +strip_md5 () { + echo "Strip binaries:" + $STRIP_BIN -v target/$PLATFORM/release/parity + $STRIP_BIN -v target/$PLATFORM/release/parity-evm + $STRIP_BIN -v target/$PLATFORM/release/ethstore + $STRIP_BIN -v target/$PLATFORM/release/ethkey; + export SHA3=$(rhash --sha3-256 target/$PLATFORM/release/parity -p %h) + echo "Checksum calculation:" + rm -rf *.md5 + export SHA3=$(rhash --sha3-256 target/$PLATFORM/release/parity -p %h) + echo "Parity file SHA3:" $SHA3 + md5sum target/$PLATFORM/release/parity > parity.md5 + md5sum target/$PLATFORM/release/parity-evm > parity-evm.md5 + md5sum target/$PLATFORM/release/ethstore > ethstore.md5 + md5sum target/$PLATFORM/release/ethkey > ethkey.md5 +} +make_deb () { + rm -rf deb + echo "create DEBIAN files" + mkdir -p deb/usr/bin/ + mkdir -p deb/DEBIAN + echo "create copyright, docs, compat" + cp LICENSE deb/DEBIAN/copyright + echo "https://github.com/paritytech/parity/wiki" >> deb/DEBIAN/docs + echo "8" >> deb/DEBIAN/compat + echo "create control file" + control=deb/DEBIAN/control + echo "Package: parity" >> $control + echo "Version: $VER" >> $control + echo "Source: parity" >> $control + echo "Section: science" >> $control + echo "Priority: extra" >> $control + echo "Maintainer: Parity Technologies " >> $control + echo "Build-Depends: debhelper (>=9)" >> $control + echo "Standards-Version: 3.9.5" >> $control + echo "Homepage: https://parity.io" >> $control + echo "Vcs-Git: git://github.com/paritytech/parity.git" >> $control + echo "Vcs-Browser: https://github.com/paritytech/parity" >> $control + echo "Architecture: $ARC" >> $control + echo "Depends: $LIBSSL" >> $control + echo "Description: Ethereum network client by Parity Technologies" >> $control + size=`du deb/|awk 'END {print $1}'` + echo "Installed-Size: $size" >> $control + echo "build .deb package" + cp target/$PLATFORM/release/parity deb/usr/bin/parity + cp target/$PLATFORM/release/parity-evm deb/usr/bin/parity-evm + cp target/$PLATFORM/release/ethstore deb/usr/bin/ethstore + cp target/$PLATFORM/release/ethkey deb/usr/bin/ethkey + dpkg-deb -b deb "parity_"$VER"_"$ARC".deb" + md5sum "parity_"$VER"_"$ARC".deb" > "parity_"$VER"_"$ARC".deb.md5" +} +make_rpm () { + rm -rf /install + mkdir -p /install/usr/bin + cp target/$PLATFORM/release/parity /install/usr/bin + cp target/$PLATFORM/release/parity-evm /install/usr/bin/parity-evm + cp target/$PLATFORM/release/ethstore /install/usr/bin/ethstore + cp target/$PLATFORM/release/ethkey /install/usr/bin/ethkey + fpm -s dir -t rpm -n parity -v $VER --epoch 1 --license GPLv3 -d openssl --provides parity --url https://parity.io --vendor "Parity Technologies" -a x86_64 -m "" --description "Ethereum network client by Parity Technologies" -C /install/ + cp "parity-"$VER"-1."$ARC".rpm" "parity_"$VER"_"$ARC".rpm" + md5sum "parity_"$VER"_"$ARC".rpm" > "parity_"$VER"_"$ARC".rpm.md5" +} +make_pkg () { + echo "make PKG" + cp target/$PLATFORM/release/parity target/release/parity + cp target/$PLATFORM/release/parity-evm target/release/parity-evm + cp target/$PLATFORM/release/ethstore target/release/ethstore + cp target/$PLATFORM/release/ethkey target/release/ethkey + cd mac + xcodebuild -configuration Release + cd .. + packagesbuild -v mac/Parity.pkgproj + productsign --sign 'Developer ID Installer: PARITY TECHNOLOGIES LIMITED (P2PX3JU8FT)' target/release/Parity\ Ethereum.pkg target/release/Parity\ Ethereum-signed.pkg + mv target/release/Parity\ Ethereum-signed.pkg "parity_"$VER"_"$ARC".pkg" + md5sum "parity_"$VER"_"$ARC"."$EXT >> "parity_"$VER"_"$ARC".pkg.md5" +} +make_exe () { + ./sign.cmd $keyfile $certpass "target/$PLATFORM/release/parity.exe" + SHA3=$(rhash --sha3-256 target/$PLATFORM/release/parity.exe -p %h) + echo "Checksum calculation:" + rm -rf *.md5 + echo "Parity file SHA3:" $SHA3 + rhash --md5 target/$PLATFORM/release/parity.exe -p %h > parity.exe.md5 + rhash --md5 target/$PLATFORM/release/parity-evm.exe -p %h > parity-evm.exe.md5 + rhash --md5 target/$PLATFORM/release/ethstore.exe -p %h > ethstore.exe.md5 + rhash --md5 target/$PLATFORM/release/ethkey.exe -p %h > ethkey.exe.md5 + ./msbuild.cmd + ./sign.cmd $keyfile $certpass windows/ptray/x64/release/ptray.exe + cd nsis + curl -sL --url "https://github.com/paritytech/win-build/raw/master/vc_redist.x64.exe" -o vc_redist.x64.exe + echo "makensis.exe installer.nsi" > nsis.cmd + ./nsis.cmd + cd .. + cp nsis/installer.exe "parity_"$VER"_"$ARC"."$EXT + ./sign.cmd $keyfile $certpass "parity_"$VER"_"$ARC"."$EXT + rhash --md5 "parity_"$VER"_"$ARC"."$EXT -p %h > "parity_"$VER"_"$ARC"."$EXT".md5" +} +push_binaries () { + echo "Push binaries to AWS S3" + aws configure set aws_access_key_id $s3_key + aws configure set aws_secret_access_key $s3_secret + if [[ "$CI_BUILD_REF_NAME" = "master" || "$CI_BUILD_REF_NAME" = "beta" || "$CI_BUILD_REF_NAME" = "stable" || "$CI_BUILD_REF_NAME" = "nightly" ]]; + then + export S3_BUCKET=builds-parity-published; + else + export S3_BUCKET=builds-parity; + fi + aws s3 rm --recursive s3://$S3_BUCKET/$CI_BUILD_REF_NAME/$BUILD_PLATFORM + aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$BUILD_PLATFORM/parity$S3WIN --body target/$PLATFORM/release/parity$S3WIN + aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$BUILD_PLATFORM/parity$S3WIN.md5 --body parity$S3WIN.md5 + aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$BUILD_PLATFORM/parity-evm$S3WIN --body target/$PLATFORM/release/parity-evm$S3WIN + aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$BUILD_PLATFORM/parity-evm$S3WIN.md5 --body parity-evm$S3WIN.md5 + aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$BUILD_PLATFORM/ethstore$S3WIN --body target/$PLATFORM/release/ethstore$S3WIN + aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$BUILD_PLATFORM/ethstore$S3WIN.md5 --body ethstore$S3WIN.md5 + aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$BUILD_PLATFORM/ethkey$S3WIN --body target/$PLATFORM/release/ethkey$S3WIN + aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$BUILD_PLATFORM/ethkey$S3WIN.md5 --body ethkey$S3WIN.md5 + aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$BUILD_PLATFORM/"parity_"$VER"_"$ARC"."$EXT --body "parity_"$VER"_"$ARC"."$EXT + aws s3api put-object --bucket $S3_BUCKET --key $CI_BUILD_REF_NAME/$BUILD_PLATFORM/"parity_"$VER"_"$ARC"."$EXT".md5" --body "parity_"$VER"_"$ARC"."$EXT".md5" +} +make_archive () { + echo "add artifacts to archive" + rm -rf parity.zip + zip -r parity.zip target/$PLATFORM/release/parity$S3WIN target/$PLATFORM/release/parity-evm$S3WIN target/$PLATFORM/release/ethstore$S3WIN target/$PLATFORM/release/ethkey$S3WIN parity$S3WIN.md5 parity-evm$S3WIN.md5 ethstore$S3WIN.md5 ethkey$S3WIN.md5 +} +push_release () { + echo "push release" + curl --data "commit=$CI_BUILD_REF&sha3=$SHA3&filename=parity&secret=$RELEASES_SECRET" http://update.parity.io:1337/push-build/$CI_BUILD_REF_NAME/$PLATFORM + curl --data "commit=$CI_BUILD_REF&sha3=$SHA3&filename=parity&secret=$RELEASES_SECRET" http://update.parity.io:1338/push-build/$CI_BUILD_REF_NAME/$PLATFORM +} +case $BUILD_PLATFORM in + x86_64-unknown-linux-gnu) + #set strip bin + STRIP_BIN="strip" + #package extention + EXT="deb" + build + strip_md5 + make_deb + make_archive + push_binaries + push_release + ;; + x86_64-unknown-debian-gnu) + STRIP_BIN="strip" + EXT="deb" + LIBSSL="libssl1.1 (>=1.1.0)" + echo "Use libssl1.1 (>=1.1.0) for Debian builds" + build + strip_md5 + make_deb + make_archive + push_binaries + push_release + ;; + x86_64-unknown-centos-gnu) + STRIP_BIN="strip" + EXT="rpm" + build + strip_md5 + make_rpm + make_archive + push_binaries + push_release + ;; + i686-unknown-linux-gnu) + STRIP_BIN="strip" + EXT="deb" + set_env + build + strip_md5 + make_deb + make_archive + push_binaries + push_release + ;; + armv7-unknown-linux-gnueabihf) + STRIP_BIN="arm-linux-gnueabihf-strip" + EXT="deb" + set_env + build + strip_md5 + make_deb + make_archive + push_binaries + push_release + ;; + arm-unknown-linux-gnueabihf) + STRIP_BIN="arm-linux-gnueabihf-strip" + EXT="deb" + set_env + build + strip_md5 + make_deb + make_archive + push_binaries + push_release + ;; + aarch64-unknown-linux-gnu) + STRIP_BIN="aarch64-linux-gnu-strip" + EXT="deb" + set_env + build + strip_md5 + make_deb + make_archive + push_binaries + push_release + ;; + x86_64-apple-darwin) + STRIP_BIN="strip" + PLATFORM="x86_64-apple-darwin" + EXT="pkg" + build + strip_md5 + make_pkg + make_archive + push_binaries + push_release + ;; + x86_64-unknown-snap-gnu) + cd snap + ARC="amd64" + EXT="snap" + rm -rf *snap + sed -i 's/master/'"$VER"'/g' snapcraft.yaml + snapcraft + cp "parity_"$CI_BUILD_REF_NAME"_amd64.snap" "parity_"$VER"_amd64.snap" + md5sum "parity_"$VER"_amd64.snap" > "parity_"$VER"_amd64.snap.md5" + push_binaries + ;; + x86_64-pc-windows-msvc) + set_env_win + EXT="exe" + S3WIN=".exe" + build + make_exe + make_archive + push_binaries + push_release +esac diff --git a/scripts/gitlab-test.sh b/scripts/gitlab-test.sh new file mode 100755 index 000000000..1d7e18806 --- /dev/null +++ b/scripts/gitlab-test.sh @@ -0,0 +1,102 @@ +#!/bin/bash +#ARGUMENT test for RUST, JS, COVERAGE or JS_RELEASE +set -e # fail on any error +set -u # treat unset variables as error + +export JS_FILES_MODIFIED="$(git --no-pager diff --name-only $GIT_COMPARE...$CI_COMMIT_SHA | grep ^js/ | wc -l)" +export JS_OLD_FILES_MODIFIED="$(git --no-pager diff --name-only $GIT_COMPARE...$CI_COMMIT_SHA | grep ^js-old/ | wc -l)" +export RUST_FILES_MODIFIED="$(git --no-pager diff --name-only $GIT_COMPARE...$CI_COMMIT_SHA | grep -v -e ^js -e ^\\. -e ^LICENSE -e ^README.md -e ^test.sh -e ^windows/ -e ^scripts/ -e ^mac/ -e ^nsis/ | wc -l)" +echo "RUST_FILES_MODIFIED: $RUST_FILES_MODIFIED" +echo "JS_FILES_MODIFIED: $JS_FILES_MODIFIED" +echo "JS_OLD_FILES_MODIFIED: $JS_OLD_FILES_MODIFIED" +if [[ "$CI_COMMIT_REF_NAME" = "beta" || "$CI_COMMIT_REF_NAME" = "stable" ]]; then + export GIT_COMPARE=$CI_COMMIT_REF_NAME; +else + export GIT_COMPARE=master; +fi +echo "RUST_FILES_MODIFIED: $RUST_FILES_MODIFIED" +echo "JS_FILES_MODIFIED: $JS_FILES_MODIFIED" +echo "JS_OLD_FILES_MODIFIED: $JS_OLD_FILES_MODIFIED" +TEST_SWITCH=$1 +rust_test () { + git submodule update --init --recursive + rustup show + if [[ "${RUST_FILES_MODIFIED}" == "0" ]]; + then echo "Skipping Rust tests since no Rust files modified."; + else ./test.sh; + fi + if [[ "$CI_COMMIT_REF_NAME" == "nightly" ]]; + then sh scripts/aura-test.sh; + fi +} +js_test () { + git submodule update --init --recursive + if [[ "${JS_FILES_MODIFIED}" == "0" ]]; + then echo "Skipping JS deps install since no JS files modified."; + else ./js/scripts/install-deps.sh; + fi + if [[ "${JS_OLD_FILES_MODIFIED}" == "0" ]]; + then echo "Skipping JS (old) deps install since no JS files modified."; + else ./js-old/scripts/install-deps.sh; + fi + if [[ "${JS_FILES_MODIFIED}" == "0" ]]; + then echo "Skipping JS lint since no JS files modified."; + else ./js/scripts/lint.sh && ./js/scripts/test.sh && ./js/scripts/build.sh; + fi + if [[ "${JS_OLD_FILES_MODIFIED}" == "0" ]]; + then echo "Skipping JS (old) lint since no JS files modified."; + else ./js-old/scripts/lint.sh && ./js-old/scripts/test.sh && ./js-old/scripts/build.sh; + fi +} +js_release () { + rustup default stable + if [[ "${JS_FILES_MODIFIED}" == "0" ]]; + then echo "Skipping JS deps install since no JS files modified."; + else ./js/scripts/install-deps.sh; + fi + if [[ "${JS_FILES_MODIFIED}" == "0" ]]; + then echo "Skipping JS rebuild since no JS files modified."; + else ./js/scripts/build.sh && ./js/scripts/push-precompiled.sh; + fi + if [[ "${JS_OLD_FILES_MODIFIED}" == "0" ]]; + then echo "Skipping JS (old) deps install since no JS files modified."; + else ./js-old/scripts/install-deps.sh; + fi + if [[ "${JS_OLD_FILES_MODIFIED}" == "0" ]]; + then echo "Skipping JS (old) rebuild since no JS files modified."; + else ./js-old/scripts/build.sh && ./js-old/scripts/push-precompiled.sh; + fi + if [[ "${JS_FILES_MODIFIED}" == "0" ]] && [[ "${JS_OLD_FILES_MODIFIED}" == "0" ]]; + then echo "Skipping Cargo update since no JS files modified."; + else ./js/scripts/push-cargo.sh; + fi +} +coverage_test () { + git submodule update --init --recursive + rm -rf target/* + rm -rf js/.coverage + scripts/cov.sh +} +case $TEST_SWITCH in + stable ) + rustup default stable + rust_test + ;; + beta) + rustup default beta + rust_test + ;; + nightly) + rustup default nightly + rust_test + ;; + js-test) + js_test + ;; + js-release) + js_release + ;; + test-coverage) + coverage_test + ;; +esac diff --git a/scripts/snapcraft.yaml b/scripts/snapcraft.yaml index bd71df3de..3f4cf80ea 100644 --- a/scripts/snapcraft.yaml +++ b/scripts/snapcraft.yaml @@ -17,6 +17,6 @@ apps: parts: parity: - source: .. + source: . plugin: rust - build-packages: [g++, libudev-dev, libssl-dev, make, pkg-config] \ No newline at end of file + build-packages: [g++, libudev-dev, libssl-dev, make, pkg-config]