summaryrefslogtreecommitdiffhomepage
path: root/ci/buildserver-build-android.sh
blob: bdb1e94164fe6db20bb8548a8074dbd693450264 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#!/usr/bin/env bash

# # Setup instructions before this script will work
#
# * Follow the instructions in ../README.md
# * Import and trust the GPG keys of everyone who the build server should trust code from
# * Ensure that the machine running this script is allowed to upload to releases.mullvad.net.

set -eu
shopt -s nullglob

SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
BUILD_DIR="$SCRIPT_DIR/mullvadvpn-app"
LAST_BUILT_DIR="$SCRIPT_DIR/last-built"
UPLOAD_DIR="$SCRIPT_DIR/upload"
ANDROID_CREDENTIALS_DIR="$SCRIPT_DIR/credentials-android"

BRANCHES_TO_BUILD=("origin/master")
TAG_PATTERN_TO_BUILD=("^android/")

upload() {
  for f in MullvadVPN-*.{apk,aab}; do
    sha256sum "$f" > "$f.sha256"
    mv "$f" "$f.sha256" "$UPLOAD_DIR/"
  done
}

build_ref() {
  ref=$1
  tag=${2:-""}

  current_hash="$(git rev-parse $ref^{commit})"
  if [ -f "$LAST_BUILT_DIR/$current_hash" ]; then
    # This commit has already been built
    return 0
  fi

  echo ""
  echo "[#] $ref: $current_hash, building new packages."

  if [[ $ref == "refs/tags/"* ]] && ! git verify-tag $ref; then
    echo "!!!"
    echo "[#] $ref is a tag, but it failed GPG verification!"
    echo "!!!"
    sleep 60
    return 0
  elif [[ $ref == "refs/remotes/"* ]] && ! git verify-commit $current_hash; then
    echo "!!!"
    echo "[#] $ref is a branch, but it failed GPG verification!"
    echo "!!!"
    sleep 60
    return 0
  fi

  # Clean our working dir and check out the code we want to build
  rm -r dist/ 2&>/dev/null || true
  git reset --hard
  git checkout $ref
  git submodule update
  git clean -df

  echo "Building Android app"
  ANDROID_CREDENTIALS_DIR=$ANDROID_CREDENTIALS_DIR ./building/containerized-build.sh android --app-bundle || return 0

  # If there is a tag for this commit then we append that to the produced artifacts
  # A version suffix should only be created if there is a tag for this commit and it is not a release build
  if [[ -n "$tag" ]]; then
      # Remove disallowed version characters from the tag
      version_suffix="+${tag//[^0-9a-z_-]/}"
      # Will only match paths that include *-dev-* which means release builds will not be included
      # Pipes all matching names and their new name to mv
      pushd dist
      for original_file in MullvadVPN-*-dev-*{.apk,.aab}; do
          new_file=$(echo $original_file | sed -nE "s/^(MullvadVPN-.*-dev-.*)(\.apk|\.aab)$/\1$version_suffix\2/p")
          mv $original_file $new_file
      done
      popd
  fi

  (cd dist/ && upload) || return 0

  touch "$LAST_BUILT_DIR/$current_hash"
  echo "Successfully finished Android build at $(date)"
}

cd "$BUILD_DIR"

while true; do
  # Delete all tags. So when fetching we only get the ones existing on the remote
  git tag | xargs git tag -d > /dev/null

  git fetch --prune --tags 2> /dev/null || continue
  tags=( $(git tag | grep "$TAG_PATTERN_TO_BUILD") )

  for tag in "${tags[@]}"; do
    build_ref "refs/tags/$tag" "$tag"
  done

  for branch in "${BRANCHES_TO_BUILD[@]}"; do
    build_ref "refs/remotes/$branch"
  done

  sleep 240
done