devops: Move random scripts into central ctl.sh

This commit is contained in:
Thomas Buckley-Houston 2022-07-16 13:56:39 -04:00
parent 77fd0e68b4
commit f34ccc7344
13 changed files with 234 additions and 243 deletions

View File

@ -1,49 +0,0 @@
#!/usr/bin/env bash
set -e
PROJECT_ROOT=$(git rev-parse --show-toplevel)
browsh_version=$($PROJECT_ROOT/interfacer/contrib/get_browsh_version.sh)
latest_tagged_version=$(git tag --sort=v:refname --list 'v*.*.*' | tail -n1 | sed -e "s/^v//")
echo "Browsh version: $browsh_version"
echo "Latest tag: $latest_tagged_version"
if [[ "$browsh_version" == "$latest_tagged_version" ]]; then
echo "Not running release as there's no new version."
exit 0
fi
git tag v$browsh_version
git show v$browsh_version --quiet
git config --global user.email "builds@travis-ci.com"
git config --global user.name "Travis CI"
# `/dev/null` needed to prevent Github token appearing in logs
git push --tags --quiet https://$GITHUB_TOKEN@github.com/browsh-org/browsh > /dev/null 2>&1
git reset --hard v$browsh_version
cd $PROJECT_ROOT/webext
BROWSH_ENV=RELEASE npm run build
cd $PROJECT_ROOT/interfacer/src
curl -sL http://git.io/goreleaser | bash
cd $HOME
git clone https://github.com/browsh-org/www.brow.sh.git
cd www.brow.sh
echo "latest_version: $browsh_version" > _data/browsh.yml
git add _data/browsh.yml
git commit -m "(Travis CI) Updated Browsh version to $browsh_version"
# `/dev/null` needed to prevent Github token appearing in logs
git push --quiet https://$GITHUB_TOKEN@github.com/browsh-org/www.brow.sh > /dev/null 2>&1
# Manually also include the signed Mozilla web extension in the release archives
$PROJECT_ROOT/contrib/upload_github_release_asset.sh \
github_api_token=$GITHUB_TOKEN \
owner=browsh-org \
repo=browsh \
tag=v$browsh_version \
filename=$PROJECT_ROOT/webext/dist/web-ext-artifacts/browsh-$browsh_version-an+fx.xpi

View File

@ -1,65 +0,0 @@
#!/usr/bin/env bash
#
# Author: Stefan Buck
# License: MIT
# https://gist.github.com/stefanbuck/ce788fee19ab6eb0b4447a85fc99f447
#
#
# This script accepts the following parameters:
#
# * owner
# * repo
# * tag
# * filename
# * github_api_token
#
# Script to upload a release asset using the GitHub API v3.
#
# Example:
#
# upload-github-release-asset.sh github_api_token=TOKEN owner=stefanbuck repo=playground tag=v0.1.0 filename=./build.zip
#
# Check dependencies.
set -e
xargs=$(which gxargs || which xargs)
# Validate settings.
[ "$TRACE" ] && set -x
CONFIG=$@
for line in $CONFIG; do
eval "$line"
done
# Define variables.
GH_API="https://api.github.com"
GH_REPO="$GH_API/repos/$owner/$repo"
GH_TAGS="$GH_REPO/releases/tags/$tag"
AUTH="Authorization: token $github_api_token"
WGET_ARGS="--content-disposition --auth-no-challenge --no-cookie"
CURL_ARGS="-LJO#"
if [[ "$tag" == 'LATEST' ]]; then
GH_TAGS="$GH_REPO/releases/latest"
fi
# Validate token.
curl -o /dev/null -sH "$AUTH" $GH_REPO || { echo "Error: Invalid repo, token or network issue!"; exit 1; }
# Read asset tags.
response=$(curl -sH "$AUTH" $GH_TAGS)
# Get ID of the asset based on given filename.
eval $(echo "$response" | grep -m 1 "id.:" | grep -w id | tr : = | tr -cd '[[:alnum:]]=')
[ "$id" ] || { echo "Error: Failed to get release id for tag: $tag"; echo "$response" | awk 'length($0)<100' >&2; exit 1; }
# Upload asset
echo "Uploading asset... "
# Construct url
GH_ASSET="https://uploads.github.com/repos/$owner/$repo/releases/$id/assets?name=$(basename $filename)"
curl "$GITHUB_OAUTH_BASIC" --data-binary @"$filename" -H "Authorization: token $github_api_token" -H "Content-Type: application/octet-stream" $GH_ASSET

29
ctl.sh Executable file
View File

@ -0,0 +1,29 @@
#!/bin/env bash
set -e
function_to_run=$1
export PROJECT_ROOT && PROJECT_ROOT=$(git rev-parse --show-toplevel)
export GORELEASER_VERSION=1.10.2
export GOBINDATA_VERSION=3.23.0
function _includes_path {
echo "$PROJECT_ROOT"/scripts
}
function _load_includes {
for file in "$(_includes_path)"/*.bash; do
# shellcheck disable=1090
source "$file"
done
}
_load_includes
if [[ $(type -t "$function_to_run") != function ]]; then
echo "Subcommand: '$function_to_run' not found."
exit 1
fi
shift
"$function_to_run" "$@"

View File

@ -1,37 +0,0 @@
#!/usr/bin/env bash
# This is for building a production version of Browsh.
# To build Browsh during development see:
# https://github.com/browsh-org/browsh#contributing
# This script depends on Golang, go-bindata and curl
set -e
INTERFACER_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && cd ../ && pwd)"
cd "$INTERFACER_ROOT"
# Install the tool to convert the web extenstion file into a Go-compatible binary
pushd ../webext
npm run get-gobindata
popd
# Get the current Browsh version, in order to find the corresponding web extension release
version_file=$INTERFACER_ROOT/src/browsh/version.go
line=$(grep 'browshVersion' <"$version_file")
version=$(echo "$line" | grep -o '".*"' | sed 's/"//g')
# Build the URI for the webextension file
base='https://github.com/browsh-org/browsh/releases/download'
release_url="$base/v$version/browsh-$version-an.fx.xpi"
xpi_file=$INTERFACER_ROOT/src/browsh/browsh.xpi
destination=$INTERFACER_ROOT/src/browsh/webextension.go
# Download the web extension
curl -L -o "$xpi_file" "$release_url"
# Convert the web extension into binary data that can be compiled into a
# cross-platform Go binary.
XPI_FILE=$xpi_file BIN_FILE=$destination \
"$INTERFACER_ROOT"/contrib/xpi2bin.sh

View File

@ -1,9 +0,0 @@
#!/usr/bin/env bash
set -e
PROJECT_ROOT=$(git rev-parse --show-toplevel)
version_file=$PROJECT_ROOT/interfacer/src/browsh/version.go
line=$(grep 'browshVersion' < $version_file)
version=$(echo $line | grep -o '".*"' | sed 's/"//g')
echo -n $version

View File

@ -1,15 +0,0 @@
#!/usr/bin/env bash
set -e
INTERFACER_ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && cd ../ && pwd )"
go-bindata -version
go-bindata \
-nocompress \
-prefix $INTERFACER_ROOT \
-pkg browsh \
-o $BIN_FILE \
$XPI_FILE
ls -alh $INTERFACER_ROOT/src/browsh/webextension.go
echo "go-bindata exited with $(echo $?)"

78
scripts/bundling.bash Normal file
View File

@ -0,0 +1,78 @@
#!/usr/bin/env bash
export WEBEXTENSION_GO=$PROJECT_ROOT/interfacer/src/browsh/webextension.go
export GOBINDATA_VERSION=3.23.0
# Convert the web extension into binary data that can be compiled into a
# cross-platform Go binary.
function xpi_to_bin() {
local xpi_file=$1
local bin_file=$2
if ! command -v go-bindata &>/dev/null; then
echo "Installing \`go-bindata'..."
go install github.com/kevinburke/go-bindata/go-bindata@v"$GOBINDATA_VERSION"
go-bindata -version
fi
go-bindata \
-nocompress \
-prefix "$PROJECT_ROOT/interfacer" \
-pkg browsh \
-o "$bin_file" \
"$xpi_file"
ls -alh "$WEBEXTENSION_GO"
}
function build_webextension() {
local NODE_BIN=$PROJECT_ROOT/webext/node_modules/.bin
cd "$PROJECT_ROOT"/webext && "$NODE_BIN"/webpack
cd "$PROJECT_ROOT"/webext/dist && rm ./*.map
if [ -f core ]; then
# Is this a core dump for some failed process?
rm core
fi
ls -alh .
"$NODE_BIN"/web-ext build --overwrite-dest
ls -alh web-ext-artifacts
version=$("$PROJECT_ROOT"/ctl.sh browsh_version)
local xpi_file=browsh-$version-an+fx.xpi
local zip_file=browsh-$version.zip
local source_dir=$PROJECT_ROOT/webext/dist/web-ext-artifacts
if [ "$BROWSH_ENV" == "RELEASE" ]; then
# The signed version. There can only be one canonical XPI for each semantic
# version.
source_file=$source_dir/$xpi_file
bundle_file=$PROJECT_ROOT/interfacer/browsh.xpi
"$NODE_BIN"/web-ext sign --api-key "$MDN_USER" --api-secret "$MDN_KEY"
else
# TODO: This doesn't currently work with the Marionettte `tempAddon`
# installation method. Just use `web-ext run` and Browsh's `use-existing-ff`
# flag - which is better anyway as it auto-reloads the extension when files
# change. NB: If you fix this, don't forget to change the filename loaded
# by `Asset()` in `main.go`.
# In development/testing, we want to be able to bundle the webextension
# frequently without having to resort to version bumps.
source_file=$source_dir/$zip_file
bundle_file=$source_dir/browsh.zip
fi
cp -f "$source_file" "$bundle_file"
echo "Bundling $source_file to $WEBEXTENSION_GO using internal path $bundle_file"
xpi2bin "$bundle_file" "$WEBEXTENSION_GO"
}
function bundle_production_webextension() {
local version && version=$(browsh_version)
local base='https://github.com/browsh-org/browsh/releases/download'
local release_url="$base/v$version/browsh-$version-an.fx.xpi"
local xpi_file=$PROJECT_ROOT/interfacer/src/browsh/browsh.xpi
curl -L -o "$xpi_file" "$release_url"
xpi2bin "$xpi_file" "$WEBEXTENSION_GO"
}

7
scripts/common.bash Normal file
View File

@ -0,0 +1,7 @@
#!/bin/env bash
function _panic() {
local message=$1
echo >&2 "$message"
exit 1
}

11
scripts/misc.bash Normal file
View File

@ -0,0 +1,11 @@
#!/bin/env bash
function golang_lint_check() {
pushd "$PROJECT_ROOT"/interfacer || _panic
diff -u <(echo -n) <(gofmt -d ./)
popd || _panic
}
function golang_lint_fix() {
gofmt -f ./interfacer
}

107
scripts/releasing.bash Normal file
View File

@ -0,0 +1,107 @@
#!/bin/env bash
export BROWSH_VERSION
export LATEST_TAGGED_VERSION
function _goreleaser_production() {
if ! command -v goreleaser &>/dev/null; then
echo "Installing \`goreleaser'..."
go install github.com/goreleaser/goreleaser@v"$GORELEASER_VERSION"
fi
pushd "$PROJECT_ROOT"/interfacer/src || _panic
goreleaser release
popd || _panic
}
function _export_versions() {
BROWSH_VERSION=$(_parse_browsh_version)
LATEST_TAGGED_VERSION=$(
git tag --sort=v:refname --list 'v*.*.*' | tail -n1 | sed -e "s/^v//"
)
}
function _parse_browsh_version() {
version_file=$PROJECT_ROOT/interfacer/src/browsh/version.go
line=$(grep 'browshVersion' <"$version_file")
version=$(echo "$line" | grep -o '".*"' | sed 's/"//g')
echo -n "$version"
}
function _is_new_version() {
_export_versions
[ "$BROWSH_VERSION" = "" ] && _panic "BROWSH_VERSION unset"
[ "$LATEST_TAGGED_VERSION" = "" ] && _panic "LATEST_TAGGED_VERSION unset"
[[ "$BROWSH_VERSION" != "$LATEST_TAGGED_VERSION" ]]
}
function _tag_on_version_change() {
_export_versions
echo_versions
if ! _is_new_version; then
echo "Not running release as there's no new version."
exit 0
fi
git tag v"$BROWSH_VERSION"
git show v"$BROWSH_VERSION" --quiet
git config --global user.email "ci@github.com"
git config --global user.name "Github Actions"
# `/dev/null` needed to prevent Github token appearing in logs
git push --tags --quiet https://"$GITHUB_TOKEN"@github.com/browsh-org/browsh >/dev/null 2>&1
git reset --hard v"$BROWSH_VERSION"
}
function echo_versions() {
_export_versions
echo "Browsh Golang version: $BROWSH_VERSION"
echo "Git latest tag: $LATEST_TAGGED_VERSION"
}
function browsh_version() {
_export_versions
echo -n "$BROWSH_VERSION"
}
function github_actions_output_version_status() {
local status="false"
if _is_new_version; then
status="true"
fi
echo "::set-output name=is_new_version::$status"
}
function npm_build_release() {
pushd "$PROJECT_ROOT"/webext || _panic
BROWSH_ENV=RELEASE npm run build_webextension
popd || _panic
}
function update_browsh_website_with_new_version() {
pushd /tmp || _panic
git clone https://github.com/browsh-org/www.brow.sh.git
cd www.brow.sh || exit 1
echo "latest_version: $BROWSH_VERSION" >_data/browsh.yml
git add _data/browsh.yml
git commit -m "Github Actions: updated Browsh version to $BROWSH_VERSION"
# `/dev/null` needed to prevent Github token appearing in logs
git push --quiet https://"$GITHUB_TOKEN"@github.com/browsh-org/www.brow.sh >/dev/null 2>&1
popd || _panic
}
function goreleaser_local_only() {
pushd "$PROJECT_ROOT"/interfacer || _panic
goreleaser release \
--config "$PROJECT_ROOT"/goreleaser.yml \
--snapshot \
--rm-dist
popd || _panic
}
function release() {
npm_build_release
_tag_on_version_change
_goreleaser_production
update_browsh_website_with_new_version
}

View File

@ -1,55 +0,0 @@
#!/usr/bin/env bash
# Convert the Browsh webextension into embedable binary data so that we can
# distribute Browsh as a single static binary.
# Requires the go-bindata binary, which seems to only be installed with:
# `go get -u gopkg.in/shuLhan/go-bindata.v3/...`
set -e
PROJECT_ROOT=$(git rev-parse --show-toplevel)
NODE_BIN=$PROJECT_ROOT/webext/node_modules/.bin
destination=$PROJECT_ROOT/interfacer/src/browsh/webextension.go
cd $PROJECT_ROOT/webext && $NODE_BIN/webpack
cd $PROJECT_ROOT/webext/dist && rm *.map
if [ -f core ] ; then
# Is this a core dump for some failed process?
rm core
fi
ls -alh .
$NODE_BIN/web-ext build --overwrite-dest
ls -alh web-ext-artifacts
version=$($PROJECT_ROOT/interfacer/contrib/get_browsh_version.sh)
xpi_file=browsh-$version-an+fx.xpi
zip_file=browsh-$version.zip
source_dir=$PROJECT_ROOT/webext/dist/web-ext-artifacts
if [ "$BROWSH_ENV" == "RELEASE" ]
then
# The signed version. There can only be one canonical XPI for each semantic
# version.
source_file=$source_dir/$xpi_file
bundle_file=$PROJECT_ROOT/interfacer/browsh.xpi
$NODE_BIN/web-ext sign --api-key $MDN_USER --api-secret $MDN_KEY
else
# TODO: This doesn't currently work with the Marionettte `tempAddon`
# installation method. Just use `web-ext run` and Browsh's `use-existing-ff`
# flag - which is better anyway as it auto-reloads the extension when files
# change. NB: If you fix this, don't forget to change the filename loaded
# by `Asset()` in `main.go`.
# In development/testing, we want to be able to bundle the webextension
# frequently without having to resort to version bumps.
source_file=$source_dir/$zip_file
bundle_file=$source_dir/browsh.zip
fi
cp -f $source_file $bundle_file
echo "Bundling $source_file to $destination using internal path $bundle_file"
XPI_FILE=$bundle_file BIN_FILE=$destination \
$PROJECT_ROOT/interfacer/contrib/xpi2bin.sh

View File

@ -1,11 +0,0 @@
#!/usr/bin/env bash
if ! type "nvm" > /dev/null; then
rm -rf ~/.nvm
NVM_VERSION=0.33.8
curl -o- https://raw.githubusercontent.com/creationix/nvm/v$NVM_VERSION/install.sh | bash
source $HOME/.nvm/nvm.sh
fi
nvm install # See `/.nvmrc` for current Node version

View File

@ -1,7 +1,7 @@
{
"scripts": {
"get-gobindata": "go install github.com/kevinburke/go-bindata/go-bindata@latest",
"build": "./contrib/bundle_webextension.sh",
"build_webextension": "../ctl.sh build_webextension",
"lint": "prettier --list-different "{src,test}/**/*.js",
"test": "NODE_PATH=src:test mocha"
},
"babel": {