Skip to content

Commit d86e1c3

Browse files
author
bruce
committed
chore: copy the official file mainframer.sh.
1 parent b717835 commit d86e1c3

2 files changed

Lines changed: 208 additions & 3 deletions

File tree

README.md

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
# AndroidRemoteBuildImage
1+
# AndroidRemoteBuildWithDocker
22

3+
If you build Android project on MacBook or other laptop, you may think your computer performance is not enough.
34

4-
Mainframer setup in docker to easily deploy it on all powerful servers
5+
I used [Mainframer](https://github.com/buildfoundation/mainframer) to build on my desktop that is high-performance/powerful.
6+
7+
In this repo, I make a docker image with [Mainframer](https://github.com/buildfoundation/mainframer) to create a **builder server**. It works on not only **terminal** but also **Android Studio**.
58

69
# Build server
710
In order to build the docker image run following command `docker build -t mainframer-docker .`
@@ -73,4 +76,28 @@ FAILURE: Build failed with an exception.
7376
Could not determine java version from '11.0.11'.
7477
7578
```
76-
run `./gradlew wrapper --gradle-version 5.1.1`
79+
run `./gradlew wrapper --gradle-version 5.1.1`
80+
81+
82+
### build with Android Studio
83+
84+
1. open Android Studio, then do these steps:
85+
86+
1. click **Run → Edit Configuration → +**.
87+
88+
1. select your **Android App**.
89+
90+
1. name a new name, e.g. remote-build.
91+
92+
1. in **Module**, select submodule name, may be `app`.
93+
94+
1. in **Before Launch**, click **-** to delete `Gradle-aware Make`
95+
96+
1. in **Before Launch**, click **+**, add **Run External Tool**, input a new name,like `remote assembleDebug`.
97+
98+
99+
1. in **Program**, input `bash`.
100+
101+
1. in **Parameters** input `mainframer.sh ./gradlew :app:assembleDebug -Pandroid.enableBuildCache=true`
102+
103+
1. in **Working directory** , input `$ProjectFileDir$`.

mainframer.sh

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
#!/bin/bash
2+
3+
### https://github.com/buildfoundation/mainframer
4+
5+
# Copyright 2017 Juno, Inc.
6+
7+
# Licensed under the Apache License, Version 2.0 (the "License");
8+
# you may not use this file except in compliance with the License.
9+
# You may obtain a copy of the License at
10+
11+
# http://www.apache.org/licenses/LICENSE-2.0
12+
13+
# Unless required by applicable law or agreed to in writing, software
14+
# distributed under the License is distributed on an "AS IS" BASIS,
15+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16+
# See the License for the specific language governing permissions and
17+
# limitations under the License.
18+
19+
set -e
20+
21+
echo ":: mainframer v2.1.0"
22+
echo ""
23+
24+
START_TIME="$(date +%s)"
25+
26+
PROJECT_DIR="$(pwd)"
27+
PROJECT_DIR_NAME="$( basename "$PROJECT_DIR" )"
28+
PROJECT_DIR_ON_REMOTE_MACHINE="~/mainframer/$PROJECT_DIR_NAME"
29+
30+
CONFIG_DIR="$PROJECT_DIR/.mainframer"
31+
CONFIG_FILE="$CONFIG_DIR/config"
32+
COMMON_IGNORE_FILE="$CONFIG_DIR/ignore"
33+
LOCAL_IGNORE_FILE="$CONFIG_DIR/localignore"
34+
REMOTE_IGNORE_FILE="$CONFIG_DIR/remoteignore"
35+
36+
function readConfigProperty {
37+
grep "^${1}=" "$CONFIG_FILE" | cut -d'=' -f2
38+
}
39+
40+
REMOTE_MACHINE_CONFIG_PROPERTY="remote_machine"
41+
LOCAL_COMPRESS_LEVEL_CONFIG_PROPERTY="local_compression_level"
42+
REMOTE_COMPRESS_LEVEL_CONFIG_PROPERTY="remote_compression_level"
43+
44+
if [ ! -f "$CONFIG_FILE" ]; then
45+
echo "Please create and fill $CONFIG_FILE."
46+
exit 1
47+
fi
48+
49+
REMOTE_MACHINE=$(readConfigProperty "$REMOTE_MACHINE_CONFIG_PROPERTY")
50+
LOCAL_COMPRESS_LEVEL=$(readConfigProperty "$LOCAL_COMPRESS_LEVEL_CONFIG_PROPERTY")
51+
REMOTE_COMPRESS_LEVEL=$(readConfigProperty "$REMOTE_COMPRESS_LEVEL_CONFIG_PROPERTY")
52+
53+
if [ -z "$REMOTE_MACHINE" ]; then
54+
echo "Please specify \"$REMOTE_MACHINE_CONFIG_PROPERTY\" in $CONFIG_FILE."
55+
exit 1
56+
fi
57+
58+
if [ -z "$LOCAL_COMPRESS_LEVEL" ]; then
59+
LOCAL_COMPRESS_LEVEL=1
60+
fi
61+
62+
if [ -z "$REMOTE_COMPRESS_LEVEL" ]; then
63+
REMOTE_COMPRESS_LEVEL=1
64+
fi
65+
66+
67+
REMOTE_COMMAND="$*"
68+
REMOTE_COMMAND_SUCCESSFUL="false"
69+
70+
if [ -z "$REMOTE_COMMAND" ]; then
71+
echo "Please pass remote command."
72+
exit 1
73+
fi
74+
75+
function formatTime {
76+
local time=$1
77+
78+
local hours=$((time / 3600))
79+
local minutes=$(((time % 3600) / 60))
80+
local seconds=$((time % 60))
81+
82+
if [ "$hours" -eq "1" ]; then HOURS_LABEL="hour"; else HOURS_LABEL="hours"; fi
83+
if [ "$minutes" -eq "1" ]; then MINUTES_LABEL="minute"; else MINUTES_LABEL="minutes"; fi
84+
if [ "$seconds" -eq "1" ]; then SECONDS_LABEL="second"; else SECONDS_LABEL="seconds"; fi
85+
86+
(( hours > 0 )) && printf "%d $HOURS_LABEL " ${hours}
87+
(( minutes > 0 )) && printf "%d $MINUTES_LABEL " ${minutes}
88+
(( seconds >= 0 )) && printf "%d $SECONDS_LABEL" ${seconds}
89+
}
90+
91+
function syncBeforeRemoteCommand {
92+
echo "Sync local → remote machine..."
93+
startTime="$(date +%s)"
94+
95+
COMMAND="rsync --archive --delete --rsync-path=\"mkdir -p \"$PROJECT_DIR_ON_REMOTE_MACHINE\" && rsync\" --compress-level=$LOCAL_COMPRESS_LEVEL "
96+
97+
if [ -f "$COMMON_IGNORE_FILE" ]; then
98+
COMMAND+="--exclude-from='$COMMON_IGNORE_FILE' "
99+
fi
100+
101+
if [ -f "$LOCAL_IGNORE_FILE" ]; then
102+
COMMAND+="--exclude-from='$LOCAL_IGNORE_FILE' "
103+
fi
104+
105+
COMMAND+="--rsh ssh ./ $REMOTE_MACHINE:'$PROJECT_DIR_ON_REMOTE_MACHINE'"
106+
107+
eval "$COMMAND"
108+
109+
endTime="$(date +%s)"
110+
echo "Sync done: took $(formatTime $((endTime-startTime)))."
111+
echo ""
112+
}
113+
114+
function executeRemoteCommand {
115+
echo "Executing command on remote machine…"
116+
echo ""
117+
startTime="$(date +%s)"
118+
119+
set +e
120+
if ssh "$REMOTE_MACHINE" "echo 'set -e && cd '$PROJECT_DIR_ON_REMOTE_MACHINE' && echo \"$REMOTE_COMMAND\" && echo "" && $REMOTE_COMMAND' | bash" ; then
121+
REMOTE_COMMAND_SUCCESSFUL="true"
122+
fi
123+
set -e
124+
125+
endTime="$(date +%s)"
126+
echo ""
127+
128+
duration="$((endTime-startTime))"
129+
130+
if [ "$REMOTE_COMMAND_SUCCESSFUL" == "true" ]; then
131+
echo "Execution done: took $(formatTime $duration)."
132+
else
133+
echo "Execution failed: took $(formatTime $duration)."
134+
fi
135+
136+
echo ""
137+
}
138+
139+
function syncAfterRemoteCommand {
140+
echo "Sync remote → local machine…"
141+
startTime="$(date +%s)"
142+
143+
COMMAND="rsync --archive --delete --compress-level=$REMOTE_COMPRESS_LEVEL "
144+
145+
if [ -f "$COMMON_IGNORE_FILE" ]; then
146+
COMMAND+="--exclude-from='$COMMON_IGNORE_FILE' "
147+
fi
148+
149+
if [ -f "$REMOTE_IGNORE_FILE" ]; then
150+
COMMAND+="--exclude-from='$REMOTE_IGNORE_FILE' "
151+
fi
152+
153+
COMMAND+="--rsh ssh $REMOTE_MACHINE:'$PROJECT_DIR_ON_REMOTE_MACHINE'/ ./"
154+
eval "$COMMAND"
155+
156+
endTime="$(date +%s)"
157+
echo "Sync done: took $(formatTime $((endTime-startTime)))."
158+
}
159+
160+
pushd "$PROJECT_DIR" > /dev/null
161+
162+
syncBeforeRemoteCommand
163+
executeRemoteCommand
164+
syncAfterRemoteCommand
165+
166+
popd > /dev/null
167+
168+
FINISH_TIME="$(date +%s)"
169+
echo ""
170+
171+
DURATION="$((FINISH_TIME-START_TIME))"
172+
173+
if [ "$REMOTE_COMMAND_SUCCESSFUL" == "true" ]; then
174+
echo "Success: took $(formatTime $DURATION)."
175+
else
176+
echo "Failure: took $(formatTime $DURATION)."
177+
exit 1
178+
fi

0 commit comments

Comments
 (0)