mirror of
https://github.com/balena-io/etcher.git
synced 2025-07-27 21:26:38 +00:00
chore: publish snapshot builds to S3 (#1078)
This commit makes Appveyor and Travis CI publish snapshot builds to S3 when a pull request is merged, by making use of the `publish-aws-s3` Makefile target. The changes required for such type of deployment are the followings: - Set `S3_BUCKET` to `resin-nightly-downloads` when doing snapshot builds - Add deploy sections to `.travis.yml` and `appveyor.yml` that run `make publish-aws-s3` - Don't change `PRODUCT_NAME` when doing snapshot builds (given we'll be publishing to a different S3 bucket) - Install `awscli` in Appveyor CI and Travis CI - Make GNU/Linux Docker containers inherit `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` from the environment (so `awscli` is configured correctly inside them) - Add a prefix option to `aws-s3.sh` publish script to prepend a string to the S3 path, so we can add a timestamp to more easily distinguish files inside the `resin-nightly-downloads` bucket - Print the published URL from `aws-s3.sh` for convenience purposes, so we can click it when skimming through CI builds logs - Add the `-R` and `-L` options when recursively copying `node_modules` during a snapshot build to prevent weird Appveyor errors related to hard links. The options listed before make sure that we recursively resolve every link while copying - Move from `wget` to `curl` to avoid certificate check failures Signed-off-by: Juan Cruz Viotti <jviotti@openmailbox.org>
This commit is contained in:
parent
5a01f4854c
commit
799ebc6aa0
31
.travis.yml
31
.travis.yml
@ -33,28 +33,33 @@ before_install:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then
|
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then
|
||||||
pip install codespell==1.9.2;
|
./scripts/build/docker/run-command.sh -r ${TARGET_ARCH} -s ${PWD} -c "make info && make electron-develop";
|
||||||
npm install -g bower;
|
else
|
||||||
brew install afsctool;
|
pip install codespell==1.9.2 awscli;
|
||||||
brew install jq;
|
npm install -g bower asar;
|
||||||
fi
|
brew install afsctool jq;
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then
|
|
||||||
make info;
|
make info;
|
||||||
make electron-develop;
|
make electron-develop;
|
||||||
fi
|
fi
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then
|
|
||||||
./scripts/build/docker/run-command.sh -r ${TARGET_ARCH} -s ${PWD} -c "make info && make electron-develop";
|
|
||||||
fi
|
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then
|
|
||||||
make sanity-checks && npm test;
|
|
||||||
fi
|
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then
|
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then
|
||||||
./scripts/build/docker/run-command.sh -r ${TARGET_ARCH} -s ${PWD} -c "make sanity-checks && xvfb-run --server-args=$XVFB_ARGS npm test";
|
./scripts/build/docker/run-command.sh -r ${TARGET_ARCH} -s ${PWD} -c "make sanity-checks && xvfb-run --server-args=$XVFB_ARGS npm test";
|
||||||
|
else
|
||||||
|
make sanity-checks && npm test;
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
provider: script
|
||||||
|
script: if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then
|
||||||
|
./scripts/build/docker/run-command.sh -r ${TARGET_ARCH} -s ${PWD} -c "make publish-aws-s3";
|
||||||
|
else
|
||||||
|
make publish-aws-s3;
|
||||||
|
fi
|
||||||
|
on:
|
||||||
|
branch: master
|
||||||
|
|
||||||
notifications:
|
notifications:
|
||||||
email: false
|
email: false
|
||||||
webhooks:
|
webhooks:
|
||||||
|
23
Makefile
23
Makefile
@ -26,17 +26,18 @@ APPLICATION_COPYRIGHT = $(shell jq -r '.copyright' package.json)
|
|||||||
APPLICATION_CATEGORY = public.app-category.developer-tools
|
APPLICATION_CATEGORY = public.app-category.developer-tools
|
||||||
APPLICATION_BUNDLE_ID = io.resin.etcher
|
APPLICATION_BUNDLE_ID = io.resin.etcher
|
||||||
APPLICATION_FILES = lib,assets
|
APPLICATION_FILES = lib,assets
|
||||||
S3_BUCKET = resin-production-downloads
|
|
||||||
|
|
||||||
# Add the current commit to the version if release type is "snapshot"
|
# Add the current commit to the version if release type is "snapshot"
|
||||||
RELEASE_TYPE ?= snapshot
|
RELEASE_TYPE ?= snapshot
|
||||||
PACKAGE_JSON_VERSION = $(shell jq -r '.version' package.json)
|
PACKAGE_JSON_VERSION = $(shell jq -r '.version' package.json)
|
||||||
ifeq ($(RELEASE_TYPE),production)
|
ifeq ($(RELEASE_TYPE),production)
|
||||||
APPLICATION_VERSION = $(PACKAGE_JSON_VERSION)
|
APPLICATION_VERSION = $(PACKAGE_JSON_VERSION)
|
||||||
|
S3_BUCKET = resin-production-downloads
|
||||||
endif
|
endif
|
||||||
ifeq ($(RELEASE_TYPE),snapshot)
|
ifeq ($(RELEASE_TYPE),snapshot)
|
||||||
CURRENT_COMMIT_HASH = $(shell git log -1 --format="%h")
|
CURRENT_COMMIT_HASH = $(shell git log -1 --format="%h")
|
||||||
APPLICATION_VERSION = $(PACKAGE_JSON_VERSION)+$(CURRENT_COMMIT_HASH)
|
APPLICATION_VERSION = $(PACKAGE_JSON_VERSION)+$(CURRENT_COMMIT_HASH)
|
||||||
|
S3_BUCKET = resin-nightly-downloads
|
||||||
endif
|
endif
|
||||||
ifndef APPLICATION_VERSION
|
ifndef APPLICATION_VERSION
|
||||||
$(error Invalid release type: $(RELEASE_TYPE))
|
$(error Invalid release type: $(RELEASE_TYPE))
|
||||||
@ -139,13 +140,7 @@ endif
|
|||||||
|
|
||||||
TARGET_ARCH_DEBIAN = $(shell ./scripts/build/architecture-convert.sh -r $(TARGET_ARCH) -t debian)
|
TARGET_ARCH_DEBIAN = $(shell ./scripts/build/architecture-convert.sh -r $(TARGET_ARCH) -t debian)
|
||||||
|
|
||||||
ifeq ($(RELEASE_TYPE),production)
|
PRODUCT_NAME = etcher
|
||||||
PRODUCT_NAME = etcher
|
|
||||||
endif
|
|
||||||
ifeq ($(RELEASE_TYPE),snapshot)
|
|
||||||
PRODUCT_NAME = etcher-snapshots
|
|
||||||
endif
|
|
||||||
|
|
||||||
APPLICATION_NAME_LOWERCASE = $(shell echo $(APPLICATION_NAME) | tr A-Z a-z)
|
APPLICATION_NAME_LOWERCASE = $(shell echo $(APPLICATION_NAME) | tr A-Z a-z)
|
||||||
APPLICATION_VERSION_DEBIAN = $(shell echo $(APPLICATION_VERSION) | tr "-" "~")
|
APPLICATION_VERSION_DEBIAN = $(shell echo $(APPLICATION_VERSION) | tr "-" "~")
|
||||||
|
|
||||||
@ -192,7 +187,7 @@ $(BUILD_DIRECTORY)/electron-$(TARGET_PLATFORM)-$(APPLICATION_VERSION)-$(TARGET_A
|
|||||||
./scripts/build/electron-create-resources-app.sh -s . -o $@ \
|
./scripts/build/electron-create-resources-app.sh -s . -o $@ \
|
||||||
-v $(APPLICATION_VERSION) \
|
-v $(APPLICATION_VERSION) \
|
||||||
-f "$(APPLICATION_FILES)"
|
-f "$(APPLICATION_FILES)"
|
||||||
$(foreach prerequisite,$^,$(call execute-command,cp -rf $(prerequisite) $@))
|
$(foreach prerequisite,$^,$(call execute-command,cp -RLf $(prerequisite) $@))
|
||||||
|
|
||||||
$(BUILD_DIRECTORY)/electron-$(TARGET_PLATFORM)-$(APPLICATION_VERSION)-$(TARGET_ARCH)-app.asar: \
|
$(BUILD_DIRECTORY)/electron-$(TARGET_PLATFORM)-$(APPLICATION_VERSION)-$(TARGET_ARCH)-app.asar: \
|
||||||
$(BUILD_DIRECTORY)/electron-$(TARGET_PLATFORM)-$(APPLICATION_VERSION)-$(TARGET_ARCH)-app \
|
$(BUILD_DIRECTORY)/electron-$(TARGET_PLATFORM)-$(APPLICATION_VERSION)-$(TARGET_ARCH)-app \
|
||||||
@ -373,11 +368,21 @@ endif
|
|||||||
|
|
||||||
ifdef PUBLISH_AWS_S3
|
ifdef PUBLISH_AWS_S3
|
||||||
publish-aws-s3: $(PUBLISH_AWS_S3)
|
publish-aws-s3: $(PUBLISH_AWS_S3)
|
||||||
|
ifeq ($(RELEASE_TYPE),production)
|
||||||
$(foreach publishable,$^,$(call execute-command,./scripts/publish/aws-s3.sh \
|
$(foreach publishable,$^,$(call execute-command,./scripts/publish/aws-s3.sh \
|
||||||
-f $(publishable) \
|
-f $(publishable) \
|
||||||
-b $(S3_BUCKET) \
|
-b $(S3_BUCKET) \
|
||||||
-v $(APPLICATION_VERSION) \
|
-v $(APPLICATION_VERSION) \
|
||||||
-p $(PRODUCT_NAME)))
|
-p $(PRODUCT_NAME)))
|
||||||
|
endif
|
||||||
|
ifeq ($(RELEASE_TYPE),snapshot)
|
||||||
|
$(foreach publishable,$^,$(call execute-command,./scripts/publish/aws-s3.sh \
|
||||||
|
-f $(publishable) \
|
||||||
|
-b $(S3_BUCKET) \
|
||||||
|
-v $(APPLICATION_VERSION) \
|
||||||
|
-p $(PRODUCT_NAME) \
|
||||||
|
-k $(shell date +"%Y-%m-%d")))
|
||||||
|
endif
|
||||||
|
|
||||||
TARGETS += publish-aws-s3
|
TARGETS += publish-aws-s3
|
||||||
endif
|
endif
|
||||||
|
@ -28,7 +28,7 @@ install:
|
|||||||
- set PATH=C:\Program Files (x86)\NSIS;%PATH%
|
- set PATH=C:\Program Files (x86)\NSIS;%PATH%
|
||||||
- set PATH=C:\MinGW\bin;%PATH%
|
- set PATH=C:\MinGW\bin;%PATH%
|
||||||
- set PATH=C:\MinGW\msys\1.0\bin;%PATH%
|
- set PATH=C:\MinGW\msys\1.0\bin;%PATH%
|
||||||
- pip install codespell==1.9.2
|
- pip install codespell==1.9.2 awscli
|
||||||
- make info
|
- make info
|
||||||
- make electron-develop
|
- make electron-develop
|
||||||
|
|
||||||
@ -40,6 +40,9 @@ test_script:
|
|||||||
- make sanity-checks
|
- make sanity-checks
|
||||||
- cmd: npm test
|
- cmd: npm test
|
||||||
|
|
||||||
|
deploy_script:
|
||||||
|
- cmd: IF %APPVEYOR_REPO_BRANCH%==master (make publish-aws-s3)
|
||||||
|
|
||||||
notifications:
|
notifications:
|
||||||
|
|
||||||
- provider: Webhook
|
- provider: Webhook
|
||||||
|
@ -93,7 +93,7 @@ access resin.io's production downloads S3 bucket.
|
|||||||
Run the following command to publish a specific file:
|
Run the following command to publish a specific file:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
./scripts/publish/aws-s3.sh -f <file> -b <bucket> -v <version> -t <production|snapshot>
|
./scripts/publish/aws-s3.sh -f <file> -b <bucket> -v <version> -p <product name>
|
||||||
```
|
```
|
||||||
|
|
||||||
Or run the following command to publish all files for the current combination
|
Or run the following command to publish all files for the current combination
|
||||||
|
@ -33,7 +33,7 @@ The following MinGW packages are required:
|
|||||||
- `msys-make`
|
- `msys-make`
|
||||||
- `msys-unzip`
|
- `msys-unzip`
|
||||||
- `msys-zip`
|
- `msys-zip`
|
||||||
- `msys-wget`
|
- `msys-curl`
|
||||||
- `msys-bash`
|
- `msys-bash`
|
||||||
- `msys-coreutils`
|
- `msys-coreutils`
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ RUN apt-get update && apt-get install -y \
|
|||||||
python-pip \
|
python-pip \
|
||||||
python-dev \
|
python-dev \
|
||||||
unzip \
|
unzip \
|
||||||
wget \
|
curl \
|
||||||
xvfb \
|
xvfb \
|
||||||
zip
|
zip
|
||||||
|
|
||||||
@ -28,4 +28,4 @@ RUN npm config set spin=false
|
|||||||
RUN npm install -g bower asar electron-installer-debian
|
RUN npm install -g bower asar electron-installer-debian
|
||||||
|
|
||||||
# Python
|
# Python
|
||||||
RUN pip install codespell==1.9.2
|
RUN pip install codespell==1.9.2 awscli
|
||||||
|
@ -17,7 +17,7 @@ RUN apt-get update && apt-get install -y \
|
|||||||
python-pip \
|
python-pip \
|
||||||
python-dev \
|
python-dev \
|
||||||
unzip \
|
unzip \
|
||||||
wget \
|
curl \
|
||||||
xvfb \
|
xvfb \
|
||||||
zip
|
zip
|
||||||
|
|
||||||
@ -28,4 +28,4 @@ RUN npm config set spin=false
|
|||||||
RUN npm install -g bower asar electron-installer-debian
|
RUN npm install -g bower asar electron-installer-debian
|
||||||
|
|
||||||
# Python
|
# Python
|
||||||
RUN pip install codespell==1.9.2
|
RUN pip install codespell==1.9.2 awscli
|
||||||
|
@ -17,7 +17,7 @@ RUN apt-get update && apt-get install -y \
|
|||||||
python-pip \
|
python-pip \
|
||||||
python-dev \
|
python-dev \
|
||||||
unzip \
|
unzip \
|
||||||
wget \
|
curl \
|
||||||
xvfb \
|
xvfb \
|
||||||
zip
|
zip
|
||||||
|
|
||||||
@ -28,4 +28,4 @@ RUN npm config set spin=false
|
|||||||
RUN npm install -g bower asar electron-installer-debian
|
RUN npm install -g bower asar electron-installer-debian
|
||||||
|
|
||||||
# Python
|
# Python
|
||||||
RUN pip install codespell==1.9.2
|
RUN pip install codespell==1.9.2 awscli
|
||||||
|
@ -82,6 +82,10 @@ fi
|
|||||||
# The `-t` and TERM setup is needed to display coloured output.
|
# The `-t` and TERM setup is needed to display coloured output.
|
||||||
docker run -t \
|
docker run -t \
|
||||||
--env "TERM=xterm-256color" \
|
--env "TERM=xterm-256color" \
|
||||||
|
--env "AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID" \
|
||||||
|
--env "AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY" \
|
||||||
|
--env "RELEASE_TYPE=$RELEASE_TYPE" \
|
||||||
|
--env "CI=$CI" \
|
||||||
--cap-add SYS_ADMIN \
|
--cap-add SYS_ADMIN \
|
||||||
--device /dev/fuse:/dev/fuse:mrw \
|
--device /dev/fuse:/dev/fuse:mrw \
|
||||||
--volume "$ARGV_SOURCE_CODE_DIRECTORY:/etcher" \
|
--volume "$ARGV_SOURCE_CODE_DIRECTORY:/etcher" \
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
set -u
|
set -u
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
./scripts/build/check-dependency.sh wget
|
./scripts/build/check-dependency.sh curl
|
||||||
|
|
||||||
SHA256SUM=$(./scripts/build/check-dependency.sh sha256sum "shasum -a 256")
|
SHA256SUM=$(./scripts/build/check-dependency.sh sha256sum "shasum -a 256")
|
||||||
|
|
||||||
@ -78,7 +78,8 @@ if [ -f "$ARGV_OUTPUT" ]; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
wget --no-check-certificate "$ARGV_URL" -O "$TEMP_OUTPUT"
|
echo "Downloading $ARGV_URL"
|
||||||
|
curl --continue-at - --retry 100 --location --output "$TEMP_OUTPUT" "$ARGV_URL"
|
||||||
|
|
||||||
if ! checksum_matches "$TEMP_OUTPUT" "$ARGV_CHECKSUM"; then
|
if ! checksum_matches "$TEMP_OUTPUT" "$ARGV_CHECKSUM"; then
|
||||||
echo "Checksum mismatch" 1>&2
|
echo "Checksum mismatch" 1>&2
|
||||||
|
@ -60,7 +60,7 @@ ELECTRON_ARCHITECTURE=$(./scripts/build/architecture-convert.sh -r "$ARGV_ARCHIT
|
|||||||
ELECTRON_GITHUB_REPOSITORY=https://github.com/electron/electron
|
ELECTRON_GITHUB_REPOSITORY=https://github.com/electron/electron
|
||||||
ELECTRON_DOWNLOADS_BASEURL="$ELECTRON_GITHUB_REPOSITORY/releases/download/v$ARGV_ELECTRON_VERSION"
|
ELECTRON_DOWNLOADS_BASEURL="$ELECTRON_GITHUB_REPOSITORY/releases/download/v$ARGV_ELECTRON_VERSION"
|
||||||
ELECTRON_FILENAME="electron-v$ARGV_ELECTRON_VERSION-$ARGV_OPERATING_SYSTEM-$ELECTRON_ARCHITECTURE.zip"
|
ELECTRON_FILENAME="electron-v$ARGV_ELECTRON_VERSION-$ARGV_OPERATING_SYSTEM-$ELECTRON_ARCHITECTURE.zip"
|
||||||
ELECTRON_CHECKSUM=$(wget --no-check-certificate -O - "$ELECTRON_DOWNLOADS_BASEURL/SHASUMS256.txt" | grep "$ELECTRON_FILENAME" | cut -d ' ' -f 1)
|
ELECTRON_CHECKSUM=$(curl --location "$ELECTRON_DOWNLOADS_BASEURL/SHASUMS256.txt" | grep "$ELECTRON_FILENAME" | cut -d ' ' -f 1)
|
||||||
|
|
||||||
./scripts/build/download-tool.sh \
|
./scripts/build/download-tool.sh \
|
||||||
-u "$ELECTRON_DOWNLOADS_BASEURL/$ELECTRON_FILENAME" \
|
-u "$ELECTRON_DOWNLOADS_BASEURL/$ELECTRON_FILENAME" \
|
||||||
|
@ -18,7 +18,6 @@
|
|||||||
|
|
||||||
set -u
|
set -u
|
||||||
set -e
|
set -e
|
||||||
set -x
|
|
||||||
|
|
||||||
./scripts/build/check-dependency.sh zip
|
./scripts/build/check-dependency.sh zip
|
||||||
|
|
||||||
|
@ -31,6 +31,7 @@ function usage() {
|
|||||||
echo " -b <s3 bucket>"
|
echo " -b <s3 bucket>"
|
||||||
echo " -v <version>"
|
echo " -v <version>"
|
||||||
echo " -p <product name>"
|
echo " -p <product name>"
|
||||||
|
echo " -k [S3 key prefix]"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -38,13 +39,15 @@ ARGV_FILE=""
|
|||||||
ARGV_BUCKET=""
|
ARGV_BUCKET=""
|
||||||
ARGV_VERSION=""
|
ARGV_VERSION=""
|
||||||
ARGV_PRODUCT_NAME=""
|
ARGV_PRODUCT_NAME=""
|
||||||
|
ARGV_PREFIX=""
|
||||||
|
|
||||||
while getopts ":f:b:v:p:" option; do
|
while getopts ":f:b:v:p:k:" option; do
|
||||||
case $option in
|
case $option in
|
||||||
f) ARGV_FILE="$OPTARG" ;;
|
f) ARGV_FILE="$OPTARG" ;;
|
||||||
b) ARGV_BUCKET="$OPTARG" ;;
|
b) ARGV_BUCKET="$OPTARG" ;;
|
||||||
v) ARGV_VERSION="$OPTARG" ;;
|
v) ARGV_VERSION="$OPTARG" ;;
|
||||||
p) ARGV_PRODUCT_NAME="$OPTARG" ;;
|
p) ARGV_PRODUCT_NAME="$OPTARG" ;;
|
||||||
|
k) ARGV_PREFIX="$OPTARG" ;;
|
||||||
*) usage ;;
|
*) usage ;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
@ -59,8 +62,19 @@ fi
|
|||||||
|
|
||||||
FILENAME=$(basename "$ARGV_FILE")
|
FILENAME=$(basename "$ARGV_FILE")
|
||||||
|
|
||||||
|
if [ -n "$ARGV_PREFIX" ]; then
|
||||||
|
S3_KEY="$ARGV_PRODUCT_NAME/$ARGV_PREFIX/$ARGV_VERSION/$FILENAME"
|
||||||
|
else
|
||||||
|
S3_KEY="$ARGV_PRODUCT_NAME/$ARGV_VERSION/$FILENAME"
|
||||||
|
fi
|
||||||
|
|
||||||
aws s3api put-object \
|
aws s3api put-object \
|
||||||
--bucket "$ARGV_BUCKET" \
|
--bucket "$ARGV_BUCKET" \
|
||||||
--acl public-read \
|
--acl public-read \
|
||||||
--key "$ARGV_PRODUCT_NAME/$ARGV_VERSION/$FILENAME" \
|
--key "$S3_KEY" \
|
||||||
--body "$ARGV_FILE"
|
--body "$ARGV_FILE"
|
||||||
|
|
||||||
|
# Escape plus signs when printing the final URL
|
||||||
|
URL="$(echo "https://$ARGV_BUCKET.s3.amazonaws.com/$S3_KEY" | sed 's/\+/%2B/g')"
|
||||||
|
|
||||||
|
echo "Uploaded $(basename "$ARGV_FILE") to $URL"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user