diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 32161b1..b51dc12 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -3,10 +3,12 @@ name: android on: push: branches: - - "mobile-staging" - "release/**" + tags: + - "v*" + jobs: - test: + build_and_publish: runs-on: ubuntu-20.04 steps: - uses: actions/setup-go@v1 @@ -23,4 +25,14 @@ jobs: PSIPHON_CONFIG_KEY: ${{ secrets.PSIPHON_CONFIG_KEY }} PSIPHON_CONFIG_JSON_AGE_BASE64: ${{ secrets.PSIPHON_CONFIG_JSON_AGE_BASE64 }} - - run: ./mk ./MOBILE/android/oonimkall.aar + - run: ./mk ./MOBILE/android + + - run: | + tag=$(echo $GITHUB_REF | sed 's|refs/tags/||g') + gh release create -p $tag --target $GITHUB_SHA || true + gh release upload $tag --clobber ./MOBILE/android/oonimkall.aar \ + ./MOBILE/android/oonimkall-sources.jar \ + ./MOBILE/android/oonimkall.pom + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/ios.yml b/.github/workflows/ios.yml index d8d92d9..f6c2f4a 100644 --- a/.github/workflows/ios.yml +++ b/.github/workflows/ios.yml @@ -3,10 +3,12 @@ name: ios on: push: branches: - - "mobile-staging" - "release/**" + tags: + - "v*" + jobs: - test: + build_and_publish: runs-on: macos-10.15 steps: - uses: actions/setup-go@v1 @@ -23,4 +25,13 @@ jobs: PSIPHON_CONFIG_KEY: ${{ secrets.PSIPHON_CONFIG_KEY }} PSIPHON_CONFIG_JSON_AGE_BASE64: ${{ secrets.PSIPHON_CONFIG_JSON_AGE_BASE64 }} - - run: ./mk XCODE_VERSION=12.4 ./MOBILE/ios/oonimkall.xcframework.zip + - run: ./mk XCODE_VERSION=12.4 ./MOBILE/ios + + - run: | + tag=$(echo $GITHUB_REF | sed 's|refs/tags/||g') + gh release create -p $tag --target $GITHUB_SHA || true + gh release upload $tag --clobber ./MOBILE/ios/oonimkall.xcframework.zip \ + ./MOBILE/ios/oonimkall.podspec + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 2cd8473..ee4c0b3 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -4,10 +4,11 @@ on: push: branches: - "release/**" - - "ooniprobe-staging" + tags: + - "v*" jobs: - build_386: + build_and_publish_386: runs-on: "ubuntu-20.04" steps: - uses: actions/checkout@v2 @@ -19,16 +20,18 @@ jobs: env: PSIPHON_CONFIG_KEY: ${{ secrets.PSIPHON_CONFIG_KEY }} PSIPHON_CONFIG_JSON_AGE_BASE64: ${{ secrets.PSIPHON_CONFIG_JSON_AGE_BASE64 }} - - run: ./mk DEBIAN_TILDE_VERSION=$GITHUB_RUN_NUMBER ./debian/386 - - run: ./E2E/ooniprobe.sh ./CLI/linux/386/ooniprobe - - run: ./CLI/linux/pubdebian - if: github.ref == 'refs/heads/ooniprobe-staging' + - run: ./mk ./CLI/ooniprobe-linux-386 + - run: ./E2E/ooniprobe.sh ./CLI/ooniprobe-linux-386 + - run: | + tag=$(echo $GITHUB_REF | sed 's|refs/tags/||g') + gh release create -p $tag --target $GITHUB_SHA || true + gh release upload $tag --clobber ./CLI/ooniprobe-linux-386 + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - DEB_GPG_KEY: ${{ secrets.DEB_GPG_KEY }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - build_amd64: + + build_and_publish_amd64: runs-on: "ubuntu-20.04" steps: - uses: actions/checkout@v2 @@ -40,16 +43,17 @@ jobs: env: PSIPHON_CONFIG_KEY: ${{ secrets.PSIPHON_CONFIG_KEY }} PSIPHON_CONFIG_JSON_AGE_BASE64: ${{ secrets.PSIPHON_CONFIG_JSON_AGE_BASE64 }} - - run: ./mk DEBIAN_TILDE_VERSION=$GITHUB_RUN_NUMBER ./debian/amd64 - - run: ./E2E/ooniprobe.sh ./CLI/linux/amd64/ooniprobe - - run: ./CLI/linux/pubdebian - if: github.ref == 'refs/heads/ooniprobe-staging' + - run: ./mk ./CLI/ooniprobe-linux-amd64 + - run: ./E2E/ooniprobe.sh ./CLI/ooniprobe-linux-amd64 + - run: | + tag=$(echo $GITHUB_REF | sed 's|refs/tags/||g') + gh release create -p $tag --target $GITHUB_SHA || true + gh release upload $tag --clobber ./CLI/ooniprobe-linux-amd64 + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - DEB_GPG_KEY: ${{ secrets.DEB_GPG_KEY }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - build_arm: + build_and_publish_armv7: runs-on: "ubuntu-20.04" steps: - uses: actions/checkout@v2 @@ -63,16 +67,17 @@ jobs: env: PSIPHON_CONFIG_KEY: ${{ secrets.PSIPHON_CONFIG_KEY }} PSIPHON_CONFIG_JSON_AGE_BASE64: ${{ secrets.PSIPHON_CONFIG_JSON_AGE_BASE64 }} - - run: ./mk DEBIAN_TILDE_VERSION=$GITHUB_RUN_NUMBER ./debian/arm - - run: ./E2E/ooniprobe.sh ./CLI/linux/arm/ooniprobe - - run: ./CLI/linux/pubdebian - if: github.ref == 'refs/heads/ooniprobe-staging' + - run: ./mk ./CLI/ooniprobe-linux-armv7 + - run: ./E2E/ooniprobe.sh ./CLI/ooniprobe-linux-armv7 + - run: | + tag=$(echo $GITHUB_REF | sed 's|refs/tags/||g') + gh release create -p $tag --target $GITHUB_SHA || true + gh release upload $tag --clobber ./CLI/ooniprobe-linux-armv7 + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - DEB_GPG_KEY: ${{ secrets.DEB_GPG_KEY }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - build_arm64: + build_and_publish_arm64: runs-on: "ubuntu-20.04" steps: - uses: actions/checkout@v2 @@ -86,11 +91,12 @@ jobs: env: PSIPHON_CONFIG_KEY: ${{ secrets.PSIPHON_CONFIG_KEY }} PSIPHON_CONFIG_JSON_AGE_BASE64: ${{ secrets.PSIPHON_CONFIG_JSON_AGE_BASE64 }} - - run: ./mk DEBIAN_TILDE_VERSION=$GITHUB_RUN_NUMBER ./debian/arm64 - - run: ./E2E/ooniprobe.sh ./CLI/linux/arm64/ooniprobe - - run: ./CLI/linux/pubdebian - if: github.ref == 'refs/heads/ooniprobe-staging' + - run: ./mk ./CLI/ooniprobe-linux-arm64 + - run: ./E2E/ooniprobe.sh ./CLI/ooniprobe-linux-arm64 + - run: | + tag=$(echo $GITHUB_REF | sed 's|refs/tags/||g') + gh release create -p $tag --target $GITHUB_SHA || true + gh release upload $tag --clobber ./CLI/ooniprobe-linux-arm64 + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - DEB_GPG_KEY: ${{ secrets.DEB_GPG_KEY }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 604d88a..48e7cd3 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -4,9 +4,12 @@ on: push: branches: - "release/**" + tags: + - "v*" + jobs: - build: - runs-on: "macos-10.15" + build_and_publish: + runs-on: "macos-11" steps: - uses: actions/setup-go@v1 with: @@ -20,5 +23,14 @@ jobs: env: PSIPHON_CONFIG_KEY: ${{ secrets.PSIPHON_CONFIG_KEY }} PSIPHON_CONFIG_JSON_AGE_BASE64: ${{ secrets.PSIPHON_CONFIG_JSON_AGE_BASE64 }} - - run: ./mk ./CLI/darwin/amd64/ooniprobe - - run: ./E2E/ooniprobe.sh ./CLI/darwin/amd64/ooniprobe + - run: ./mk ./CLI/ooniprobe-darwin + - run: ./E2E/ooniprobe.sh ./CLI/ooniprobe-darwin-amd64 + + - run: | + tag=$(echo $GITHUB_REF | sed 's|refs/tags/||g') + gh release create -p $tag --target $GITHUB_SHA || true + gh release upload $tag --clobber ./CLI/ooniprobe-darwin-amd64 \ + ./CLI/ooniprobe-darwin-arm64 + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/oohelperd.yml b/.github/workflows/oohelperd.yml index c688d07..4be33ff 100644 --- a/.github/workflows/oohelperd.yml +++ b/.github/workflows/oohelperd.yml @@ -4,10 +4,11 @@ on: push: branches: - "release/**" - - "oohelperd-staging" + tags: + - "v*" jobs: - build_amd64: + build_and_publish: runs-on: "ubuntu-20.04" steps: - uses: actions/checkout@v2 @@ -16,35 +17,12 @@ jobs: go-version: "1.17.3" - name: build oohelperd binary - run: GOOS=linux GOARCH=amd64 go build -v ./internal/cmd/oohelperd + run: GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o ./CLI/oohelperd-linux-amd64 -v -tags netgo -ldflags="-s -w -extldflags -static" ./internal/cmd/oohelperd - - run: find . -type f -name oohelperd - - - name: install deps - run: | - sudo apt-get -q update - sudo apt-get install -yq --no-install-recommends curl devscripts \ - dpkg-dev debhelper git python3 python3-requests python3-gnupg s3cmd - - - name: update the debian changelog - run: | - version="$(go run ./internal/cmd/printversion)~$GITHUB_RUN_NUMBER" - cd ./internal/cmd/oohelperd - dch -v "$version" "New version ${version}" - - - name: build deb package - run: | - cd ./internal/cmd/oohelperd - dpkg-buildpackage -us -uc -b - - - name: upload package - if: github.ref == 'refs/heads/oohelperd-staging' - run: | - curl -fsSLO https://raw.githubusercontent.com/ooni/sysadmin/master/tools/debops-ci - chmod +x debops-ci - find . -name '*.deb' - ./debops-ci --show-commands upload --bucket-name ooni-internal-deb --arch "amd64" internal/cmd/*.deb + - run: | + tag=$(echo $GITHUB_REF | sed 's|refs/tags/||g') + gh release create -p $tag --target $GITHUB_SHA || true + gh release upload $tag --clobber ./CLI/oohelperd-linux-amd64 + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - DEB_GPG_KEY: ${{ secrets.DEB_GPG_KEY }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 7e9baa6..539ea50 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -4,6 +4,9 @@ on: push: branches: - "release/**" + tags: + - "v*" + jobs: build: runs-on: "ubuntu-20.04" @@ -21,11 +24,16 @@ jobs: env: PSIPHON_CONFIG_KEY: ${{ secrets.PSIPHON_CONFIG_KEY }} PSIPHON_CONFIG_JSON_AGE_BASE64: ${{ secrets.PSIPHON_CONFIG_JSON_AGE_BASE64 }} - - run: ./mk MINGW_W64_VERSION="9.3-win32" ./CLI/windows/amd64/ooniprobe.exe + - run: ./mk MINGW_W64_VERSION="9.3-win32" ./CLI/ooniprobe-windows - uses: actions/upload-artifact@v2 with: - name: ooniprobe.exe - path: ./CLI/windows/amd64/ooniprobe.exe + name: ooniprobe-windows-amd64.exe + path: ./CLI/ooniprobe-windows-amd64.exe + - uses: actions/upload-artifact@v2 + with: + name: ooniprobe-windows-386.exe + path: ./CLI/ooniprobe-windows-386.exe + test: needs: build runs-on: "windows-2019" @@ -33,5 +41,25 @@ jobs: - uses: actions/checkout@v2 - uses: actions/download-artifact@v2 with: - name: ooniprobe.exe - - run: bash.exe ./E2E/ooniprobe.sh ./ooniprobe.exe + name: ooniprobe-windows-amd64.exe + - run: bash.exe ./E2E/ooniprobe.sh ./ooniprobe-windows-amd64.exe + + publish: + needs: test + runs-on: "ubuntu-20.04" + steps: + - uses: actions/checkout@v2 + - uses: actions/download-artifact@v2 + with: + name: ooniprobe-windows-amd64.exe + - uses: actions/download-artifact@v2 + with: + name: ooniprobe-windows-386.exe + - run: | + tag=$(echo $GITHUB_REF | sed 's|refs/tags/||g') + gh release create -p $tag --target $GITHUB_SHA || true + gh release upload $tag --clobber ooniprobe-windows-386.exe \ + ooniprobe-windows-amd64.exe + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/CLI/.gitignore b/CLI/.gitignore index 9878d3a..34bcffc 100644 --- a/CLI/.gitignore +++ b/CLI/.gitignore @@ -1 +1,2 @@ /miniooni-* +/ooniprobe-* diff --git a/CLI/linux/build b/CLI/build-linux similarity index 73% rename from CLI/linux/build rename to CLI/build-linux index e1f64bc..edc01e6 100755 --- a/CLI/linux/build +++ b/CLI/build-linux @@ -14,8 +14,11 @@ apk add --no-progress gcc git linux-headers musl-dev # some of the following exports are redundant but are however # useful because they provide explicit logging export GOARM=$GOARM -export GOPATH=$GOPATH export CGO_ENABLED=1 export GOOS=linux export GOARCH=$GOARCH -go build -o "./CLI/linux/$GOARCH/" -ldflags='-s -w -extldflags "-static"' "$@" ./cmd/ooniprobe +archname=$GOARCH +if [ "$GOARCH" = "arm" -a "$GOARM" = "7" ]; then + archname="armv7" +fi +go build -o "./CLI/ooniprobe-linux-$archname" -ldflags='-s -w -extldflags "-static"' "$@" ./cmd/ooniprobe diff --git a/CLI/darwin/amd64/.gitignore b/CLI/darwin/amd64/.gitignore deleted file mode 100644 index 2a6d899..0000000 --- a/CLI/darwin/amd64/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/miniooni -/ooniprobe -/ooniprobe.asc diff --git a/CLI/darwin/arm64/.gitignore b/CLI/darwin/arm64/.gitignore deleted file mode 100644 index 2a6d899..0000000 --- a/CLI/darwin/arm64/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/miniooni -/ooniprobe -/ooniprobe.asc diff --git a/CLI/linux/386/.gitignore b/CLI/linux/386/.gitignore deleted file mode 100644 index 2a6d899..0000000 --- a/CLI/linux/386/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/miniooni -/ooniprobe -/ooniprobe.asc diff --git a/CLI/linux/amd64/.gitignore b/CLI/linux/amd64/.gitignore deleted file mode 100644 index 2a6d899..0000000 --- a/CLI/linux/amd64/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/miniooni -/ooniprobe -/ooniprobe.asc diff --git a/CLI/linux/arm/.gitignore b/CLI/linux/arm/.gitignore deleted file mode 100644 index 2a6d899..0000000 --- a/CLI/linux/arm/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/miniooni -/ooniprobe -/ooniprobe.asc diff --git a/CLI/linux/arm64/.gitignore b/CLI/linux/arm64/.gitignore deleted file mode 100644 index 2a6d899..0000000 --- a/CLI/linux/arm64/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/miniooni -/ooniprobe -/ooniprobe.asc diff --git a/CLI/linux/pkgdebian b/CLI/linux/pkgdebian deleted file mode 100755 index a0dc9b3..0000000 --- a/CLI/linux/pkgdebian +++ /dev/null @@ -1,76 +0,0 @@ -#!/bin/sh -# This script creates a Debian package. When run by `./mk`, it -# is run inside a debian:stable container. It's fine to also -# run this script from any debian-like system, as long as the -# following ASSUMPTIONS are met: -# -# 1. the `ooniprobe` we are packaging is available at -# this path `./CLI/linux/$GOARCH/ooniprobe`; -# -# 2. we are running on a debian system that is capable -# of running binaries for the architecture that we wanna -# package, either natively or via qemu-user-static. - -if [ $# -ne 1 ] && [ $# -ne 2 ]; then - echo "usage: $0 {arch} [run_number]" 1>&2 - exit 1 -fi -goarch=$1 -run_number=$2 -set -ex - -# Copy the target binary in the correct location expected -# by the debian/ooniprobe-cli.install file. -rm -rf ./debian/bin -mkdir -p ./debian/bin -cp "./CLI/linux/$goarch/ooniprobe" ./debian/bin - -# figure out the version number from the binary itself (which rests -# on the assumption that we can run such a binary) -version=$(./debian/bin/ooniprobe version) -if [ -n "$run_number" ]; then - version="${version}~${run_number}" -fi - -darch="" -case $goarch in -386) - darch="i386" - ;; -amd64) - darch="amd64" - ;; -arm) - darch="armhf" - ;; -arm64) - darch="arm64" - ;; -esac -echo "Building for GOARCH=$goarch / DEBARCH=$darch" - -# The OONI_DEB_DRY_RUN is a semi-undocumented feature allowing -# us to see the commands that would be run by this script. - -$OONI_DEB_DRY_RUN dpkg --add-architecture $darch - -# install the dependencies required by the build process -$OONI_DEB_DRY_RUN apt-get update -q -$OONI_DEB_DRY_RUN apt-get build-dep -y --no-install-recommends . - -# keep the original changelog file safe -$OONI_DEB_DRY_RUN cp ./debian/changelog ./debian/changelog.oocopy - -$OONI_DEB_DRY_RUN dch -v "$version" "New version ${version}" -$OONI_DEB_DRY_RUN dpkg-buildpackage -a $darch -us -uc -b - -# restore the original changelog file -$OONI_DEB_DRY_RUN mv ./debian/changelog.oocopy ./debian/changelog - -# move the package so that we don't loose track -# of it when using a build container -$OONI_DEB_DRY_RUN mv ../*.deb . - -# install the package on the container as a smoke test to -# ensure that it is installable. -DEBIAN_FRONTEND=noninteractive dpkg -i "ooniprobe-cli_${version}_${darch}.deb" diff --git a/CLI/linux/pubdebian b/CLI/linux/pubdebian deleted file mode 100755 index 3090909..0000000 --- a/CLI/linux/pubdebian +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/sh -# This script publishes Debian packages. When run by `mk`, it's -# run inside of an `ubuntu:20.04` container. It's fine also to run -# this script from a live Debian-like system as long as all the -# following assumptions are met: -# -# 1. Debian packages we want to publish are in the toplevel dir. - -# ensure that we have all the required environment variables. -fail=0 -if [ -z "$AWS_ACCESS_KEY_ID" ]; then - echo "warning: missing AWS_ACCESS_KEY_ID environment variable" 1>&2 - fail=1 -fi -if [ -z "$AWS_SECRET_ACCESS_KEY" ]; then - echo "warning: missing AWS_SECRET_ACCESS_KEY environment variable" 1>&2 - fail=1 -fi -if [ -z "$DEB_GPG_KEY" ]; then - echo "warning: missing DEB_GPG_KEY environment variable" 1>&2 - fail=1 -fi -if [ $fail -ne 0 ]; then - exit 1 -fi - -set -ex - -export DEBIAN_FRONTEND=noninteractive - -maybe_with_sudo() { - if command -v sudo 1>/dev/null; then - sudo "$@" - else - "$@" - fi -} - -# install the dependencies required by the uploader. -maybe_with_sudo apt-get update -q -maybe_with_sudo apt-get install --yes --no-install-recommends curl git make python3 python3-requests python3-gnupg s3cmd - -# pull the latest version of the debops-ci script from ooni/sysadmin. -curl -fsSLO https://raw.githubusercontent.com/ooni/sysadmin/master/tools/debops-ci -chmod +x debops-ci - -# loop over the available packages and upload. -for debpkg in *.deb; do - # for example: ooniprobe-cli_3.10.0_i386.deb - arch=$(echo "$debpkg" | awk -F_ '{print $3}' | sed 's/\.deb$//g') - ./debops-ci --show-commands upload --bucket-name ooni-deb --arch "$arch" "$debpkg" -done diff --git a/CLI/windows/386/.gitignore b/CLI/windows/386/.gitignore deleted file mode 100644 index 577d4be..0000000 --- a/CLI/windows/386/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/miniooni.exe -/ooniprobe.exe -/ooniprobe.exe.asc diff --git a/CLI/windows/amd64/.gitignore b/CLI/windows/amd64/.gitignore deleted file mode 100644 index 577d4be..0000000 --- a/CLI/windows/amd64/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/miniooni.exe -/ooniprobe.exe -/ooniprobe.exe.asc diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d05e5c1..f9a2085 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -125,43 +125,5 @@ port, the commit message should start with `[forwardport]`. When we branch off release `x.y` from `master`, we also need to bump the `alpha` version used by `master`. -In addition we have `PRODUCT-staging` branches for each product. These -branches are described below: - -- `miniooni-staging`: branch for building and publishing `miniooni` -binaries. This branch marges from the `master` branch when we tag -alpha releases. We use this strategy because `miniooni` is an alpha client. -We publish the resulting binaries in alpha releases. - -- `mobile-staging`: branch for building and publishing iOS and -Android releases of the `pkg/oonimkall` library. This branch -merges from the release branches or the release tags. We use this -strategy because mobile releases are either beta quality or -production quality releases. We publish the resulting binaries -in beta quality or stable releases. - -- `oohelperd-staging`: branch for building and publishing `oohelperd` -binaries. This branch merges from the release branches or the -release tags. We use this strategy because `oohelperd` releases -are either beta quality or production quality releases. We -publish the resulting binaries in OONI's internal Debian repository. - -- `ooniprobe-staging`: branch for building and publising `ooniprobe` -binaries. This branch merges from the release branches or the -release tags. We use this strategy because `ooniprobe` releases -are either beta quality or production quality releases. We -publish the resulting binaries both in beta quality or stable -releases and in OONI's public Debian repository. - -Builds proper happen either in this repository, using GitHub -actions, or using private build machines. Sometimes we need -private build machines to inject specific secrets into the -binary (e.g., we currently use this to inject OONI's Psiphon config). - -Additionally, we currently publish as Github Actions artifacts -`miniooni` binaries for selected Linux architectures for -each commit that lands into the `master` branch. You will -find those binaries [in the results of each individual build]( -https://github.com/ooni/probe-cli/actions/workflows/miniooni.yml) -until they are automatically removed by GitHub compatibly with -the build assets retention period (should be 90 days). +We build binary packages for each tagged release. We will use external +tools for publishing binaries to our Debian repository, Maven Central, etc. diff --git a/MOBILE/template.pom b/MOBILE/android/template.pom similarity index 100% rename from MOBILE/template.pom rename to MOBILE/android/template.pom diff --git a/MOBILE/template.podspec b/MOBILE/ios/template.podspec similarity index 100% rename from MOBILE/template.podspec rename to MOBILE/ios/template.podspec diff --git a/debian/.gitignore b/debian/.gitignore deleted file mode 100644 index 3460d48..0000000 --- a/debian/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -/bin -/.debhelper/ -/debhelper-build-stamp -/files -/ooniprobe-cli/ -/ooniprobe-cli.postrm.debhelper -/ooniprobe-cli.substvars diff --git a/debian/README.md b/debian/README.md deleted file mode 100644 index d342bd9..0000000 --- a/debian/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Directory github.com/ooni/probe-cli/debian - -This directory allows us to build debian packages. diff --git a/debian/changelog b/debian/changelog deleted file mode 100644 index f9bbcab..0000000 --- a/debian/changelog +++ /dev/null @@ -1,5 +0,0 @@ -ooniprobe-cli (3.0.9) unstable; urgency=medium - - * Test release - - -- Federico Ceratto Tue, 16 Feb 2021 12:39:41 +0000 diff --git a/debian/config b/debian/config deleted file mode 100644 index d36bdaf..0000000 --- a/debian/config +++ /dev/null @@ -1,13 +0,0 @@ -#! /bin/sh -# -# Load debconf module and ask informed consent -# -set -e - -. /usr/share/debconf/confmodule -db_version 2.0 - -db_input high ooniprobe-cli/ask-consent || true -db_go - -exit 0 diff --git a/debian/control b/debian/control deleted file mode 100644 index a6c95c6..0000000 --- a/debian/control +++ /dev/null @@ -1,23 +0,0 @@ -Source: ooniprobe-cli -Maintainer: Federico Ceratto -Section: devel -Priority: optional -Build-Depends: - debhelper-compat (= 12), - devscripts, - dpkg-dev, -Standards-Version: 4.5.0 -Vcs-Browser: https://github.com/ooni/probe-cli -Vcs-Git: https://github.com/ooni/probe-cli.git -Homepage: https://github.com/ooni/probe-cli -Rules-Requires-Root: no -XS-Go-Import-Path: github.com/ooni/probe-cli - -Package: ooniprobe-cli -Architecture: any -Pre-Depends: debconf (>= 1.0.0) -Depends: ${misc:Depends}, ${shlibs:Depends}, - adduser, - debconf -Built-Using: ${misc:Built-Using} -Description: OONI Probe CLI diff --git a/debian/copyright b/debian/copyright deleted file mode 100644 index 8abef2b..0000000 --- a/debian/copyright +++ /dev/null @@ -1,40 +0,0 @@ -Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Source: https://github.com/ooni/probe-cli -Upstream-Name: ooniprobe-cli - -Files: * -Copyright: 2018 Open Observatory of Network Interference (OONI) -License: BSD-3-clause - -Files: debian/* -Copyright: 2020 Federico Ceratto -License: BSD-3-clause -Comment: Debian packaging is licensed under the same terms as upstream - -License: BSD-3-clause - Copyright 2018 Open Observatory of Network Interference (OONI), The Tor Project - . - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - . - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - . - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - . - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - . - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/debian/ooniprobe-cli.install b/debian/ooniprobe-cli.install deleted file mode 100644 index 4580a18..0000000 --- a/debian/ooniprobe-cli.install +++ /dev/null @@ -1,2 +0,0 @@ -debian/bin/ooniprobe /usr/bin -debian/ooniprobe.conf.disabled /etc/ooniprobe diff --git a/debian/ooniprobe-cli.postinst b/debian/ooniprobe-cli.postinst deleted file mode 100755 index 2bc454d..0000000 --- a/debian/ooniprobe-cli.postinst +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh -set -e - -. /usr/share/debconf/confmodule -db_version 2.0 - -if [ "$1" = "configure" ]; then - if ! getent passwd ooniprobe >/dev/null; then - adduser --quiet --system --group --home /var/lib/ooniprobe ooniprobe - fi -fi - -# Extract the answer -db_get ooniprobe-cli/ask-consent || true -consent="$RET" -CF=/etc/ooniprobe/ooniprobe.conf - -[ "$consent" = true ] && [ -f ${CF}.disabled ] && mv ${CF}.disabled ${CF} -[ "$consent" = false ] && [ -f ${CF} ] && mv ${CF} ${CF}.disabled - -#DEBHELPER# - -exit 0 diff --git a/debian/ooniprobe-cli.service b/debian/ooniprobe-cli.service deleted file mode 100644 index 3a3d37d..0000000 --- a/debian/ooniprobe-cli.service +++ /dev/null @@ -1,54 +0,0 @@ -[Unit] -Description=OONI Probe CLI -Documentation=man:ooniprobe-cli -Documentation=https://ooni.org/ -After=network.target tor.target -Wants=network-online.target -ConditionPathExists=/etc/ooniprobe/ooniprobe.conf - -[Service] -Type=simple -ExecStart=/usr/bin/ooniprobe --config=/etc/ooniprobe/ooniprobe.conf run unattended -TimeoutStopSec=5 -KillMode=mixed - -Environment="OONI_HOME=/var/lib/ooniprobe" -User=ooniprobe -PermissionsStartOnly=true -Restart=on-abnormal -RestartSec=2s -LimitNOFILE=65536 -WorkingDirectory=/var/lib/ooniprobe -RuntimeDirectory=ooniprobe -StateDirectory=ooniprobe -LogsDirectory=ooniprobe -ConfigurationDirectory=ooniprobe - -# Sandboxing -CapabilityBoundingSet=CAP_NET_BIND_SERVICE -LockPersonality=yes -NoNewPrivileges=yes -PrivateDevices=yes -PrivateTmp=yes -PrivateUsers=yes -ProtectClock=yes -ProtectControlGroups=yes -ProtectHome=yes -ProtectHostname=yes -ProtectKernelLogs=yes -ProtectKernelModules=yes -ProtectKernelTunables=yes -ProtectSystem=full -ReadOnlyDirectories=/ -ReadWriteDirectories=-/proc -ReadWriteDirectories=-/var/log/ooniprobe -ReadWriteDirectories=-/var/lib/ooniprobe -ReadWriteDirectories=-/var/run -RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 -RestrictNamespaces=yes -RestrictRealtime=yes -SystemCallArchitectures=native -SystemCallFilter=@system-service - -[Install] -WantedBy=multi-user.target diff --git a/debian/ooniprobe-cli.templates b/debian/ooniprobe-cli.templates deleted file mode 100644 index d799424..0000000 --- a/debian/ooniprobe-cli.templates +++ /dev/null @@ -1,15 +0,0 @@ -Template: ooniprobe-cli/ask-consent -Type: boolean -Default: true -Description: Can we automatically publish your OONI Probe test results? - OONI Probe measures internet censorship and network performance. - . - Heads-up! - . - - The network data you will collect will automatically be published (unless you opt-out in the settings). - . - - Anyone monitoring your internet activity (eg. government or ISP) may be able to tell that you are using OONI Probe. - . - - OONI Probe will likely test objectionable websites. - . - To learn more, see https://ooni.org/about/risks/ diff --git a/debian/ooniprobe-cli.timer b/debian/ooniprobe-cli.timer deleted file mode 100644 index 90612a5..0000000 --- a/debian/ooniprobe-cli.timer +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=OONI Probe CLI -Requires=ooniprobe-cli.service - -[Timer] -Unit=ooniprobe-cli.service -OnCalendar=daily -RandomizedDelaySec=12h - -[Install] -WantedBy=timers.target diff --git a/debian/ooniprobe.conf.disabled b/debian/ooniprobe.conf.disabled deleted file mode 100644 index 2c588b4..0000000 --- a/debian/ooniprobe.conf.disabled +++ /dev/null @@ -1,13 +0,0 @@ -{ - "_": "", - "_version": 1, - "_informed_consent": true, - "sharing": { - "upload_results": true - }, - "nettests": { - "websites_max_runtime": 0, - "websites_enabled_category_codes": null - }, - "advanced": {} -} diff --git a/debian/rules b/debian/rules deleted file mode 100755 index 5e5817b..0000000 --- a/debian/rules +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/make -f - -export DH_VERBOSE=1 - -%: - dh $@ - -override_dh_auto_clean: - dh_auto_clean - -override_dh_auto_build: - # The ooniprobe binary is provided - -override_dh_dwz: - true - -override_dh_strip: - # We cross compile and build packages for any arch from - # linux/amd64 so we need to avoid this step. BTW this step - # is not needed because we already strip when building. - true - -override_dh_makeshlibs: - # We cross compile and build packages for any arch from - # linux/amd64 so we need to avoid this step. BTW this step - # is not needed because we don't have any shlib. - true - -override_dh_auto_install: - dh_auto_install -- --no-source diff --git a/debian/source/format b/debian/source/format deleted file mode 100644 index 89ae9db..0000000 --- a/debian/source/format +++ /dev/null @@ -1 +0,0 @@ -3.0 (native) diff --git a/docs/branching.excalidraw b/docs/branching.excalidraw index 8ecc78a..5bd82c9 100644 --- a/docs/branching.excalidraw +++ b/docs/branching.excalidraw @@ -5,8 +5,8 @@ "elements": [ { "type": "ellipse", - "version": 117, - "versionNonce": 946575987, + "version": 119, + "versionNonce": 1330344930, "isDeleted": false, "id": "FrOnFVoZdtaOFSxuuPxmW", "fillStyle": "hachure", @@ -29,67 +29,56 @@ ] }, { - "id": "9FCTh8g9toACPfN7yF2Tx", "type": "text", + "version": 143, + "versionNonce": 876589886, + "isDeleted": false, + "id": "9FCTh8g9toACPfN7yF2Tx", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, "x": 1409.3693319084748, "y": 766.171875, + "strokeColor": "#000000", + "backgroundColor": "transparent", "width": 68, "height": 25, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, + "seed": 1086889555, "groupIds": [], "strokeSharpness": "round", - "seed": 1086889555, - "version": 141, - "versionNonce": 159889981, - "isDeleted": false, - "boundElementIds": null, - "text": "master", + "boundElementIds": [], "fontSize": 20, "fontFamily": 1, + "text": "master", + "baseline": 18, "textAlign": "center", - "verticalAlign": "top", - "baseline": 18 + "verticalAlign": "top" }, { - "id": "ZsWo12aT76lV6R2H0b8V-", "type": "arrow", - "x": 1446.7307919303582, - "y": 950.9976346262545, - "width": 3.298960021883431, - "height": 63.87654087625447, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", + "version": 248, + "versionNonce": 2000070562, + "isDeleted": false, + "id": "ZsWo12aT76lV6R2H0b8V-", "fillStyle": "hachure", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 2, "opacity": 100, + "angle": 0, + "x": 1446.7307919303582, + "y": 950.9976346262545, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 3.298960021883431, + "height": 63.87654087625447, + "seed": 1443933405, "groupIds": [], "strokeSharpness": "round", - "seed": 1443933405, - "version": 244, - "versionNonce": 2140525587, - "isDeleted": false, - "boundElementIds": null, - "points": [ - [ - 0, - 0 - ], - [ - -3.298960021883431, - -63.87654087625447 - ] - ], - "lastCommittedPoint": null, + "boundElementIds": [], "startBinding": { "elementId": "i8LbwDXP7xJogP137mBcN", "focus": 0.09728688754060083, @@ -100,30 +89,41 @@ "focus": 0.12046082095303218, "gap": 13.214645544914092 }, + "lastCommittedPoint": null, "startArrowhead": null, - "endArrowhead": "arrow" + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -3.298960021883431, + -63.87654087625447 + ] + ] }, { - "id": "i8LbwDXP7xJogP137mBcN", "type": "ellipse", - "x": 1412.9201131584748, - "y": 956.9453125, - "width": 65.4140625, - "height": 68.76953125, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", + "version": 190, + "versionNonce": 983735166, + "isDeleted": false, + "id": "i8LbwDXP7xJogP137mBcN", "fillStyle": "hachure", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 2, "opacity": 100, + "angle": 0, + "x": 1412.9201131584748, + "y": 956.9453125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 65.4140625, + "height": 68.76953125, + "seed": 1779891677, "groupIds": [], "strokeSharpness": "round", - "seed": 1779891677, - "version": 188, - "versionNonce": 1282370205, - "isDeleted": false, "boundElementIds": [ "ZsWo12aT76lV6R2H0b8V-", "ErrLp--GEOsR3AU2FNwwz", @@ -134,8 +134,8 @@ }, { "type": "ellipse", - "version": 380, - "versionNonce": 1271009021, + "version": 382, + "versionNonce": 721773410, "isDeleted": false, "id": "61hQjrW1eCfb5OIprSXq3", "fillStyle": "hachure", @@ -165,8 +165,8 @@ }, { "type": "ellipse", - "version": 417, - "versionNonce": 1416112979, + "version": 419, + "versionNonce": 2097052606, "isDeleted": false, "id": "H2rrZfUI5kDk2fa982pFA", "fillStyle": "hachure", @@ -192,27 +192,32 @@ ] }, { - "id": "7IIG2hmA-CHb8UtlgutoE", "type": "arrow", - "x": 1125.3717557752195, - "y": 1516.549162785709, - "width": 0.9791291618903415, - "height": 746.6889687780292, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", + "version": 667, + "versionNonce": 889628450, + "isDeleted": false, + "id": "7IIG2hmA-CHb8UtlgutoE", "fillStyle": "hachure", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 2, "opacity": 100, + "angle": 0, + "x": 1125.3717557752195, + "y": 1516.549162785709, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 0.9791291618903415, + "height": 746.6889687780292, + "seed": 2143314653, "groupIds": [], "strokeSharpness": "round", - "seed": 2143314653, - "version": 665, - "versionNonce": 637609821, - "isDeleted": false, - "boundElementIds": null, + "boundElementIds": [], + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", "points": [ [ 0, @@ -222,35 +227,35 @@ -0.9791291618903415, -746.6889687780292 ] - ], - "lastCommittedPoint": null, - "startBinding": null, - "endBinding": null, - "startArrowhead": null, - "endArrowhead": "arrow" + ] }, { - "id": "EEe_kaxToCLeMN314Ayoi", "type": "line", - "x": 1103.8576131584748, - "y": 1522.23046875, - "width": 46.3359375, - "height": 1.34765625, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", + "version": 465, + "versionNonce": 24400894, + "isDeleted": false, + "id": "EEe_kaxToCLeMN314Ayoi", "fillStyle": "hachure", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 2, "opacity": 100, + "angle": 0, + "x": 1103.8576131584748, + "y": 1522.23046875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 46.3359375, + "height": 1.34765625, + "seed": 2050861085, "groupIds": [], "strokeSharpness": "round", - "seed": 2050861085, - "version": 463, - "versionNonce": 328026355, - "isDeleted": false, - "boundElementIds": null, + "boundElementIds": [], + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, "points": [ [ 0, @@ -260,46 +265,41 @@ 46.3359375, -1.34765625 ] - ], - "lastCommittedPoint": null, - "startBinding": null, - "endBinding": null, - "startArrowhead": null, - "endArrowhead": null + ] }, { - "id": "aavD3gXn3GoaVefLhge2J", "type": "text", - "x": 1085.2052694084748, - "y": 1175.91796875, - "width": 39, - "height": 25, - "angle": 4.715798234183623, - "strokeColor": "#000000", - "backgroundColor": "transparent", + "version": 698, + "versionNonce": 1034515170, + "isDeleted": false, + "id": "aavD3gXn3GoaVefLhge2J", "fillStyle": "hachure", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 2, "opacity": 100, + "angle": 4.715798234183623, + "x": 1085.2052694084748, + "y": 1175.91796875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 39, + "height": 25, + "seed": 417732371, "groupIds": [], "strokeSharpness": "round", - "seed": 417732371, - "version": 696, - "versionNonce": 763245501, - "isDeleted": false, - "boundElementIds": null, - "text": "time", + "boundElementIds": [], "fontSize": 20, "fontFamily": 1, + "text": "time", + "baseline": 18, "textAlign": "center", - "verticalAlign": "top", - "baseline": 18 + "verticalAlign": "top" }, { "type": "arrow", - "version": 579, - "versionNonce": 394113683, + "version": 581, + "versionNonce": 1644504126, "isDeleted": false, "id": "0dP3cEoktX25eCkvviNcM", "fillStyle": "hachure", @@ -344,8 +344,8 @@ }, { "type": "ellipse", - "version": 328, - "versionNonce": 1851438109, + "version": 330, + "versionNonce": 125617826, "isDeleted": false, "id": "_2_7auHWgP9OSMdW-IMqi", "fillStyle": "hachure", @@ -371,27 +371,36 @@ ] }, { - "id": "SqX8Ci1x7CUCXJNH9loTM", "type": "arrow", - "x": 1483.1623006584748, - "y": 1446.53515625, - "width": 79.88293214663872, - "height": 99.1479660904406, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", + "version": 328, + "versionNonce": 1351740542, + "isDeleted": false, + "id": "SqX8Ci1x7CUCXJNH9loTM", "fillStyle": "hachure", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 2, "opacity": 100, + "angle": 0, + "x": 1483.1623006584748, + "y": 1446.53515625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 79.88293214663872, + "height": 99.1479660904406, + "seed": 563908051, "groupIds": [], "strokeSharpness": "round", - "seed": 563908051, - "version": 326, - "versionNonce": 1089464371, - "isDeleted": false, - "boundElementIds": null, + "boundElementIds": [], + "startBinding": { + "elementId": "_2_7auHWgP9OSMdW-IMqi", + "focus": 0.5480446646136934, + "gap": 6.638688544200527 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", "points": [ [ 0, @@ -401,21 +410,12 @@ 79.88293214663872, -99.1479660904406 ] - ], - "lastCommittedPoint": null, - "startBinding": { - "elementId": "_2_7auHWgP9OSMdW-IMqi", - "focus": 0.5480446646136934, - "gap": 6.638688544200527 - }, - "endBinding": null, - "startArrowhead": null, - "endArrowhead": "arrow" + ] }, { "type": "ellipse", - "version": 313, - "versionNonce": 365586899, + "version": 315, + "versionNonce": 724542050, "isDeleted": false, "id": "s6P4OqGNKJFw1EDYtmZZv", "fillStyle": "hachure", @@ -444,8 +444,8 @@ }, { "type": "text", - "version": 197, - "versionNonce": 764656029, + "version": 199, + "versionNonce": 450604222, "isDeleted": false, "id": "E3oEt7YrddzXwWfuXo2BN", "fillStyle": "hachure", @@ -472,61 +472,63 @@ "verticalAlign": "top" }, { - "id": "SeebVefCHR0BG_Msq_mBX", "type": "rectangle", + "version": 245, + "versionNonce": 246764094, + "isDeleted": false, + "id": "SeebVefCHR0BG_Msq_mBX", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, "x": 1623.8185506584748, "y": 1004.05859375, + "strokeColor": "#000000", + "backgroundColor": "transparent", "width": 74.2987929059682, "height": 28.08984375, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, + "seed": 781280467, "groupIds": [], "strokeSharpness": "round", - "seed": 781280467, - "version": 242, - "versionNonce": 455325555, - "isDeleted": false, - "boundElementIds": null + "boundElementIds": [ + "GO0tq3-qTL5xGa4FqNPel" + ] }, { - "id": "vzC_reXHu0W5D5Vdy7wzo", "type": "text", - "x": 1639.3262379777896, - "y": 1009.2944701526376, - "width": 43, - "height": 17, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", + "version": 200, + "versionNonce": 780363006, + "isDeleted": false, + "id": "vzC_reXHu0W5D5Vdy7wzo", "fillStyle": "hachure", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 2, "opacity": 100, + "angle": 0, + "x": 1639.3262379777896, + "y": 1009.2944701526376, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 43, + "height": 17, + "seed": 1846516307, "groupIds": [], "strokeSharpness": "round", - "seed": 1846516307, - "version": 198, - "versionNonce": 1425747411, - "isDeleted": false, - "boundElementIds": null, - "text": "v3.4.0", + "boundElementIds": [], "fontSize": 14.094472755782043, "fontFamily": 1, + "text": "v3.4.0", + "baseline": 12, "textAlign": "center", - "verticalAlign": "middle", - "baseline": 12 + "verticalAlign": "middle" }, { "type": "ellipse", - "version": 470, - "versionNonce": 1866617107, + "version": 472, + "versionNonce": 2039476706, "isDeleted": false, "id": "_BzjrIXl7qYcDggInAePz", "fillStyle": "hachure", @@ -553,38 +555,27 @@ ] }, { - "id": "1nUAY0kryU4ZLIvj0pXnc", "type": "arrow", - "x": 1446.2091756584748, - "y": 1264.625, - "width": 0.0234375, - "height": 87.6484375, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", + "version": 70, + "versionNonce": 487200062, + "isDeleted": false, + "id": "1nUAY0kryU4ZLIvj0pXnc", "fillStyle": "hachure", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 2, "opacity": 100, + "angle": 0, + "x": 1446.2091756584748, + "y": 1264.625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 0.0234375, + "height": 87.6484375, + "seed": 2110933469, "groupIds": [], "strokeSharpness": "round", - "seed": 2110933469, - "version": 68, - "versionNonce": 1502952861, - "isDeleted": false, - "boundElementIds": null, - "points": [ - [ - 0, - 0 - ], - [ - 0.0234375, - -87.6484375 - ] - ], - "lastCommittedPoint": null, + "boundElementIds": [], "startBinding": { "elementId": "61hQjrW1eCfb5OIprSXq3", "focus": -0.026277293582462318, @@ -595,31 +586,51 @@ "focus": 0.07673924794852657, "gap": 1.6809069551271776 }, + "lastCommittedPoint": null, "startArrowhead": null, - "endArrowhead": "arrow" + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 0.0234375, + -87.6484375 + ] + ] }, { - "id": "9UArOcQdn2sGw8HZRdTn9", "type": "arrow", - "x": 1446.8732381584748, - "y": 1107.04296875, - "width": 1.85546875, - "height": 75.97265625, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", + "version": 39, + "versionNonce": 540763554, + "isDeleted": false, + "id": "9UArOcQdn2sGw8HZRdTn9", "fillStyle": "hachure", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 2, "opacity": 100, + "angle": 0, + "x": 1446.8732381584748, + "y": 1107.04296875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 1.85546875, + "height": 75.97265625, + "seed": 1363842525, "groupIds": [], "strokeSharpness": "round", - "seed": 1363842525, - "version": 37, - "versionNonce": 597472947, - "isDeleted": false, - "boundElementIds": null, + "boundElementIds": [], + "startBinding": null, + "endBinding": { + "elementId": "i8LbwDXP7xJogP137mBcN", + "focus": 0.04829005202176653, + "gap": 5.360559841423914 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", "points": [ [ 0, @@ -629,21 +640,12 @@ -1.85546875, -75.97265625 ] - ], - "lastCommittedPoint": null, - "startBinding": null, - "endBinding": { - "elementId": "i8LbwDXP7xJogP137mBcN", - "focus": 0.04829005202176653, - "gap": 5.360559841423914 - }, - "startArrowhead": null, - "endArrowhead": "arrow" + ] }, { "type": "ellipse", - "version": 589, - "versionNonce": 1457088595, + "version": 591, + "versionNonce": 533773694, "isDeleted": false, "id": "VXTr4t2TCfsx3lBbrX9FA", "fillStyle": "hachure", @@ -673,38 +675,27 @@ ] }, { - "id": "DeUB5-Hpy2FpWy-xPqJ1c", "type": "arrow", - "x": 1587.3380819084748, - "y": 1261.33203125, - "width": 0.625, - "height": 93.7421875, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", + "version": 58, + "versionNonce": 281174370, + "isDeleted": false, + "id": "DeUB5-Hpy2FpWy-xPqJ1c", "fillStyle": "hachure", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 2, "opacity": 100, + "angle": 0, + "x": 1587.3380819084748, + "y": 1261.33203125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 0.625, + "height": 93.7421875, + "seed": 248883293, "groupIds": [], "strokeSharpness": "round", - "seed": 248883293, - "version": 56, - "versionNonce": 248440307, - "isDeleted": false, - "boundElementIds": null, - "points": [ - [ - 0, - 0 - ], - [ - 0.625, - -93.7421875 - ] - ], - "lastCommittedPoint": null, + "boundElementIds": [], "startBinding": { "elementId": "H2rrZfUI5kDk2fa982pFA", "focus": -0.044656571726164086, @@ -715,42 +706,42 @@ "focus": 0.09561067905754547, "gap": 4.113949074597102 }, + "lastCommittedPoint": null, "startArrowhead": null, - "endArrowhead": "arrow" - }, - { - "id": "E89OFYWHnyapVNraQK6pF", - "type": "arrow", - "x": 1590.7833944084748, - "y": 1090.12109375, - "width": 2.5, - "height": 54.69140625, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, - "groupIds": [], - "strokeSharpness": "round", - "seed": 1555295773, - "version": 57, - "versionNonce": 913368765, - "isDeleted": false, - "boundElementIds": null, + "endArrowhead": "arrow", "points": [ [ 0, 0 ], [ - -2.5, - -54.69140625 + 0.625, + -93.7421875 ] - ], - "lastCommittedPoint": null, + ] + }, + { + "type": "arrow", + "version": 61, + "versionNonce": 471358910, + "isDeleted": false, + "id": "E89OFYWHnyapVNraQK6pF", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1590.7833944084748, + "y": 1090.12109375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.5, + "height": 54.69140625, + "seed": 1555295773, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], "startBinding": { "elementId": "VXTr4t2TCfsx3lBbrX9FA", "focus": 0.03745027340171186, @@ -761,13 +752,24 @@ "focus": -0.048987941378323296, "gap": 4.345762088088847 }, + "lastCommittedPoint": null, "startArrowhead": null, - "endArrowhead": "arrow" + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -2.5, + -54.69140625 + ] + ] }, { "type": "rectangle", - "version": 661, - "versionNonce": 1384361875, + "version": 663, + "versionNonce": 376694050, "isDeleted": false, "id": "_LhK1JP2uBFu9cs14lXrK", "fillStyle": "hachure", @@ -789,8 +791,8 @@ }, { "type": "text", - "version": 367, - "versionNonce": 1967332787, + "version": 369, + "versionNonce": 654439934, "isDeleted": false, "id": "KvB7SKO8PrwXdeyL73xr_", "fillStyle": "hachure", @@ -818,8 +820,8 @@ }, { "type": "rectangle", - "version": 420, - "versionNonce": 70141235, + "version": 423, + "versionNonce": 2014368482, "isDeleted": false, "id": "-glBvfuqfOWMmoU9gXRFT", "fillStyle": "hachure", @@ -837,12 +839,14 @@ "seed": 290301587, "groupIds": [], "strokeSharpness": "round", - "boundElementIds": [] + "boundElementIds": [ + "5ga8yTO8PWQUQYLeZ_f6b" + ] }, { "type": "text", - "version": 300, - "versionNonce": 175779773, + "version": 307, + "versionNonce": 1912351678, "isDeleted": false, "id": "nrPdO2GBc4d1bH82trixr", "fillStyle": "hachure", @@ -860,7 +864,9 @@ "seed": 817102877, "groupIds": [], "strokeSharpness": "round", - "boundElementIds": [], + "boundElementIds": [ + "5ga8yTO8PWQUQYLeZ_f6b" + ], "fontSize": 14.094472755782043, "fontFamily": 1, "text": "v3.4.0-beta", @@ -868,215 +874,10 @@ "textAlign": "center", "verticalAlign": "middle" }, - { - "type": "ellipse", - "version": 506, - "versionNonce": 2067080915, - "isDeleted": false, - "id": "VaF9V5M1LnrUThs-jQWHP", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, - "angle": 0, - "x": 1802.1076131584748, - "y": 871.548828125, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 65.4140625, - "height": 68.76953125, - "seed": 1720262067, - "groupIds": [], - "strokeSharpness": "round", - "boundElementIds": [ - "ZsWo12aT76lV6R2H0b8V-", - "ErrLp--GEOsR3AU2FNwwz", - "3c3zZZ8zVq7no-eT4hyXg", - "DKJsQnJQP6zamLM3YcUgM", - "E89OFYWHnyapVNraQK6pF", - "9d9CMdbxWDQ158maCuq2K", - "FgsmrG4hr5lHP2MrO5s8R", - "KOoF1ll_rbvOkUtB5nQrm" - ] - }, { "type": "text", - "version": 380, - "versionNonce": 1530110941, - "isDeleted": false, - "id": "2WGdO8YR0j_5L0btHUCz1", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, - "angle": 0, - "x": 1749.3458944084748, - "y": 838.90625, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 178, - "height": 25, - "seed": 1843237341, - "groupIds": [], - "strokeSharpness": "round", - "boundElementIds": [], - "fontSize": 20, - "fontFamily": 1, - "text": "PRODUCT-staging", - "baseline": 18, - "textAlign": "center", - "verticalAlign": "top" - }, - { - "type": "ellipse", - "version": 693, - "versionNonce": 1580127347, - "isDeleted": false, - "id": "s_yysWSxHvWgqQNOQytNk", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, - "angle": 0, - "x": 1801.4044881584748, - "y": 1071.048828125, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 65.4140625, - "height": 68.76953125, - "seed": 71224733, - "groupIds": [], - "strokeSharpness": "round", - "boundElementIds": [ - "ZsWo12aT76lV6R2H0b8V-", - "ErrLp--GEOsR3AU2FNwwz", - "3c3zZZ8zVq7no-eT4hyXg", - "DKJsQnJQP6zamLM3YcUgM", - "E89OFYWHnyapVNraQK6pF", - "cRUGdqlcsVRxXboaX7eUv", - "KOoF1ll_rbvOkUtB5nQrm" - ] - }, - { - "id": "YFDoA96OIHSUPRj9uNZG9", - "type": "text", - "x": 1825.2287069084748, - "y": 1251.4453125, - "width": 16, - "height": 25, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, - "groupIds": [], - "strokeSharpness": "round", - "seed": 14043197, - "version": 116, - "versionNonce": 2957373, - "isDeleted": false, - "boundElementIds": null, - "text": "...", - "fontSize": 20, - "fontFamily": 1, - "textAlign": "center", - "verticalAlign": "top", - "baseline": 18 - }, - { - "id": "z6WqdkPoM_Z3D6W6gP42W", - "type": "arrow", - "x": 1628.8537069084748, - "y": 1258.87109375, - "width": 169.60222737006848, - "height": 117.26753555357459, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, - "groupIds": [], - "strokeSharpness": "round", - "seed": 369037107, - "version": 185, - "versionNonce": 1433931933, - "isDeleted": false, - "boundElementIds": null, - "points": [ - [ - 0, - 0 - ], - [ - 169.60222737006848, - -117.26753555357459 - ] - ], - "lastCommittedPoint": null, - "startBinding": null, - "endBinding": null, - "startArrowhead": null, - "endArrowhead": "arrow" - }, - { - "id": "9d9CMdbxWDQ158maCuq2K", - "type": "arrow", - "x": 1624.1701131584748, - "y": 985.66015625, - "width": 172.5390625, - "height": 73.01171875, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, - "groupIds": [], - "strokeSharpness": "round", - "seed": 548464211, - "version": 81, - "versionNonce": 1782879155, - "isDeleted": false, - "boundElementIds": null, - "points": [ - [ - 0, - 0 - ], - [ - 172.5390625, - -73.01171875 - ] - ], - "lastCommittedPoint": null, - "startBinding": { - "elementId": "s6P4OqGNKJFw1EDYtmZZv", - "focus": 0.14599706380315358, - "gap": 7.993288982279637 - }, - "endBinding": { - "elementId": "VaF9V5M1LnrUThs-jQWHP", - "focus": 0.25387040147360945, - "gap": 5.937879878269271 - }, - "startArrowhead": null, - "endArrowhead": "arrow" - }, - { - "type": "text", - "version": 177, - "versionNonce": 1436044637, + "version": 179, + "versionNonce": 1492545506, "isDeleted": false, "id": "VSB6KRjDrKaaQgIKYbm0R", "fillStyle": "hachure", @@ -1103,247 +904,49 @@ "verticalAlign": "top" }, { - "type": "text", - "version": 413, - "versionNonce": 685998835, + "type": "rectangle", + "version": 343, + "versionNonce": 1812888190, "isDeleted": false, - "id": "5aFLJMqKE7dheHdiTupPl", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, - "angle": 5.697612295759227, - "x": 1711.959175658475, - "y": 1184.8203125, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 53, - "height": 25, - "seed": 1302932317, - "groupIds": [], - "strokeSharpness": "round", - "boundElementIds": [], - "fontSize": 20, - "fontFamily": 1, - "text": "merge", - "baseline": 18, - "textAlign": "center", - "verticalAlign": "top" - }, - { - "type": "text", - "version": 347, - "versionNonce": 1799395773, - "isDeleted": false, - "id": "iwzO6uFUgvNMG38ZS5g6o", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, - "angle": 5.878639824436498, - "x": 1701.177925658475, - "y": 941.0234375, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 53, - "height": 25, - "seed": 170129523, - "groupIds": [], - "strokeSharpness": "round", - "boundElementIds": [], - "fontSize": 20, - "fontFamily": 1, - "text": "merge", - "baseline": 18, - "textAlign": "center", - "verticalAlign": "top" - }, - { - "id": "FgsmrG4hr5lHP2MrO5s8R", - "type": "arrow", - "x": 1876.6740194084748, - "y": 906.5546875, - "width": 131.453125, - "height": 4.58203125, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, - "groupIds": [], - "strokeSharpness": "round", - "seed": 638118643, - "version": 76, - "versionNonce": 1509731475, - "isDeleted": false, - "boundElementIds": null, - "points": [ - [ - 0, - 0 - ], - [ - 131.453125, - -4.58203125 - ] - ], - "lastCommittedPoint": null, - "startBinding": { - "elementId": "VaF9V5M1LnrUThs-jQWHP", - "focus": 0.06046380833199841, - "gap": 9.156601290169284 - }, - "endBinding": null, - "startArrowhead": null, - "endArrowhead": "arrow" - }, - { - "id": "cRUGdqlcsVRxXboaX7eUv", - "type": "arrow", - "x": 1881.0855588399368, - "y": 1102.2806837868989, - "width": 117.90096056853827, - "height": 0.16936578725585605, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, - "groupIds": [], - "strokeSharpness": "round", - "seed": 984565661, - "version": 305, - "versionNonce": 1390434845, - "isDeleted": false, - "boundElementIds": null, - "points": [ - [ - 0, - 0 - ], - [ - 117.90096056853827, - -0.16936578725585605 - ] - ], - "lastCommittedPoint": null, - "startBinding": { - "elementId": "s_yysWSxHvWgqQNOQytNk", - "focus": -0.08779841690752188, - "gap": 14.365559189322425 - }, - "endBinding": { - "elementId": "kN6CZUYhLA0Zj8thwW9WK", - "focus": -0.11245191540211615, - "gap": 9.5859375 - }, - "startArrowhead": null, - "endArrowhead": "arrow" - }, - { "id": "l56iGD3sn2wE1jpAe4ahC", - "type": "rectangle", - "x": 2013.2208944084748, - "y": 856.1953125, - "width": 116.50781250000023, - "height": 88.8671875, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", "fillStyle": "hachure", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 2, "opacity": 100, - "groupIds": [], - "strokeSharpness": "round", + "angle": 0, + "x": 1935.5021444084748, + "y": 963.30859375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 116.50781250000023, + "height": 88.8671875, "seed": 1978032861, - "version": 70, - "versionNonce": 1164512893, - "isDeleted": false, - "boundElementIds": null - }, - { - "id": "BLCZtWmQ6-ehPzhO-L9au", - "type": "text", - "x": 2035.974800658475, - "y": 875.62890625, - "width": 71, - "height": 50, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, - "groupIds": [], - "strokeSharpness": "round", - "seed": 654630909, - "version": 17, - "versionNonce": 1817371603, - "isDeleted": false, - "boundElementIds": null, - "text": "binary\nrelease", - "fontSize": 20, - "fontFamily": 1, - "textAlign": "center", - "verticalAlign": "middle", - "baseline": 43 - }, - { - "type": "rectangle", - "version": 205, - "versionNonce": 1637627613, - "isDeleted": false, - "id": "kN6CZUYhLA0Zj8thwW9WK", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, - "angle": 0, - "x": 2008.5724569084746, - "y": 1052.57421875, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 116.50781250000023, - "height": 88.8671875, - "seed": 123589789, "groupIds": [], "strokeSharpness": "round", "boundElementIds": [ - "cRUGdqlcsVRxXboaX7eUv" + "GO0tq3-qTL5xGa4FqNPel" ] }, { "type": "text", - "version": 132, - "versionNonce": 1049424243, + "version": 289, + "versionNonce": 322050082, "isDeleted": false, - "id": "dZ-xZ6tKWg_R_Tvnh52bu", + "id": "BLCZtWmQ6-ehPzhO-L9au", "fillStyle": "hachure", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 2, "opacity": 100, "angle": 0, - "x": 2024.728706908475, - "y": 1073.40625, + "x": 1958.256050658475, + "y": 982.7421875, "strokeColor": "#000000", "backgroundColor": "transparent", "width": 71, "height": 50, - "seed": 93130675, + "seed": 654630909, "groupIds": [], "strokeSharpness": "round", "boundElementIds": [], @@ -1355,53 +958,24 @@ "verticalAlign": "middle" }, { + "type": "text", + "version": 386, + "versionNonce": 45380350, + "isDeleted": false, "id": "tkm3e2izHwHNnA8Lcc5WG", - "type": "text", - "x": 1874.5880819084748, - "y": 879.94921875, - "width": 101, - "height": 50, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", "fillStyle": "hachure", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 2, "opacity": 100, - "groupIds": [], - "strokeSharpness": "round", + "angle": 0, + "x": 1796.8693319084748, + "y": 991.0625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 101, + "height": 50, "seed": 1910496637, - "version": 109, - "versionNonce": 1913344829, - "isDeleted": false, - "boundElementIds": null, - "text": "CI build &\npublish", - "fontSize": 20, - "fontFamily": 1, - "textAlign": "center", - "verticalAlign": "top", - "baseline": 43 - }, - { - "type": "text", - "version": 245, - "versionNonce": 1930945437, - "isDeleted": false, - "id": "NxD-0wUhkx3JymNtjIX9V", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, - "angle": 0, - "x": 1876.6662069084748, - "y": 1074.7578125, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 101, - "height": 50, - "seed": 1410233747, "groupIds": [], "strokeSharpness": "round", "boundElementIds": [], @@ -1413,113 +987,56 @@ "verticalAlign": "top" }, { - "id": "m1Xhg8wN1xso2OXh8pOyU", "type": "text", - "x": 1346.0138631584748, - "y": 679.30859375, + "version": 254, + "versionNonce": 2036443938, + "isDeleted": false, + "id": "m1Xhg8wN1xso2OXh8pOyU", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1280.1310506584748, + "y": 690.71484375, + "strokeColor": "#000000", + "backgroundColor": "transparent", "width": 702.3518750000002, "height": 38.42187500000003, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, + "seed": 540380669, "groupIds": [], "strokeSharpness": "round", - "seed": 540380669, - "version": 185, - "versionNonce": 1434415283, - "isDeleted": false, - "boundElementIds": null, - "text": "=[ Ideal ooni/probe-cli development process ]=", + "boundElementIds": [], "fontSize": 30.73750000000001, "fontFamily": 1, + "text": "=[ Ideal ooni/probe-cli development process ]=", + "baseline": 27.42187500000003, "textAlign": "center", - "verticalAlign": "top", - "baseline": 27.42187500000003 + "verticalAlign": "top" }, { - "id": "KOoF1ll_rbvOkUtB5nQrm", "type": "arrow", - "x": 1832.2201114984887, - "y": 1064.1524848341573, - "width": 3.8643214147527942, - "height": 122.06640596718341, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", + "version": 129, + "versionNonce": 512454846, + "isDeleted": false, + "id": "WMUUsb8QMcD0Esl_zVVcA", "fillStyle": "hachure", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 2, "opacity": 100, - "groupIds": [], - "strokeSharpness": "round", - "seed": 1419722643, - "version": 107, - "versionNonce": 1492346877, - "isDeleted": false, - "boundElementIds": null, - "points": [ - [ - 0, - 0 - ], - [ - -3.8643214147527942, - -122.06640596718341 - ] - ], - "lastCommittedPoint": null, - "startBinding": { - "elementId": "s_yysWSxHvWgqQNOQytNk", - "focus": -0.017449031873565522, - "gap": 6.9433909562065 - }, - "endBinding": { - "elementId": "VaF9V5M1LnrUThs-jQWHP", - "focus": 0.23233980950947344, - "gap": 2.39569092262321 - }, - "startArrowhead": null, - "endArrowhead": "arrow" - }, - { - "id": "WMUUsb8QMcD0Esl_zVVcA", - "type": "arrow", + "angle": 0, "x": 1417.2990194084748, "y": 1274.5234375, - "width": 150.6173141923548, - "height": 85.24313437528917, - "angle": 0, "strokeColor": "#000000", "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, + "width": 150.6173141923548, + "height": 85.24313437528917, + "seed": 367157373, "groupIds": [], "strokeSharpness": "round", - "seed": 367157373, - "version": 127, - "versionNonce": 1884611155, - "isDeleted": false, - "boundElementIds": null, - "points": [ - [ - 0, - 0 - ], - [ - -150.6173141923548, - -85.24313437528917 - ] - ], - "lastCommittedPoint": null, + "boundElementIds": [], "startBinding": { "elementId": "61hQjrW1eCfb5OIprSXq3", "focus": 0.4448864992719663, @@ -1530,68 +1047,68 @@ "focus": 0.8748653796977708, "gap": 14.676496192619688 }, + "lastCommittedPoint": null, "startArrowhead": null, - "endArrowhead": "arrow" - }, - { - "id": "t8m7A_AiI0Zz6g-q3XhnP", - "type": "ellipse", - "x": 1208.2599569084748, - "y": 1098.05078125, - "width": 77.91796875, - "height": 80.2890625, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, - "groupIds": [], - "strokeSharpness": "round", - "seed": 205241949, - "version": 181, - "versionNonce": 362766429, - "isDeleted": false, - "boundElementIds": [ - "70dbl4jJzrLBtDEytNCQV", - "WMUUsb8QMcD0Esl_zVVcA" - ] - }, - { - "id": "70dbl4jJzrLBtDEytNCQV", - "type": "arrow", - "x": 1247.6935506584748, - "y": 1097.83203125, - "width": 1.41015625, - "height": 67.89453125, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, - "groupIds": [], - "strokeSharpness": "round", - "seed": 1082596541, - "version": 363, - "versionNonce": 516628467, - "isDeleted": false, - "boundElementIds": null, + "endArrowhead": "arrow", "points": [ [ 0, 0 ], [ - -1.41015625, - -67.89453125 + -150.6173141923548, + -85.24313437528917 ] - ], - "lastCommittedPoint": null, + ] + }, + { + "type": "ellipse", + "version": 183, + "versionNonce": 1991213602, + "isDeleted": false, + "id": "t8m7A_AiI0Zz6g-q3XhnP", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1208.2599569084748, + "y": 1098.05078125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 77.91796875, + "height": 80.2890625, + "seed": 205241949, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [ + "70dbl4jJzrLBtDEytNCQV", + "WMUUsb8QMcD0Esl_zVVcA" + ] + }, + { + "type": "arrow", + "version": 365, + "versionNonce": 798664958, + "isDeleted": false, + "id": "70dbl4jJzrLBtDEytNCQV", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1247.6935506584748, + "y": 1097.83203125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 1.41015625, + "height": 67.89453125, + "seed": 1082596541, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], "startBinding": { "elementId": "t8m7A_AiI0Zz6g-q3XhnP", "focus": 0.03369303215762137, @@ -1602,126 +1119,126 @@ "focus": 0.02205392272987631, "gap": 2.894614565986096 }, + "lastCommittedPoint": null, "startArrowhead": null, - "endArrowhead": "arrow" - }, - { - "id": "cbY7dAu_xBZLtfnwANQ0h", - "type": "ellipse", - "x": 1208.3615194084748, - "y": 960.5625, - "width": 76.01953124999999, - "height": 66.48046875000001, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, - "groupIds": [], - "strokeSharpness": "round", - "seed": 92260445, - "version": 169, - "versionNonce": 1592609981, - "isDeleted": false, - "boundElementIds": [ - "70dbl4jJzrLBtDEytNCQV", - "-4uRLR2_U4-S_frteL9z4" - ] - }, - { - "id": "pvblHfogurhXv88mbBcRK", - "type": "text", - "x": 1190.8966756584748, - "y": 923.8671875, - "width": 97, - "height": 25, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, - "groupIds": [], - "strokeSharpness": "round", - "seed": 555034749, - "version": 127, - "versionNonce": 1256761747, - "isDeleted": false, - "boundElementIds": null, - "text": "issue/NNN", - "fontSize": 20, - "fontFamily": 1, - "textAlign": "center", - "verticalAlign": "top", - "baseline": 18 - }, - { - "id": "l5V8BKWT6NL8Pot9eGQxW", - "type": "text", - "x": 1305.6271444084748, - "y": 1239.46875, - "width": 61, - "height": 25, - "angle": 0.5019114078121252, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, - "groupIds": [], - "strokeSharpness": "round", - "seed": 1943628413, - "version": 208, - "versionNonce": 880717085, - "isDeleted": false, - "boundElementIds": null, - "text": "branch", - "fontSize": 20, - "fontFamily": 1, - "textAlign": "center", - "verticalAlign": "top", - "baseline": 18 - }, - { - "id": "-4uRLR2_U4-S_frteL9z4", - "type": "arrow", - "x": 1281.456370622558, - "y": 1027.6261866542388, - "width": 134.43973816675407, - "height": 87.48529746818951, - "angle": 0.004286381490581803, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "dashed", - "roughness": 2, - "opacity": 100, - "groupIds": [], - "strokeSharpness": "round", - "seed": 515639315, - "version": 475, - "versionNonce": 1508114227, - "isDeleted": false, - "boundElementIds": null, + "endArrowhead": "arrow", "points": [ [ 0, 0 ], [ - 134.43973816675407, - 87.48529746818951 + -1.41015625, + -67.89453125 ] - ], - "lastCommittedPoint": null, + ] + }, + { + "type": "ellipse", + "version": 171, + "versionNonce": 729738722, + "isDeleted": false, + "id": "cbY7dAu_xBZLtfnwANQ0h", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1208.3615194084748, + "y": 960.5625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 76.01953124999999, + "height": 66.48046875000001, + "seed": 92260445, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [ + "70dbl4jJzrLBtDEytNCQV", + "-4uRLR2_U4-S_frteL9z4" + ] + }, + { + "type": "text", + "version": 129, + "versionNonce": 43571518, + "isDeleted": false, + "id": "pvblHfogurhXv88mbBcRK", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1190.8966756584748, + "y": 923.8671875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 97, + "height": 25, + "seed": 555034749, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "fontSize": 20, + "fontFamily": 1, + "text": "issue/NNN", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top" + }, + { + "type": "text", + "version": 210, + "versionNonce": 854253986, + "isDeleted": false, + "id": "l5V8BKWT6NL8Pot9eGQxW", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0.5019114078121252, + "x": 1305.6271444084748, + "y": 1239.46875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 61, + "height": 25, + "seed": 1943628413, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "fontSize": 20, + "fontFamily": 1, + "text": "branch", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top" + }, + { + "type": "arrow", + "version": 477, + "versionNonce": 1860632958, + "isDeleted": false, + "id": "-4uRLR2_U4-S_frteL9z4", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 2, + "opacity": 100, + "angle": 0.004286381490581803, + "x": 1281.456370622558, + "y": 1027.6261866542388, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 134.43973816675407, + "height": 87.48529746818951, + "seed": 515639315, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], "startBinding": { "elementId": "cbY7dAu_xBZLtfnwANQ0h", "focus": 0.2493704175711463, @@ -1732,111 +1249,73 @@ "focus": 0.09625345211262865, "gap": 8.481964629522814 }, + "lastCommittedPoint": null, "startArrowhead": null, - "endArrowhead": "arrow" + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 134.43973816675407, + 87.48529746818951 + ] + ] }, { - "id": "uF9xy7cXMn1FvZunqydoW", "type": "text", - "x": 1295.7169881584748, - "y": 1039.40625, - "width": 92, - "height": 50, - "angle": 0.6085681160569036, - "strokeColor": "#000000", - "backgroundColor": "transparent", + "version": 487, + "versionNonce": 404905314, + "isDeleted": false, + "id": "uF9xy7cXMn1FvZunqydoW", "fillStyle": "hachure", "strokeWidth": 1, "strokeStyle": "dashed", "roughness": 2, "opacity": 100, + "angle": 0.6085681160569036, + "x": 1295.7169881584748, + "y": 1039.40625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 92, + "height": 50, + "seed": 1420693821, "groupIds": [], "strokeSharpness": "round", - "seed": 1420693821, - "version": 485, - "versionNonce": 633667965, - "isDeleted": false, "boundElementIds": [ "-4uRLR2_U4-S_frteL9z4" ], - "text": "squash &\nmerge", "fontSize": 20, "fontFamily": 1, + "text": "squash &\nmerge", + "baseline": 43, "textAlign": "center", - "verticalAlign": "top", - "baseline": 43 + "verticalAlign": "top" }, { - "id": "KdT7jD6HzANFmEe6z4wLp", "type": "arrow", - "x": 1833.0998006584748, - "y": 1252.171875, - "width": 2.63671875, - "height": 94.6484375, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, - "groupIds": [], - "strokeSharpness": "round", - "seed": 2067697885, - "version": 110, - "versionNonce": 1476512221, + "version": 211, + "versionNonce": 678715682, "isDeleted": false, - "boundElementIds": null, - "points": [ - [ - 0, - 0 - ], - [ - -2.63671875, - -94.6484375 - ] - ], - "lastCommittedPoint": null, - "startBinding": null, - "endBinding": null, - "startArrowhead": null, - "endArrowhead": "arrow" - }, - { "id": "TT0_3mZZNKiBunuQSP-6q", - "type": "arrow", - "x": 1555.6427694084748, - "y": 1114.3515625, - "width": 91.1191404562444, - "height": 83.38521337099382, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", "fillStyle": "hachure", "strokeWidth": 1, "strokeStyle": "dashed", "roughness": 2, "opacity": 100, + "angle": 0, + "x": 1555.6427694084748, + "y": 1114.3515625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 91.1191404562444, + "height": 83.38521337099382, + "seed": 1441302717, "groupIds": [], "strokeSharpness": "round", - "seed": 1441302717, - "version": 209, - "versionNonce": 2034110067, - "isDeleted": false, - "boundElementIds": null, - "points": [ - [ - 0, - 0 - ], - [ - -91.1191404562444, - -83.38521337099382 - ] - ], - "lastCommittedPoint": null, + "boundElementIds": [], "startBinding": { "elementId": "VXTr4t2TCfsx3lBbrX9FA", "focus": -0.38981301814327424, @@ -1847,42 +1326,53 @@ "focus": 0.49013243946634244, "gap": 9.849649250656697 }, + "lastCommittedPoint": null, "startArrowhead": null, - "endArrowhead": "arrow" + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -91.1191404562444, + -83.38521337099382 + ] + ] }, { - "id": "u4he9DEv2RkSQWCHnrB1f", "type": "text", - "x": 1496.6896444084748, - "y": 1059.35546875, - "width": 57, - "height": 50, - "angle": 0.8031270324586943, - "strokeColor": "#000000", - "backgroundColor": "transparent", + "version": 251, + "versionNonce": 274151934, + "isDeleted": false, + "id": "u4he9DEv2RkSQWCHnrB1f", "fillStyle": "hachure", "strokeWidth": 1, "strokeStyle": "dashed", "roughness": 2, "opacity": 100, + "angle": 0.8031270324586943, + "x": 1496.6896444084748, + "y": 1059.35546875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 57, + "height": 50, + "seed": 1349313139, "groupIds": [], "strokeSharpness": "round", - "seed": 1349313139, - "version": 249, - "versionNonce": 1279690301, - "isDeleted": false, - "boundElementIds": null, - "text": "cherry\npick", + "boundElementIds": [], "fontSize": 20, "fontFamily": 1, + "text": "cherry\npick", + "baseline": 43, "textAlign": "center", - "verticalAlign": "top", - "baseline": 43 + "verticalAlign": "top" }, { "type": "rectangle", - "version": 754, - "versionNonce": 1732591795, + "version": 756, + "versionNonce": 793767138, "isDeleted": false, "id": "sHsXEtwWTjBFom2nIhGIs", "fillStyle": "hachure", @@ -1904,8 +1394,8 @@ }, { "type": "text", - "version": 466, - "versionNonce": 1287846365, + "version": 468, + "versionNonce": 530270782, "isDeleted": false, "id": "0dgfZ8refzUdb0GHOjr_F", "fillStyle": "hachure", @@ -1930,6 +1420,175 @@ "baseline": 12, "textAlign": "center", "verticalAlign": "middle" + }, + { + "type": "rectangle", + "version": 378, + "versionNonce": 121553890, + "isDeleted": false, + "id": "q7DClrWmyGxwfXjKy2XJJ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1935.5021444084748, + "y": 1258.234375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 116.50781250000023, + "height": 88.8671875, + "seed": 1763826146, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [] + }, + { + "type": "text", + "version": 325, + "versionNonce": 602497854, + "isDeleted": false, + "id": "pslagGm6vRdPKOM8BCcfC", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1958.2560506584753, + "y": 1277.66796875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 71, + "height": 50, + "seed": 367701310, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "fontSize": 20, + "fontFamily": 1, + "text": "binary\nrelease", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "middle" + }, + { + "type": "text", + "version": 426, + "versionNonce": 1950349218, + "isDeleted": false, + "id": "2P11PhMCZn3Ro5kFyBNif", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1796.8693319084748, + "y": 1273.98828125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 101, + "height": 50, + "seed": 357584290, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "fontSize": 20, + "fontFamily": 1, + "text": "CI build &\npublish", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top" + }, + { + "id": "GO0tq3-qTL5xGa4FqNPel", + "type": "arrow", + "x": 1712.7208944084748, + "y": 1015.0400870045719, + "width": 213.9921875, + "height": 1.661370673197439, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 1208219362, + "version": 174, + "versionNonce": 1939241662, + "isDeleted": false, + "boundElementIds": null, + "points": [ + [ + 0, + 0 + ], + [ + 213.9921875, + 1.661370673197439 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "SeebVefCHR0BG_Msq_mBX", + "focus": -0.24184310980097481, + "gap": 14.603550844031815 + }, + "endBinding": { + "elementId": "l56iGD3sn2wE1jpAe4ahC", + "focus": -0.211197282114048, + "gap": 8.789062500000114 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "5ga8yTO8PWQUQYLeZ_f6b", + "type": "arrow", + "x": 1730.8732381584748, + "y": 1299.8515625, + "width": 205.75, + "height": 0.54296875, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 1249050814, + "version": 101, + "versionNonce": 1516548962, + "isDeleted": false, + "boundElementIds": null, + "points": [ + [ + 0, + 0 + ], + [ + 205.75, + -0.54296875 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "nrPdO2GBc4d1bH82trixr", + "focus": 0.7403380580231628, + "gap": 13.871156340342623 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" } ], "appState": { diff --git a/docs/branching.png b/docs/branching.png index bd3b5e2..aee5038 100644 Binary files a/docs/branching.png and b/docs/branching.png differ diff --git a/go.mod b/go.mod index 24a3b27..d980ff7 100644 --- a/go.mod +++ b/go.mod @@ -50,7 +50,7 @@ require ( gitlab.com/yawning/utls.git v0.0.12-1 golang.org/x/mod v0.5.1 // indirect golang.org/x/net v0.0.0-20211109214657-ef0fda0de508 - golang.org/x/sys v0.0.0-20211113001501-0c823b97ae02 + golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1 golang.org/x/text v0.3.7 // indirect golang.org/x/tools v0.1.8-0.20211022200916-316ba0b74098 // indirect gopkg.in/AlecAivazis/survey.v1 v1.8.8 diff --git a/go.sum b/go.sum index 143d6ec..af50615 100644 --- a/go.sum +++ b/go.sum @@ -833,8 +833,8 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211113001501-0c823b97ae02 h1:7NCfEGl0sfUojmX78nK9pBJuUlSZWEJA/TwASvfiPLo= -golang.org/x/sys v0.0.0-20211113001501-0c823b97ae02/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1 h1:kwrAHlwJ0DUBZwQ238v+Uod/3eZ8B2K5rYsUHBQvzmI= +golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b h1:9zKuko04nR4gjZ4+DNjHqRlAJqbJETHwiNKDqTfOjfE= diff --git a/internal/cmd/oohelperd/debian/changelog b/internal/cmd/oohelperd/debian/changelog deleted file mode 100644 index 415142d..0000000 --- a/internal/cmd/oohelperd/debian/changelog +++ /dev/null @@ -1,5 +0,0 @@ -oohelperd (0.0.1) unstable; urgency=medium - - * Test release - - -- Federico Ceratto Tue, 16 Feb 2021 12:39:41 +0000 diff --git a/internal/cmd/oohelperd/debian/compat b/internal/cmd/oohelperd/debian/compat deleted file mode 100644 index b4de394..0000000 --- a/internal/cmd/oohelperd/debian/compat +++ /dev/null @@ -1 +0,0 @@ -11 diff --git a/internal/cmd/oohelperd/debian/control b/internal/cmd/oohelperd/debian/control deleted file mode 100644 index 089edb1..0000000 --- a/internal/cmd/oohelperd/debian/control +++ /dev/null @@ -1,22 +0,0 @@ -Source: oohelperd -Maintainer: Federico Ceratto -Section: devel -Priority: optional -Build-Depends: - devscripts, - dpkg-dev, -Standards-Version: 4.5.0 -Vcs-Browser: https://github.com/ooni/probe-cli -Vcs-Git: https://github.com/ooni/probe-cli.git -Homepage: https://github.com/ooni/probe-cli -Rules-Requires-Root: no -XS-Go-Import-Path: github.com/ooni/probe-cli - -Package: oohelperd -Architecture: any -Pre-Depends: debconf (>= 1.0.0) -Depends: ${misc:Depends}, ${shlibs:Depends}, - adduser, - debconf -Built-Using: ${misc:Built-Using} -Description: OONI test helper diff --git a/internal/cmd/oohelperd/debian/copyright b/internal/cmd/oohelperd/debian/copyright deleted file mode 100644 index fa55b84..0000000 --- a/internal/cmd/oohelperd/debian/copyright +++ /dev/null @@ -1,40 +0,0 @@ -Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Source: https://github.com/ooni/probe-cli -Upstream-Name: oohelperd - -Files: * -Copyright: 2018 Open Observatory of Network Interference (OONI) -License: BSD-3-clause - -Files: debian/* -Copyright: 2020 Federico Ceratto -License: BSD-3-clause -Comment: Debian packaging is licensed under the same terms as upstream - -License: BSD-3-clause - Copyright 2018 Open Observatory of Network Interference (OONI), The Tor Project - . - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - . - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - . - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - . - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - . - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/internal/cmd/oohelperd/debian/oohelperd.install b/internal/cmd/oohelperd/debian/oohelperd.install deleted file mode 100644 index 780e51c..0000000 --- a/internal/cmd/oohelperd/debian/oohelperd.install +++ /dev/null @@ -1 +0,0 @@ -oohelperd /usr/bin diff --git a/internal/cmd/oohelperd/debian/oohelperd.postinst b/internal/cmd/oohelperd/debian/oohelperd.postinst deleted file mode 100755 index b12007f..0000000 --- a/internal/cmd/oohelperd/debian/oohelperd.postinst +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh -set -e - -. /usr/share/debconf/confmodule -db_version 2.0 - -if [ "$1" = "configure" ]; then - if ! getent passwd oohelperd >/dev/null; then - adduser --quiet --system --group --home /var/lib/oohelperd oohelperd - fi -fi - -#DEBHELPER# - -exit 0 diff --git a/internal/cmd/oohelperd/debian/oohelperd.service b/internal/cmd/oohelperd/debian/oohelperd.service deleted file mode 100644 index 4e35595..0000000 --- a/internal/cmd/oohelperd/debian/oohelperd.service +++ /dev/null @@ -1,50 +0,0 @@ -[Unit] -Description=OONI Test heper -Documentation=https://ooni.org/ -After=network.target tor.target -Wants=network-online.target - -[Service] -Type=simple -ExecStart=/usr/bin/oohelperd -TimeoutStopSec=5 -KillMode=mixed - -User=oohelperd -PermissionsStartOnly=true -Restart=on-abnormal -RestartSec=2s -LimitNOFILE=65536 -WorkingDirectory=/var/lib/oohelperd -RuntimeDirectory=oohelperd -StateDirectory=oohelperd -LogsDirectory=oohelperd -ConfigurationDirectory=oohelperd - -# Sandboxing -CapabilityBoundingSet=CAP_NET_BIND_SERVICE -LockPersonality=yes -NoNewPrivileges=yes -PrivateDevices=yes -PrivateTmp=yes -PrivateUsers=yes -ProtectClock=yes -ProtectControlGroups=yes -ProtectHome=yes -ProtectHostname=yes -ProtectKernelLogs=yes -ProtectKernelModules=yes -ProtectKernelTunables=yes -ProtectSystem=full -ReadOnlyDirectories=/ -ReadWriteDirectories=-/proc -ReadWriteDirectories=-/var/lib/oohelperd -ReadWriteDirectories=-/var/run -RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 -RestrictNamespaces=yes -RestrictRealtime=yes -SystemCallArchitectures=native -SystemCallFilter=@system-service - -[Install] -WantedBy=multi-user.target diff --git a/internal/cmd/oohelperd/debian/rules b/internal/cmd/oohelperd/debian/rules deleted file mode 100755 index f628410..0000000 --- a/internal/cmd/oohelperd/debian/rules +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/make -f - -export DH_VERBOSE=1 - -%: - dh $@ - -override_dh_auto_clean: - dh_auto_clean - -override_dh_auto_build: - # The oohelperd binary is provided - cp ../../../oohelperd . - -override_dh_dwz: - true - -override_dh_auto_install: - dh_auto_install -- --no-source diff --git a/internal/cmd/oohelperd/debian/source/format b/internal/cmd/oohelperd/debian/source/format deleted file mode 100644 index 89ae9db..0000000 --- a/internal/cmd/oohelperd/debian/source/format +++ /dev/null @@ -1 +0,0 @@ -3.0 (native) diff --git a/mk b/mk index d786398..ac549a8 100755 --- a/mk +++ b/mk @@ -46,12 +46,6 @@ ANDROID_INSTALL_EXTRA = 'build-tools;29.0.3' 'platforms;android-31' #help: * ANDROID_NDK_VERSION : Android NDK version. ANDROID_NDK_VERSION = 23.1.7779620 -#help: -#help: * DEBIAN_TILDE_VERSION : if non-empty, this should be "[0-9]+" and -#help: will be appended to the package version using -#help: a tilde, thus producing, e.g., "1.0~1234". -DEBIAN_TILDE_VERSION = - #help: #help: * GIT_CLONE_DIR : directory where to clone repositories, by default #help: set to `$HOME/.ooniprobe-build/src`. @@ -61,17 +55,6 @@ GIT_CLONE_DIR = $(HOME)/.ooniprobe-build/src $(GIT_CLONE_DIR): mkdir -p $(GIT_CLONE_DIR) -#help: -#help: * GOLANG_DOCKER_GOCACHE : where to store golang's build cache to -#help: speed up subsequent Docker builds. -GOLANG_DOCKER_GOCACHE = $(HOME)/.ooniprobe-build/docker/gocache - -#help: -#help: * GOLANG_DOCKER_GOPATH : GOPATH directory used by builds running -#help: inside docker to significantly speed -#help: up subsequent Docker based builds. -GOLANG_DOCKER_GOPATH := $(HOME)/.ooniprobe-build/docker/gopath - #help: #help: * GOLANG_EXTRA_FLAGS : extra flags passed to `go build ...`, empty by #help: default. Useful to pass flags to `go`, e.g.: @@ -83,13 +66,6 @@ GOLANG_EXTRA_FLAGS = #help: * GOLANG_VERSION_NUMBER : the expected version number for golang. GOLANG_VERSION_NUMBER = 1.17.3 -#help: -#help: * GPG_USER : allows overriding the default GPG user used -#help: to sign binary releases, e.g.: -#help: -#help: ./mk GPG_USER=john@doe.com ooniprobe/windows -GPG_USER = simone@openobservatory.org - #help: #help: * MINGW_W64_VERSION : the expected mingw-w64 version. MINGW_W64_VERSION = 10.3.1 @@ -130,13 +106,9 @@ show-config: @echo "ANDROID_CLI_SHA256=$(ANDROID_CLI_SHA256)" @echo "ANDROID_INSTALL_EXTRA=$(ANDROID_INSTALL_EXTRA)" @echo "ANDROID_NDK_VERSION=$(ANDROID_NDK_VERSION)" - @echo "DEBIAN_TILDE_VERSION=$(DEBIAN_TILDE_VERSION)" @echo "GIT_CLONE_DIR=$(GIT_CLONE_DIR)" - @echo "GOLANG_DOCKER_GOCACHE=$(GOLANG_DOCKER_GOCACHE)" - @echo "GOLANG_DOCKER_GOPATH=$(GOLANG_DOCKER_GOPATH)" @echo "GOLANG_EXTRA_FLAGS=$(GOLANG_EXTRA_FLAGS)" @echo "GOLANG_VERSION_NUMBER=$(GOLANG_VERSION_NUMBER)" - @echo "GPG_USER=$(GPG_USER)" @echo "MINGW_W64_VERSION=$(MINGW_W64_VERSION)" @echo "OONI_PSIPHON_TAGS=$(OONI_PSIPHON_TAGS)" @echo "OONI_ANDROID_HOME=$(OONI_ANDROID_HOME)" @@ -160,7 +132,7 @@ GOLANG_DOCKER_IMAGE = golang:$(GOLANG_VERSION_NUMBER)-alpine #help: #help: You can also build the following subtargets: .PHONY: ./CLI/miniooni -./CLI/miniooni: \ +./CLI/miniooni: \ ./CLI/miniooni-darwin-amd64 \ ./CLI/miniooni-darwin-arm64 \ ./CLI/miniooni-linux-386 \ @@ -226,215 +198,91 @@ GOLANG_DOCKER_IMAGE = golang:$(GOLANG_VERSION_NUMBER)-alpine GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -tags="$(OONI_PSIPHON_TAGS)" -ldflags="-s -w" $(GOLANG_EXTRA_FLAGS) -o $@ ./internal/cmd/miniooni #help: -#help: The `./mk ./CLI/ooniprobe/darwin` command builds the ooniprobe official +#help: The `./mk ./CLI/ooniprobe-darwin` command builds the ooniprobe official #help: command line client for darwin/amd64 and darwin/arm64. This process #help: entails building ooniprobe and then GPG-signing the binaries. #help: #help: You can also build the following subtargets: -.PHONY: ./CLI/ooniprobe/darwin -./CLI/ooniprobe/darwin: \ - ./ooniprobe_darwin_amd64.tar.gz.asc \ - ./ooniprobe_darwin_arm64.tar.gz.asc - -# ./ooniprobe_darwin_amd64.tar.gz.asc creates and signs the release tarball -.PHONY: ./ooniprobe_darwin_amd64.tar.gz.asc -./ooniprobe_darwin_amd64.tar.gz.asc: ./CLI/darwin/amd64/ooniprobe - rm -f ooniprobe_darwin_amd64.tar.gz ooniprobe_darwin_amd64.tar.gz.asc - tar -cvzf ooniprobe_darwin_amd64.tar.gz -C ./CLI/darwin/amd64 ooniprobe - gpg -abu $(GPG_USER) ooniprobe_darwin_amd64.tar.gz +.PHONY: ./CLI/ooniprobe-darwin +./CLI/ooniprobe-darwin: ./CLI/ooniprobe-darwin-amd64 ./CLI/ooniprobe-darwin-arm64 # We force CGO_ENABLED=1 because in principle we may be cross compiling. In # reality it's hard to see a macOS/darwin build not made on macOS. #help: -#help: * `./mk ./CLI/darwin/amd64/ooniprobe`: darwin/amd64 -.PHONY: ./CLI/darwin/amd64/ooniprobe -./CLI/darwin/amd64/ooniprobe: search/for/go maybe/copypsiphon +#help: * `./mk ./CLI/ooniprobe-darwin-amd64`: darwin/amd64 +.PHONY: ./CLI/ooniprobe-darwin-amd64 +./CLI/ooniprobe-darwin-amd64: search/for/go maybe/copypsiphon GOOS=darwin GOARCH=amd64 CGO_ENABLED=1 go build -tags="$(OONI_PSIPHON_TAGS)" -ldflags="-s -w" $(GOLANG_EXTRA_FLAGS) -o $@ ./cmd/ooniprobe -# ./ooniprobe_darwin_arm64.tar.gz.asc creates and signs the release tarball -.PHONY: ./ooniprobe_darwin_arm64.tar.gz.asc -./ooniprobe_darwin_arm64.tar.gz.asc: ./CLI/darwin/arm64/ooniprobe - rm -f ooniprobe_darwin_arm64.tar.gz ooniprobe_darwin_arm64.tar.gz.asc - tar -cvzf ooniprobe_darwin_arm64.tar.gz -C ./CLI/darwin/arm64 ooniprobe - gpg -abu $(GPG_USER) ooniprobe_darwin_arm64.tar.gz - #help: -#help: * `./mk ./CLI/darwin/arm64/ooniprobe`: darwin/arm64 -.PHONY: ./CLI/darwin/arm64/ooniprobe -./CLI/darwin/arm64/ooniprobe: search/for/go maybe/copypsiphon +#help: * `./mk ./CLI/ooniprobe-darwin-arm64`: darwin/arm64 +.PHONY: ./CLI/ooniprobe-darwin-arm64 +./CLI/ooniprobe-darwin-arm64: search/for/go maybe/copypsiphon GOOS=darwin GOARCH=arm64 CGO_ENABLED=1 go build -tags="$(OONI_PSIPHON_TAGS)" -ldflags="-s -w" $(GOLANG_EXTRA_FLAGS) -o $@ ./cmd/ooniprobe #help: -#help: The `./mk ./debian` command builds the ooniprobe CLI -#help: debian package for amd64 and arm64. +#help: The `./mk ./CLI/ooniprobe-linux` command builds the ooniprobe official command +#help: line client for amd64, arm64, etc. #help: #help: You can also build the following subtargets: -.PHONY: ./debian -./debian: \ - ./debian/386 \ - ./debian/amd64 \ - ./debian/arm \ - ./debian/arm64 - -#help: -#help: * `./mk ./debian/386`: debian/386 -.PHONY: ./debian/386 -# This extra .PHONY for linux/386 is to help printing targets 🤷. -.PHONY: ./CLI/linux/386/ooniprobe -./debian/386: search/for/docker ./CLI/linux/386/ooniprobe - docker pull debian:stable - docker run -v $(shell pwd):/ooni -w /ooni debian:stable ./CLI/linux/pkgdebian 386 "$(DEBIAN_TILDE_VERSION)" - -#help: -#help: * `./mk ./debian/amd64`: debian/amd64 -.PHONY: ./debian/amd64 -# This extra .PHONY for linux/amd64 is to help printing targets 🤷. -.PHONY: ./CLI/linux/amd64/ooniprobe -./debian/amd64: search/for/docker ./CLI/linux/amd64/ooniprobe - docker pull debian:stable - docker run -v $(shell pwd):/ooni -w /ooni debian:stable ./CLI/linux/pkgdebian amd64 "$(DEBIAN_TILDE_VERSION)" - -# Note that we're building for armv7 here -#help: -#help: * `./mk ./debian/arm`: debian/arm -.PHONY: ./debian/arm -# This extra .PHONY for linux/arm is to help printing targets 🤷. -.PHONY: ./CLI/linux/arm/ooniprobe -./debian/arm: search/for/docker ./CLI/linux/arm/ooniprobe - docker pull debian:stable - docker run -v $(shell pwd):/ooni -w /ooni debian:stable ./CLI/linux/pkgdebian arm "$(DEBIAN_TILDE_VERSION)" - -#help: -#help: * `./mk ./debian/arm64`: debian/arm64 -.PHONY: ./debian/arm64 -# This extra .PHONY for linux/arm64 is to help printing targets 🤷. -.PHONY: ./CLI/linux/arm64/ooniprobe -./debian/arm64: search/for/docker ./CLI/linux/arm64/ooniprobe - docker pull debian:stable - docker run -v $(shell pwd):/ooni -w /ooni debian:stable ./CLI/linux/pkgdebian arm64 "$(DEBIAN_TILDE_VERSION)" - -#help: -#help: The `./mk ./CLI/ooniprobe/linux` command builds the ooniprobe official command -#help: line client for amd64 and arm64. This entails building and GPG signing. -#help: -#help: You can also build the following subtargets: -.PHONY: ./CLI/ooniprobe/linux -./CLI/ooniprobe/linux: \ - ./ooniprobe_linux_386.tar.gz.asc \ - ./ooniprobe_linux_amd64.tar.gz.asc \ - ./ooniprobe_linux_armv7.tar.gz.asc \ - ./ooniprobe_linux_arm64.tar.gz.asc - -# ./ooniprobe_linux_386.tar.gz.asc creates and signs the release tarball -.PHONY: ./ooniprobe_linux_386.tar.gz.asc -./ooniprobe_linux_386.tar.gz.asc: ./CLI/linux/386/ooniprobe - rm -f ooniprobe_linux_386.tar.gz ooniprobe_linux_386.tar.gz.asc - tar -cvzf ooniprobe_linux_386.tar.gz -C ./CLI/linux/386 ooniprobe - gpg -abu $(GPG_USER) ooniprobe_linux_386.tar.gz +.PHONY: ./CLI/ooniprobe-linux +./CLI/ooniprobe-linux: \ + ./CLI/ooniprobe-linux-386 \ + ./CLI/ooniprobe-linux-amd64 \ + ./CLI/ooniprobe-linux-armv7 \ + ./CLI/ooniprobe-linux-arm64 # Linux builds use Alpine and Docker so we are sure that we are statically # linking to musl libc, thus making our binaries extremely portable. #help: -#help: * `./mk ./CLI/linux/386/ooniprobe`: linux/386 -.PHONY: ./CLI/linux/386/ooniprobe -./CLI/linux/386/ooniprobe: search/for/docker maybe/copypsiphon +#help: * `./mk ./CLI/ooniprobe-linux-386`: linux/386 +.PHONY: ./CLI/ooniprobe-linux-386 +./CLI/ooniprobe-linux-386: search/for/docker maybe/copypsiphon docker pull --platform linux/386 $(GOLANG_DOCKER_IMAGE) - docker run --platform linux/386 -e GOPATH=/gopath -e GOARCH=386 -v $(GOLANG_DOCKER_GOCACHE)/386:/root/.cache/go-build -v $(GOLANG_DOCKER_GOPATH):/gopath -v $(shell pwd):/ooni -w /ooni $(GOLANG_DOCKER_IMAGE) ./CLI/linux/build -tags=netgo,$(OONI_PSIPHON_TAGS) $(GOLANG_EXTRA_FLAGS) - -# ./ooniprobe_linux_amd64.tar.gz.asc creates and signs the release tarball -.PHONY: ./ooniprobe_linux_amd64.tar.gz.asc -./ooniprobe_linux_amd64.tar.gz.asc: ./CLI/linux/amd64/ooniprobe - rm -f ooniprobe_linux_amd64.tar.gz ooniprobe_linux_amd64.tar.gz.asc - tar -cvzf ooniprobe_linux_amd64.tar.gz -C ./CLI/linux/amd64 ooniprobe - gpg -abu $(GPG_USER) ooniprobe_linux_amd64.tar.gz + docker run --platform linux/386 -e GOPATH=/gopath -e GOARCH=386 -v $(shell pwd):/ooni -w /ooni $(GOLANG_DOCKER_IMAGE) ./CLI/build-linux -tags=netgo,$(OONI_PSIPHON_TAGS) $(GOLANG_EXTRA_FLAGS) #help: -#help: * `./mk ./CLI/linux/amd64/ooniprobe`: linux/amd64 -.PHONY: ./CLI/linux/amd64/ooniprobe -./CLI/linux/amd64/ooniprobe: search/for/docker maybe/copypsiphon +#help: * `./mk ./CLI/ooniprobe-linux-amd64`: linux/amd64 +.PHONY: ./CLI/ooniprobe-linux-amd64 +./CLI/ooniprobe-linux-amd64: search/for/docker maybe/copypsiphon docker pull --platform linux/amd64 $(GOLANG_DOCKER_IMAGE) - docker run --platform linux/amd64 -e GOPATH=/gopath -e GOARCH=amd64 -v $(GOLANG_DOCKER_GOCACHE)/amd64:/root/.cache/go-build -v $(GOLANG_DOCKER_GOPATH):/gopath -v $(shell pwd):/ooni -w /ooni $(GOLANG_DOCKER_IMAGE) ./CLI/linux/build -tags=netgo,$(OONI_PSIPHON_TAGS) $(GOLANG_EXTRA_FLAGS) + docker run --platform linux/amd64 -e GOPATH=/gopath -e GOARCH=amd64 -v $(shell pwd):/ooni -w /ooni $(GOLANG_DOCKER_IMAGE) ./CLI/build-linux -tags=netgo,$(OONI_PSIPHON_TAGS) $(GOLANG_EXTRA_FLAGS) -# ./ooniprobe_linux_armv7.tar.gz.asc creates and signs the release tarball -.PHONY: ./ooniprobe_linux_armv7.tar.gz.asc -./ooniprobe_linux_armv7.tar.gz.asc: ./CLI/linux/arm/ooniprobe - rm -f ooniprobe_linux_armv7.tar.gz ooniprobe_linux_armv7.tar.gz.asc - tar -cvzf ooniprobe_linux_armv7.tar.gz -C ./CLI/linux/arm ooniprobe - gpg -abu $(GPG_USER) ooniprobe_linux_armv7.tar.gz - -# Note that we're building for armv7 here #help: -#help: * `./mk ./CLI/linux/arm/ooniprobe`: linux/arm -.PHONY: ./CLI/linux/arm/ooniprobe -./CLI/linux/arm/ooniprobe: search/for/docker maybe/copypsiphon +#help: * `./mk ./CLI/ooniprobe-linux-armv7`: linux/arm +.PHONY: ./CLI/ooniprobe-linux-armv7 +./CLI/ooniprobe-linux-armv7: search/for/docker maybe/copypsiphon docker pull --platform linux/arm/v7 $(GOLANG_DOCKER_IMAGE) - docker run --platform linux/arm/v7 -e GOPATH=/gopath -e GOARCH=arm -e GOARM=7 -v $(GOLANG_DOCKER_GOCACHE)/arm:/root/.cache/go-build -v $(GOLANG_DOCKER_GOPATH):/gopath -v $(shell pwd):/ooni -w /ooni $(GOLANG_DOCKER_IMAGE) ./CLI/linux/build -tags=netgo,$(OONI_PSIPHON_TAGS) $(GOLANG_EXTRA_FLAGS) - -# ./ooniprobe_linux_arm64.tar.gz.asc creates and signs the release tarball -.PHONY: ./ooniprobe_linux_arm64.tar.gz.asc -./ooniprobe_linux_arm64.tar.gz.asc: ./CLI/linux/arm64/ooniprobe - rm -f ooniprobe_linux_arm64.tar.gz ooniprobe_linux_arm64.tar.gz.asc - tar -cvzf ooniprobe_linux_arm64.tar.gz -C ./CLI/linux/arm64 ooniprobe - gpg -abu $(GPG_USER) ooniprobe_linux_arm64.tar.gz + docker run --platform linux/arm/v7 -e GOPATH=/gopath -e GOARCH=arm -e GOARM=7 -v $(shell pwd):/ooni -w /ooni $(GOLANG_DOCKER_IMAGE) ./CLI/build-linux -tags=netgo,$(OONI_PSIPHON_TAGS) $(GOLANG_EXTRA_FLAGS) #help: -#help: * `./mk ./CLI/linux/arm64/ooniprobe`: linux/arm64 -.PHONY: ./CLI/linux/arm64/ooniprobe -./CLI/linux/arm64/ooniprobe: search/for/docker maybe/copypsiphon +#help: * `./mk ./CLI/ooniprobe-linux-arm64`: linux/arm64 +.PHONY: ./CLI/ooniprobe-linux-arm64 +./CLI/ooniprobe-linux-arm64: search/for/docker maybe/copypsiphon docker pull --platform linux/arm64 $(GOLANG_DOCKER_IMAGE) - docker run --platform linux/arm64 -e GOPATH=/gopath -e GOARCH=arm64 -v $(GOLANG_DOCKER_GOCACHE)/arm64:/root/.cache/go-build -v $(GOLANG_DOCKER_GOPATH):/gopath -v $(shell pwd):/ooni -w /ooni $(GOLANG_DOCKER_IMAGE) ./CLI/linux/build -tags=netgo,$(OONI_PSIPHON_TAGS) $(GOLANG_EXTRA_FLAGS) + docker run --platform linux/arm64 -e GOPATH=/gopath -e GOARCH=arm64 -v $(shell pwd):/ooni -w /ooni $(GOLANG_DOCKER_IMAGE) ./CLI/build-linux -tags=netgo,$(OONI_PSIPHON_TAGS) $(GOLANG_EXTRA_FLAGS) #help: -#help: The `./mk ./CLI/ooniprobe/windows` command builds the ooniprobe official +#help: The `./mk ./CLI/ooniprobe-windows` command builds the ooniprobe official #help: command line client for windows/386 and windows/amd64. This entails #help: building and PGP signing the executables. #help: #help: You can also build the following subtargets: -.PHONY: ./CLI/ooniprobe/windows -./CLI/ooniprobe/windows: \ - ./ooniprobe_windows_386.tar.gz.asc \ - ./ooniprobe_windows_386.zip.asc \ - ./ooniprobe_windows_amd64.tar.gz.asc \ - ./ooniprobe_windows_amd64.zip.asc - -# ./ooniprobe_windows_386.tar.gz.asc creates and signs the release tarball -.PHONY: ./ooniprobe_windows_386.tar.gz.asc -./ooniprobe_windows_386.tar.gz.asc: ./CLI/windows/386/ooniprobe.exe - rm -f ooniprobe_windows_386.tar.gz ooniprobe_windows_386.tar.gz.asc - tar -cvzf ooniprobe_windows_386.tar.gz -C ./CLI/windows/386 ooniprobe.exe - gpg -abu $(GPG_USER) ooniprobe_windows_386.tar.gz - -# ./ooniprobe_windows_386.zip.asc creates and signs the release zipball -.PHONY: ./ooniprobe_windows_386.zip.asc -./ooniprobe_windows_386.zip.asc: ./CLI/windows/386/ooniprobe.exe - rm -f ooniprobe_windows_386.zip ooniprobe_windows_386.zip.asc - cd ./CLI/windows/386 && zip ../../../ooniprobe_windows_386.zip ooniprobe.exe - gpg -abu $(GPG_USER) ooniprobe_windows_386.zip +.PHONY: ./CLI/ooniprobe-windows +./CLI/ooniprobe-windows: \ + ./CLI/ooniprobe-windows-386.exe \ + ./CLI/ooniprobe-windows-amd64.exe #help: -#help: * `./mk ./CLI/windows/386/ooniprobe.exe`: windows/386 -.PHONY: ./CLI/windows/386/ooniprobe.exe -./CLI/windows/386/ooniprobe.exe: search/for/go search/for/mingw-w64 maybe/copypsiphon +#help: * `./mk ./CLI/ooniprobe-windows-386.exe`: windows/386 +.PHONY: ./CLI/ooniprobe-windows-386.exe +./CLI/ooniprobe-windows-386.exe: search/for/go search/for/mingw-w64 maybe/copypsiphon GOOS=windows GOARCH=386 CGO_ENABLED=1 CC=i686-w64-mingw32-gcc go build -tags="$(OONI_PSIPHON_TAGS)" -ldflags="-s -w" $(GOLANG_EXTRA_FLAGS) -o $@ ./cmd/ooniprobe -# ./ooniprobe_windows_amd64.tar.gz.asc creates and signs the release tarball -.PHONY: ./ooniprobe_windows_amd64.tar.gz.asc -./ooniprobe_windows_amd64.tar.gz.asc: ./CLI/windows/amd64/ooniprobe.exe - rm -f ooniprobe_windows_amd64.tar.gz ooniprobe_windows_amd64.tar.gz.asc - tar -cvzf ooniprobe_windows_amd64.tar.gz -C ./CLI/windows/amd64 ooniprobe.exe - gpg -abu $(GPG_USER) ooniprobe_windows_amd64.tar.gz - -# ./ooniprobe_windows_amd64.zip.asc creates and signs the release zipball -.PHONY: ./ooniprobe_windows_amd64.zip.asc -./ooniprobe_windows_amd64.zip.asc: ./CLI/windows/amd64/ooniprobe.exe - rm -f ooniprobe_windows_amd64.zip ooniprobe_windows_amd64.zip.asc - cd ./CLI/windows/amd64 && zip ../../../ooniprobe_windows_amd64.zip ooniprobe.exe - gpg -abu $(GPG_USER) ooniprobe_windows_amd64.zip - #help: -#help: * `./mk ./CLI/windows/amd64/ooniprobe.exe`: windows/amd64 -.PHONY: ./CLI/windows/amd64/ooniprobe.exe -./CLI/windows/amd64/ooniprobe.exe: search/for/go search/for/mingw-w64 maybe/copypsiphon +#help: * `./mk ./CLI/ooniprobe-windows-amd64.exe`: windows/amd64 +.PHONY: ./CLI/ooniprobe-windows-amd64.exe +./CLI/ooniprobe-windows-amd64.exe: search/for/go search/for/mingw-w64 maybe/copypsiphon GOOS=windows GOARCH=amd64 CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc go build -tags="$(OONI_PSIPHON_TAGS)" -ldflags="-s -w" $(GOLANG_EXTRA_FLAGS) -o $@ ./cmd/ooniprobe #help: @@ -442,14 +290,13 @@ GOLANG_DOCKER_IMAGE = golang:$(GOLANG_VERSION_NUMBER)-alpine #help: #help: You can also build the following subtargets: .PHONY: ./MOBILE/android -./MOBILE/android: search/for/gpg search/for/jar ./MOBILE/android/oonimkall.aar - cp ./MOBILE/android/oonimkall.aar ./MOBILE/android/oonimkall-$(OONIMKALL_V).aar - cp ./MOBILE/android/oonimkall-sources.jar ./MOBILE/android/oonimkall-$(OONIMKALL_V)-sources.jar - cat ./MOBILE/template.pom | sed -e "s/@VERSION@/$(OONIMKALL_V)/g" > ./MOBILE/android/oonimkall-$(OONIMKALL_V).pom - gpg -abu $(GPG_USER) ./MOBILE/android/oonimkall-$(OONIMKALL_V).aar - gpg -abu $(GPG_USER) ./MOBILE/android/oonimkall-$(OONIMKALL_V)-sources.jar - gpg -abu $(GPG_USER) ./MOBILE/android/oonimkall-$(OONIMKALL_V).pom - cd ./MOBILE/android && jar -cf bundle.jar oonimkall-$(OONIMKALL_V).aar oonimkall-$(OONIMKALL_V).aar.asc oonimkall-$(OONIMKALL_V)-sources.jar oonimkall-$(OONIMKALL_V)-sources.jar.asc oonimkall-$(OONIMKALL_V).pom oonimkall-$(OONIMKALL_V).pom.asc +./MOBILE/android: ./MOBILE/android/oonimkall.aar ./MOBILE/android/oonimkall.pom + +#help: +#help: * `./mk ./MOBILE/android/oonimkall.pom`: the POM +.PHONY: ./MOBILE/android/oonimkall.pom +./MOBILE/android/oonimkall.pom: + cat ./MOBILE/android/template.pom | sed -e "s/@VERSION@/$(OONIMKALL_V)/g" > ./MOBILE/android/oonimkall.pom #help: #help: * `./mk ./MOBILE/android/oonimkall.aar`: the AAR @@ -466,16 +313,14 @@ GOMOBILE = $(shell go env GOPATH)/bin/gomobile __android_build_with_ooni_go: search/for/go go get -u golang.org/x/mobile/cmd/gomobile $(GOMOBILE) init - PATH=$(shell go env GOPATH)/bin:$$PATH ANDROID_HOME=$(OONI_ANDROID_HOME) ANDROID_NDK_HOME=$(OONI_ANDROID_HOME)/ndk/$(ANDROID_NDK_VERSION) $(GOMOBILE) bind -target android -o ./MOBILE/android/oonimkall.aar -tags="$(OONI_PSIPHON_TAGS)" -ldflags '-s -w' $(GOLANG_EXTRA_FLAGS) ./pkg/oonimkall + PATH=$(shell go env GOPATH)/bin:$$PATH ANDROID_HOME=$(OONI_ANDROID_HOME) ANDROID_NDK_HOME=$(OONI_ANDROID_HOME)/ndk/$(ANDROID_NDK_VERSION) $(GOMOBILE) bind -x -target android -o ./MOBILE/android/oonimkall.aar -tags="$(OONI_PSIPHON_TAGS)" -ldflags '-s -w' $(GOLANG_EXTRA_FLAGS) ./pkg/oonimkall #help: #help: The `./mk ./MOBILE/ios` command builds the oonimkall library for iOS. #help: #help: You can also build the following subtargets: .PHONY: ./MOBILE/ios -./MOBILE/ios: \ - ./MOBILE/ios/oonimkall.xcframework.zip \ - ./MOBILE/ios/oonimkall.podspec +./MOBILE/ios: ./MOBILE/ios/oonimkall.xcframework.zip ./MOBILE/ios/oonimkall.podspec #help: #help: * `./mk ./MOBILE/ios/oonimkall.xcframework.zip`: zip the xcframework @@ -495,26 +340,13 @@ __android_build_with_ooni_go: search/for/go #help: #help: * `./mk ./MOBILE/ios/oonimkall.podspec`: the podspec .PHONY: ./MOBILE/ios/oonimkall.podspec -./MOBILE/ios/oonimkall.podspec: ./MOBILE/template.podspec +./MOBILE/ios/oonimkall.podspec: ./MOBILE/ios/template.podspec cat $< | sed -e "s/@VERSION@/$(OONIMKALL_V)/g" -e "s/@RELEASE@/$(OONIMKALL_R)/g" > $@ # important: OONIMKALL_V and OONIMKALL_R MUST be expanded just once so we use `:=` OONIMKALL_V := $(shell date -u +%Y.%m.%d-%H%M%S) OONIMKALL_R := $(shell git describe --tags || echo '0.0.0-dev') -#help: The `debian/publish` target publishes all the debian packages -#help: present in the toplevel directory using debopos-ci. -# TODO(bassosimone): do not hardcode using linux/amd64 here? -.PHONY: debian/publish -debian/publish: search/for/docker - test -z "$(CI)" || { echo "fatal: refusing to run in a CI environment" 1>&2; exit 1; } - ls *.deb 2>/dev/null || { echo "fatal: no debian packages in the toplevel dir" 1>&2; exit 1; } - test -n "$(AWS_ACCESS_KEY_ID)" || { echo "fatal: AWS_ACCESS_KEY_ID not set" 1>&2; exit 1; } - test -n "$(AWS_SECRET_ACCESS_KEY)" || { echo "fatal: AWS_SECRET_ACCESS_KEY not set" 1>&2; exit 1; } - test -n "$(DEB_GPG_KEY)" || { echo "fatal: DEB_GPG_KEY not set" 1>&2; exit 1; } - docker pull --platform linux/amd64 ubuntu:20.04 - docker run --platform linux/amd64 -e AWS_ACCESS_KEY_ID="$(AWS_ACCESS_KEY_ID)" -e AWS_SECRET_ACCESS_KEY="$(AWS_SECRET_ACCESS_KEY)" -e DEB_GPG_KEY="$(DEB_GPG_KEY)" -v $(shell pwd):/ooni -w /ooni ubuntu:20.04 ./CLI/linux/pubdebian - #help: #help: The following commands check for the availability of dependencies: # TODO(bassosimone): make checks more robust? @@ -547,13 +379,6 @@ search/for/git: @printf "checking for git... " @command -v git || { echo "not found"; exit 1; } -#help: -#help: * `./mk search/for/gpg`: checks for gpg -.PHONY: search/for/gpg -search/for/gpg: - @printf "checking for gpg... " - @command -v gpg || { echo "not found"; exit 1; } - #help: #help: * `./mk search/for/go`: checks for go .PHONY: search/for/go @@ -568,13 +393,6 @@ search/for/go: # SHOULD NOT cache this value so we ARE NOT using `:=`) __GOVERSION_REAL = $(shell go version | awk '{print $$3}') -#help: -#help: * `./mk search/for/jar`: checks for jar -.PHONY: search/for/jar -search/for/jar: - @printf "checking for jar... " - @command -v jar || { echo "not found"; exit 1; } - #help: #help: * `./mk search/for/java`: checks for java .PHONY: search/for/java @@ -671,17 +489,15 @@ OONIPRIVATE_REPO = git@github.com:ooni/probe-private # $(OONIPRIVATE) clones the private repository in $(GIT_CLONE_DIR) $(OONIPRIVATE): search/for/git $(GIT_CLONE_DIR) - test -d $(OONIPRIVATE) || $(MAKE) -f mk __really_clone_private_repo - -__really_clone_private_repo: + rm -rf $(OONIPRIVATE) git clone $(OONIPRIVATE_REPO) $(OONIPRIVATE) #help: #help: The `./mk ooni/go` command builds the latest version of ooni/go. .PHONY: ooni/go ooni/go: search/for/bash search/for/git search/for/go $(OONIGODIR) - test -d $(OONIGODIR) || git clone -b $(OONIGO_BRANCH) --single-branch --depth 8 $(OONIGO_REPO) $(OONIGODIR) - cd $(OONIGODIR) && git pull --ff-only + rm -rf $(OONIGODIR) + git clone -b $(OONIGO_BRANCH) --single-branch --depth 8 $(OONIGO_REPO) $(OONIGODIR) cd $(OONIGODIR)/src && ./make.bash # OONIGODIR is the directory in which we clone ooni/go @@ -695,7 +511,8 @@ OONIGO_REPO = https://github.com/ooni/go #help: correct version of the Android sdk. .PHONY: android/sdk android/sdk: search/for/java - test -d $(OONI_ANDROID_HOME) || $(MAKE) -f mk android/sdk/download + rm -rf $(OONI_ANDROID_HOME) + $(MAKE) -f mk android/sdk/download test -f $(__ANDROID_SDKMANAGER) || { echo "please run './mk android/sdk/download'"; exit 1; } echo "Yes" | $(__ANDROID_SDKMANAGER) --install $(ANDROID_INSTALL_EXTRA) 'ndk;$(ANDROID_NDK_VERSION)'