Pull request 1884: AG-23334-split-snap

Merge in DNS/adguard-home from AG-23334-split-snap to master

Squashed commit of the following:

commit 5a3d0f105d6930a0868f342821618a2a4acae282
Merge: bba693db6 06d465b0d
Author: Ainar Garipov <A.Garipov@AdGuard.COM>
Date:   Wed Jun 21 17:10:15 2023 +0300

    Merge branch 'master' into AG-23334-split-snap

commit bba693db60fc7e154df3bc6bf186292ee9bc4ed5
Author: Ainar Garipov <A.Garipov@AdGuard.COM>
Date:   Wed Jun 21 16:50:45 2023 +0300

    scripts/snap: fix docs; imp data

commit cb4a1d5bed147a41dda69b80b7ae6c3902c26538
Author: Ainar Garipov <A.Garipov@AdGuard.COM>
Date:   Wed Jun 21 14:03:48 2023 +0300

    all: fix scripts; imp docs

commit f88320b16ed7679e151a5358f4ac8e0212b4a827
Author: Ainar Garipov <A.Garipov@AdGuard.COM>
Date:   Tue Jun 20 18:52:21 2023 +0300

    all: split snap ci
This commit is contained in:
Ainar Garipov 2023-06-21 17:14:10 +03:00
parent 06d465b0d1
commit 994906fbd4
13 changed files with 538 additions and 178 deletions

View file

@ -1,5 +1,8 @@
---
!include test.yaml
--- ---
!include release.yaml !include release.yaml
---
!include snapcraft.yaml
---
!include test.yaml

View file

@ -34,12 +34,6 @@
'jobs': 'jobs':
- 'Publish to static storage' - 'Publish to static storage'
- 'Publish to Snapstore':
'manual': false
'final': false
'jobs':
- 'Publish to Snapstore'
- 'Publish to GitHub Releases': - 'Publish to GitHub Releases':
'manual': false 'manual': false
'final': false 'final': false
@ -204,58 +198,6 @@
'requirements': 'requirements':
- 'adg-docker': 'true' - 'adg-docker': 'true'
'Publish to Snapstore':
'docker':
'image': '${bamboo.dockerGo}'
'key': 'PTS'
'other':
'clean-working-dir': true
'tasks':
- 'clean'
- 'checkout':
'repository': 'bamboo-deploy-publisher'
'path': 'bamboo-deploy-publisher'
'force-clean-build': true
- 'script':
'interpreter': 'SHELL'
'scripts':
- |
#!/bin/sh
set -e -f -u -x
cd ./dist/
channel="${bamboo.channel}"
readonly channel
case "$channel"
in
('release')
snapchannel='candidate'
;;
('beta')
snapchannel='beta'
;;
('edge')
snapchannel='edge'
;;
(*)
echo "invalid channel '$channel'"
exit 1
;;
esac
env\
SNAPCRAFT_CHANNEL="$snapchannel"\
SNAPCRAFT_EMAIL="${bamboo.snapcraftEmail}"\
SNAPCRAFT_STORE_CREDENTIALS="${bamboo.snapcraftMacaroonPassword}"\
../bamboo-deploy-publisher/deploy.sh adguard-home-snap
'final-tasks':
- 'clean'
'requirements':
- 'adg-docker': 'true'
'Publish to GitHub Releases': 'Publish to GitHub Releases':
'key': 'PTGR' 'key': 'PTGR'
'other': 'other':

213
bamboo-specs/snapcraft.yaml Normal file
View file

@ -0,0 +1,213 @@
---
# This part of the release build is separate from the one described in
# release.yaml, because the Snapcraft infrastructure is brittle, and timeouts
# during logins and uploads often lead to release blocking.
'version': 2
'plan':
'project-key': 'AGH'
'key': 'AGHSNAP'
'name': 'AdGuard Home - Build and publish Snapcraft release'
# Make sure to sync any changes with the branch overrides below.
'variables':
'channel': 'edge'
'dockerGo': 'adguard/golang-ubuntu:6.7'
'snapcraftChannel': 'edge'
'stages':
- 'Download release':
'manual': false
'final': false
'jobs':
- 'Download release'
- 'Build packages':
'manual': false
'final': false
'jobs':
- 'Build packages'
- 'Publish to Snapstore':
'manual': false
'final': false
'jobs':
- 'Publish to Snapstore'
# TODO(a.garipov): Consider using the Artifact Downloader Task if it ever learns
# about plan branches.
'Download release':
'artifacts':
- 'name': 'i386_binary'
'pattern': 'AdGuardHome_i386'
'shared': true
'required': true
- 'name': 'amd64_binary'
'pattern': 'AdGuardHome_amd64'
'shared': true
'required': true
- 'name': 'armhf_binary'
'pattern': 'AdGuardHome_armhf'
'shared': true
'required': true
- 'name': 'arm64_binary'
'pattern': 'AdGuardHome_arm64'
'shared': true
'required': true
'docker':
'image': '${bamboo.dockerGo}'
'key': 'DR'
'other':
'clean-working-dir': true
'tasks':
- 'checkout':
'force-clean-build': true
- 'script':
'interpreter': 'SHELL'
'scripts':
- |
#!/bin/sh
set -e -f -u -x
env\
CHANNEL="${bamboo.channel}"\
VERBOSE='1'\
sh ./scripts/snap/download.sh
'requirements':
- 'adg-docker': 'true'
'Build packages':
'artifact-subscriptions':
- 'artifact': 'i386_binary'
- 'artifact': 'amd64_binary'
- 'artifact': 'armhf_binary'
- 'artifact': 'arm64_binary'
'artifacts':
- 'name': 'i386_snap'
'pattern': 'AdGuardHome_i386.snap'
'shared': true
'required': true
- 'name': 'amd64_snap'
'pattern': 'AdGuardHome_amd64.snap'
'shared': true
'required': true
- 'name': 'armhf_snap'
'pattern': 'AdGuardHome_armhf.snap'
'shared': true
'required': true
- 'name': 'arm64_snap'
'pattern': 'AdGuardHome_arm64.snap'
'shared': true
'required': true
'docker':
'image': '${bamboo.dockerGo}'
'key': 'BP'
'other':
'clean-working-dir': true
'tasks':
- 'checkout':
'force-clean-build': true
- 'script':
'interpreter': 'SHELL'
'scripts':
- |
#!/bin/sh
set -e -f -u -x
env\
VERBOSE='1'\
sh ./scripts/snap/build.sh
'final-tasks':
- 'clean'
'requirements':
- 'adg-docker': 'true'
'Publish to Snapstore':
'artifact-subscriptions':
- 'artifact': 'i386_snap'
- 'artifact': 'amd64_snap'
- 'artifact': 'armhf_snap'
- 'artifact': 'arm64_snap'
'docker':
'image': '${bamboo.dockerGo}'
'key': 'PTS'
'other':
'clean-working-dir': true
'tasks':
- 'checkout':
'force-clean-build': true
- 'script':
'interpreter': 'SHELL'
'scripts':
- |
#!/bin/sh
set -e -f -u -x
env\
SNAPCRAFT_CHANNEL="${bamboo.snapcraftChannel}"\
SNAPCRAFT_STORE_CREDENTIALS="${bamboo.snapcraftMacaroonPassword}"\
VERBOSE='1'\
sh ./scripts/snap/upload.sh
'final-tasks':
- 'clean'
'requirements':
- 'adg-docker': 'true'
'triggers':
# Don't use minute values that end with a zero or a five as these are often
# used in CI and so resources during these minutes can be quite busy.
#
# NOTE: The time is chosen to be exactly one hour after the main release
# build as defined as in release.yaml.
- 'cron': '0 42 14 ? * MON-FRI *'
'branches':
'create': 'manually'
'delete':
'after-deleted-days': 1
'after-inactive-days': 30
'integration':
'push-on-success': false
'merge-from': 'AdGuard Home - Build and publish Snapcraft release'
'link-to-jira': true
'notifications':
- 'events':
- 'plan-completed'
'recipients':
- 'webhook':
'name': 'Build webhook'
'url': 'http://prod.jirahub.service.eu.consul/v1/webhook/bamboo?channel=adguard-qa'
'labels': []
'other':
'concurrent-build-plugin': 'system-default'
'branch-overrides':
# beta-vX.Y branches are the branches into which the commits that are needed
# to release a new patch version are initially cherry-picked.
- '^beta-v[0-9]+\.[0-9]+':
# Build betas on release branches manually.
'triggers': []
# Set the default release channel on the release branch to beta, as we may
# need to build a few of these.
'variables':
'channel': 'beta'
'dockerGo': 'adguard/golang-ubuntu:6.7'
'snapcraftChannel': 'beta'
# release-vX.Y.Z branches are the branches from which the actual final
# release is built.
- '^release-v[0-9]+\.[0-9]+\.[0-9]+':
# Disable integration branches for release branches.
'branch-config':
'integration':
'push-on-success': false
'merge-from': 'beta-v0.107'
# Build final releases on release branches manually.
'triggers': []
# Set the default release channel on the final branch to release, as these
# are the ones that actually get released.
'variables':
'channel': 'release'
'dockerGo': 'adguard/golang-ubuntu:6.7'
'snapcraftChannel': 'candidate'

View file

@ -2,7 +2,7 @@
## `hooks/`: Git Hooks ## `hooks/`: Git Hooks
### Usage ### Usage
Run `make init` from the project root. Run `make init` from the project root.
@ -10,7 +10,7 @@ Run `make init` from the project root.
## `querylog/`: Query Log Helpers ## `querylog/`: Query Log Helpers
### Usage ### Usage
* `npm install`: install dependencies. Run this first. * `npm install`: install dependencies. Run this first.
* `npm run anonymize <source> <dst>`: read the query log from the `<source>` * `npm run anonymize <source> <dst>`: read the query log from the `<source>`
@ -26,157 +26,215 @@ don't print anything, and `1`, be verbose.
### `build-docker.sh`: Build A Multi-Architecture Docker Image ### `build-docker.sh`: Build A Multi-Architecture Docker Image
Required environment: Required environment:
* `CHANNEL`: release channel, see above. * `CHANNEL`: release channel, see above.
* `COMMIT`: current Git revision. * `COMMIT`: current Git revision.
* `DIST_DIR`: the directory where a release has previously been built. * `DIST_DIR`: the directory where a release has previously been built.
* `VERSION`: release version. * `VERSION`: release version.
Optional environment: Optional environment:
* `DOCKER_IMAGE_NAME`: the name of the resulting Docker container. By default * `DOCKER_IMAGE_NAME`: the name of the resulting Docker container. By default
it's `adguardhome-dev`. it's `adguardhome-dev`.
* `DOCKER_OUTPUT`: the `--output` parameters. By default they are * `DOCKER_OUTPUT`: the `--output` parameters. By default they are
`type=image,name=${DOCKER_IMAGE_NAME},push=false`. `type=image,name=${DOCKER_IMAGE_NAME},push=false`.
* `SUDO`: allow users to use `sudo` or `doas` with `docker`. By default none * `SUDO`: allow users to use `sudo` or `doas` with `docker`. By default none
is used. is used.
### `build-release.sh`: Build A Release For All Platforms ### `build-release.sh`: Build A Release For All Platforms
Required environment: Required environment:
* `CHANNEL`: release channel, see above. * `CHANNEL`: release channel, see above.
* `GPG_KEY` and `GPG_KEY_PASSPHRASE`: data for `gpg`. Only required if `SIGN` * `GPG_KEY` and `GPG_KEY_PASSPHRASE`: data for `gpg`. Only required if `SIGN`
is `1`. is `1`.
Optional environment: Optional environment:
* `ARCH` and `OS`: space-separated list of architectures and operating systems * `ARCH` and `OS`: space-separated list of architectures and operating systems
for which to build a release. For example, to build only for 64-bit ARM and for which to build a release. For example, to build only for 64-bit ARM and
AMD on Linux and Darwin: AMD on Linux and Darwin:
```sh ```sh
make ARCH='amd64 arm64' OS='darwin linux' … build-release make ARCH='amd64 arm64' OS='darwin linux' … build-release
``` ```
The default value is `''`, which means build everything. The default value is `''`, which means build everything.
* `BUILD_SNAP`: `0` to not build Snapcraft packages, `1` to build. The
default value is `1`.
* `DIST_DIR`: the directory to build a release into. The default value is * `DIST_DIR`: the directory to build a release into. The default value is
`dist`. `dist`.
* `GO`: set an alternative name for the Go compiler. * `GO`: set an alternative name for the Go compiler.
* `SIGN`: `0` to not sign the resulting packages, `1` to sign. The default * `SIGN`: `0` to not sign the resulting packages, `1` to sign. The default
value is `1`. value is `1`.
* `VERBOSE`: `1` to be verbose, `2` to also print environment. This script * `VERBOSE`: `1` to be verbose, `2` to also print environment. This script
calls `go-build.sh` with the verbosity level one level lower, so to get calls `go-build.sh` with the verbosity level one level lower, so to get
verbosity level `2` in `go-build.sh`, set this to `3` when calling verbosity level `2` in `go-build.sh`, set this to `3` when calling
`build-release.sh`. `build-release.sh`.
* `VERSION`: release version. Will be set by `version.sh` if it is unset or * `VERSION`: release version. Will be set by `version.sh` if it is unset or
if it has the default `Makefile` value of `v0.0.0`. if it has the default `Makefile` value of `v0.0.0`.
### `clean.sh`: Cleanup ### `clean.sh`: Cleanup
Optional environment: Optional environment:
* `GO`: set an alternative name for the Go compiler. * `GO`: set an alternative name for the Go compiler.
Required environment: Required environment:
* `DIST_DIR`: the directory where a release has previously been built. * `DIST_DIR`: the directory where a release has previously been built.
### `go-build.sh`: Build The Backend ### `go-build.sh`: Build The Backend
Optional environment: Optional environment:
* `GOARM`: ARM processor options for the Go compiler. * `GOARM`: ARM processor options for the Go compiler.
* `GOMIPS`: ARM processor options for the Go compiler. * `GOMIPS`: ARM processor options for the Go compiler.
* `GO`: set an alternative name for the Go compiler. * `GO`: set an alternative name for the Go compiler.
* `OUT`: output binary name. * `OUT`: output binary name.
* `PARALLELISM`: set the maximum number of concurrently run build commands * `PARALLELISM`: set the maximum number of concurrently run build commands
(that is, compiler, linker, etc.). (that is, compiler, linker, etc.).
* `SOURCE_DATE_EPOCH`: the [standardized][repr] environment variable for the * `SOURCE_DATE_EPOCH`: the [standardized][repr] environment variable for the
Unix epoch time of the latest commit in the repository. If set, overrides Unix epoch time of the latest commit in the repository. If set, overrides
the default obtained from Git. Useful for reproducible builds. the default obtained from Git. Useful for reproducible builds.
* `VERBOSE`: verbosity level. `1` shows every command that is run and every * `VERBOSE`: verbosity level. `1` shows every command that is run and every
Go package that is processed. `2` also shows subcommands and environment. Go package that is processed. `2` also shows subcommands and environment.
The default value is `0`, don't be verbose. The default value is `0`, don't be verbose.
* `VERSION`: release version. Will be set by `version.sh` if it is unset or * `VERSION`: release version. Will be set by `version.sh` if it is unset or
if it has the default `Makefile` value of `v0.0.0`. if it has the default `Makefile` value of `v0.0.0`.
Required environment: Required environment:
* `CHANNEL`: release channel, see above. * `CHANNEL`: release channel, see above.
[repr]: https://reproducible-builds.org/docs/source-date-epoch/ [repr]: https://reproducible-builds.org/docs/source-date-epoch/
### `go-deps.sh`: Install Backend Dependencies ### `go-deps.sh`: Install Backend Dependencies
Optional environment: Optional environment:
* `GO`: set an alternative name for the Go compiler. * `GO`: set an alternative name for the Go compiler.
* `VERBOSE`: verbosity level. `1` shows every command that is run and every * `VERBOSE`: verbosity level. `1` shows every command that is run and every
Go package that is processed. `2` also shows subcommands and environment. Go package that is processed. `2` also shows subcommands and environment.
The default value is `0`, don't be verbose. The default value is `0`, don't be verbose.
### `go-lint.sh`: Run Backend Static Analyzers ### `go-lint.sh`: Run Backend Static Analyzers
Don't forget to run `make go-tools` once first! Don't forget to run `make go-tools` once first!
Optional environment: Optional environment:
* `EXIT_ON_ERROR`: if set to `0`, don't exit the script after the first * `EXIT_ON_ERROR`: if set to `0`, don't exit the script after the first
encountered error. The default value is `1`. encountered error. The default value is `1`.
* `GO`: set an alternative name for the Go compiler. * `GO`: set an alternative name for the Go compiler.
* `VERBOSE`: verbosity level. `1` shows every command that is run. `2` also * `VERBOSE`: verbosity level. `1` shows every command that is run. `2` also
shows subcommands. The default value is `0`, don't be verbose. shows subcommands. The default value is `0`, don't be verbose.
### `go-test.sh`: Run Backend Tests ### `go-test.sh`: Run Backend Tests
Optional environment: Optional environment:
* `GO`: set an alternative name for the Go compiler. * `GO`: set an alternative name for the Go compiler.
* `RACE`: set to `0` to not use the Go race detector. The default value is * `RACE`: set to `0` to not use the Go race detector. The default value is
`1`, use the race detector. `1`, use the race detector.
* `TIMEOUT_FLAGS`: set timeout flags for tests. The default value is * `TIMEOUT_FLAGS`: set timeout flags for tests. The default value is
`--timeout 30s`. `--timeout 30s`.
* `VERBOSE`: verbosity level. `1` shows every command that is run and every * `VERBOSE`: verbosity level. `1` shows every command that is run and every
Go package that is processed. `2` also shows subcommands. The default Go package that is processed. `2` also shows subcommands. The default
value is `0`, don't be verbose. value is `0`, don't be verbose.
### `go-tools.sh`: Install Backend Tooling ### `go-tools.sh`: Install Backend Tooling
Installs the Go static analysis and other tools into `${PWD}/bin`. Either add Installs the Go static analysis and other tools into `${PWD}/bin`. Either add
`${PWD}/bin` to your `$PATH` before all other entries, or use the commands `${PWD}/bin` to your `$PATH` before all other entries, or use the commands
directly, or use the commands through `make` (for example, `make go-lint`). directly, or use the commands through `make` (for example, `make go-lint`).
Optional environment: Optional environment:
* `GO`: set an alternative name for the Go compiler. * `GO`: set an alternative name for the Go compiler.
### `version.sh`: Generate And Print The Current Version ### `version.sh`: Generate And Print The Current Version
Required environment: Required environment:
* `CHANNEL`: release channel, see above. * `CHANNEL`: release channel, see above.
## `snap/`: Snap GUI Files ## `snap/`: Snapcraft scripts
App icons (see https://github.com/AdguardTeam/AdGuardHome/pull/1836), Snap ### `build.sh`
manifest file templates, and helper scripts.
Builds the Snapcraft packages from the binaries created by `download.sh`.
### `download.sh`
Downloads the binaries to pack them into Snapcraft packages.
Required environment:
* `CHANNEL`: release channel, see above.
### `upload.sh`
Uploads the Snapcraft packages created by `build.sh`.
Required environment:
* `SNAPCRAFT_CHANNEL`: Snapcraft release channel: `edge`, `beta`, or
`candidate`.
* `SNAPCRAFT_STORE_CREDENTIALS`: Credentials for Snapcraft store.
Optional environment:
* `SNAPCRAFT_CMD`: Overrides the Snapcraft command. Default: `snapcraft`.
## `translations/`: Twosky Integration Script ## `translations/`: Twosky Integration Script
### Usage ### Usage
* `go run main.go help`: print usage. * `go run main.go help`: print usage.
@ -211,7 +269,7 @@ Optional environment:
A simple script that downloads and updates the companies DB in the `client` A simple script that downloads and updates the companies DB in the `client`
code from [the repo][companiesrepo]. code from [the repo][companiesrepo].
### Usage ### Usage
```sh ```sh
sh ./scripts/companiesdb/download.sh sh ./scripts/companiesdb/download.sh
@ -231,7 +289,7 @@ Optional environment:
* `URL`: the URL of the index file. By default it's * `URL`: the URL of the index file. By default it's
`https://adguardteam.github.io/HostlistsRegistry/assets/services.json`. `https://adguardteam.github.io/HostlistsRegistry/assets/services.json`.
### Usage ### Usage
```sh ```sh
go run ./scripts/blocked-services/main.go go run ./scripts/blocked-services/main.go
@ -251,7 +309,7 @@ Optional environment:
* `URL`: the URL of the index file. By default it's * `URL`: the URL of the index file. By default it's
`https://adguardteam.github.io/HostlistsRegistry/assets/filters.json`. `https://adguardteam.github.io/HostlistsRegistry/assets/filters.json`.
### Usage ### Usage
```sh ```sh
go run ./scripts/vetted-filters/main.go go run ./scripts/vetted-filters/main.go

View file

@ -5,11 +5,12 @@ verbose="${VERBOSE:-0}"
if [ "$verbose" -gt '0' ] if [ "$verbose" -gt '0' ]
then then
set -x set -x
debug_flags='-D' debug_flags='--debug=1'
else else
set +x set +x
debug_flags='' debug_flags='--debug=0'
fi fi
readonly debug_flags
set -e -f -u set -e -f -u
@ -61,21 +62,16 @@ readonly docker_output
case "$channel" case "$channel"
in in
('release') ('release')
docker_image_full_name="${docker_image_name}:${version}" docker_tags="--tag=${docker_image_name}:${version},${docker_image_name}:latest"
docker_tags="--tag ${docker_image_name}:latest"
;; ;;
('beta') ('beta')
docker_image_full_name="${docker_image_name}:${version}" docker_tags="--tag=${docker_image_name}:${version},${docker_image_name}:beta"
docker_tags="--tag ${docker_image_name}:beta"
;; ;;
('edge') ('edge')
# Don't set the version tag when pushing to the edge channel. docker_tags="--tag=${docker_image_name}:edge"
docker_image_full_name="${docker_image_name}:edge"
docker_tags=''
;; ;;
('development') ('development')
docker_image_full_name="${docker_image_name}" docker_tags="--tag=${docker_image_name}"
docker_tags=''
;; ;;
(*) (*)
echo "invalid channel '$channel', supported values are\ echo "invalid channel '$channel', supported values are\
@ -83,7 +79,7 @@ in
exit 1 exit 1
;; ;;
esac esac
readonly docker_image_full_name docker_tags readonly docker_tags
# Copy the binaries into a new directory under new names, so that it's easier to # Copy the binaries into a new directory under new names, so that it's easier to
# COPY them later. DO NOT remove the trailing underscores. See file # COPY them later. DO NOT remove the trailing underscores. See file
@ -117,10 +113,8 @@ cp "./docker/web-bind.awk"\
cp "./docker/healthcheck.sh"\ cp "./docker/healthcheck.sh"\
"${dist_docker_scripts}/healthcheck.sh" "${dist_docker_scripts}/healthcheck.sh"
# Don't use quotes with $docker_tags and $debug_flags because we want word
# splitting and or an empty space if tags are empty.
$sudo_cmd docker\ $sudo_cmd docker\
$debug_flags\ "$debug_flags"\
buildx build\ buildx build\
--build-arg BUILD_DATE="$build_date"\ --build-arg BUILD_DATE="$build_date"\
--build-arg DIST_DIR="$dist_dir"\ --build-arg DIST_DIR="$dist_dir"\
@ -128,7 +122,6 @@ $sudo_cmd docker\
--build-arg VERSION="$version"\ --build-arg VERSION="$version"\
--output "$docker_output"\ --output "$docker_output"\
--platform "$docker_platforms"\ --platform "$docker_platforms"\
$docker_tags\ "$docker_tags"\
-t "$docker_image_full_name"\
-f ./docker/Dockerfile\ -f ./docker/Dockerfile\
. .

View file

@ -78,14 +78,6 @@ else
fi fi
readonly oses readonly oses
snap_enabled="${BUILD_SNAP:-1}"
readonly snap_enabled
if [ "$snap_enabled" -eq '0' ]
then
log 'snap: disabled'
fi
# Require the gpg key and passphrase to be set if the signing is required. # Require the gpg key and passphrase to be set if the signing is required.
if [ "$sign" -eq '1' ] if [ "$sign" -eq '1' ]
then then
@ -106,7 +98,7 @@ log "checking tools"
# Make sure we fail gracefully if one of the tools we need is missing. Use # Make sure we fail gracefully if one of the tools we need is missing. Use
# alternatives when available. # alternatives when available.
use_shasum='0' use_shasum='0'
for tool in gpg gzip sed sha256sum snapcraft tar zip for tool in gpg gzip sed sha256sum tar zip
do do
if ! command -v "$tool" > /dev/null if ! command -v "$tool" > /dev/null
then then
@ -128,36 +120,36 @@ readonly use_shasum
# Data section. Arrange data into space-separated tables for read -r to read. # Data section. Arrange data into space-separated tables for read -r to read.
# Use a hyphen for missing values. # Use a hyphen for missing values.
# os arch arm mips snap # os arch arm mips
platforms="\ platforms="\
darwin amd64 - - - darwin amd64 - -
darwin arm64 - - - darwin arm64 - -
freebsd 386 - - - freebsd 386 - -
freebsd amd64 - - - freebsd amd64 - -
freebsd arm 5 - - freebsd arm 5 -
freebsd arm 6 - - freebsd arm 6 -
freebsd arm 7 - - freebsd arm 7 -
freebsd arm64 - - - freebsd arm64 - -
linux 386 - - i386 linux 386 - -
linux amd64 - - amd64 linux amd64 - -
linux arm 5 - - linux arm 5 -
linux arm 6 - - linux arm 6 -
linux arm 7 - armhf linux arm 7 -
linux arm64 - - arm64 linux arm64 - -
linux mips - softfloat - linux mips - softfloat
linux mips64 - softfloat - linux mips64 - softfloat
linux mips64le - softfloat - linux mips64le - softfloat
linux mipsle - softfloat - linux mipsle - softfloat
linux ppc64le - - - linux ppc64le - -
openbsd amd64 - - - openbsd amd64 - -
openbsd arm64 - - - openbsd arm64 - -
windows 386 - - - windows 386 - -
windows amd64 - - - windows amd64 - -
windows arm64 - - -" windows arm64 - -"
readonly platforms readonly platforms
# Function build builds the release for one platform. It builds a binary, an # Function build builds the release for one platform. It builds a binary and an
# archive and, if needed, a snap package. # archive.
build() { build() {
# Get the arguments. Here and below, use the "build_" prefix for all # Get the arguments. Here and below, use the "build_" prefix for all
# variables local to function build. # variables local to function build.
@ -167,7 +159,6 @@ build() {
build_arch="$4"\ build_arch="$4"\
build_arm="$5"\ build_arm="$5"\
build_mips="$6"\ build_mips="$6"\
build_snap="$7"\
; ;
# Use the ".exe" filename extension if we build a Windows release. # Use the ".exe" filename extension if we build a Windows release.
@ -229,52 +220,13 @@ build() {
esac esac
log "$build_archive" log "$build_archive"
# Exit if we don't need to build the Snap package.
if [ "$build_snap" = '-' ] || [ "$snap_enabled" -eq '0' ]
then
return
fi
# Prepare the Snap build.
build_snap_output="./${dist}/AdGuardHome_${build_snap}.snap"
build_snap_dir="${build_snap_output}.dir"
# Create the meta subdirectory and copy files there.
mkdir -p "${build_snap_dir}/meta"
cp "$build_output" './scripts/snap/local/adguard-home-web.sh' "$build_snap_dir"
cp -r './scripts/snap/gui' "${build_snap_dir}/meta/"
# Create a snap.yaml file, setting the values.
sed -e 's/%VERSION%/'"$version"'/'\
-e 's/%ARCH%/'"$build_snap"'/'\
./scripts/snap/snap.tmpl.yaml\
>"${build_snap_dir}/meta/snap.yaml"
# TODO(a.garipov): The snapcraft tool will *always* write everything,
# including errors, to stdout. And there doesn't seem to be a way to change
# that. So, save the combined output, but only show it when snapcraft
# actually fails.
set +e
build_snapcraft_output="$(
snapcraft pack "$build_snap_dir" --output "$build_snap_output" 2>&1
)"
build_snapcraft_exit_code="$?"
set -e
if [ "$build_snapcraft_exit_code" -ne '0' ]
then
log "$build_snapcraft_output"
exit "$build_snapcraft_exit_code"
fi
log "$build_snap_output"
} }
log "starting builds" log "starting builds"
# Go over all platforms defined in the space-separated table above, tweak the # Go over all platforms defined in the space-separated table above, tweak the
# values where necessary, and feed to build. # values where necessary, and feed to build.
echo "$platforms" | while read -r os arch arm mips snap echo "$platforms" | while read -r os arch arm mips
do do
# See if the architecture or the OS is in the allowlist. To do so, try # See if the architecture or the OS is in the allowlist. To do so, try
# removing everything that matches the pattern (well, a prefix, but that # removing everything that matches the pattern (well, a prefix, but that
@ -314,7 +266,7 @@ do
;; ;;
esac esac
build "$dir" "$ar" "$os" "$arch" "$arm" "$mips" "$snap" build "$dir" "$ar" "$os" "$arch" "$arm" "$mips"
done done
log "packing frontend" log "packing frontend"
@ -413,14 +365,14 @@ do
platform="$f" platform="$f"
# Remove the prefix. # Remove the prefix.
platform="${platform#./${dist}/AdGuardHome_}" platform="${platform#"./${dist}/AdGuardHome_"}"
# Remove the filename extensions. # Remove the filename extensions.
platform="${platform%.zip}" platform="${platform%.zip}"
platform="${platform%.tar.gz}" platform="${platform%.tar.gz}"
# Use the filename's base path. # Use the filename's base path.
filename="${f#./${dist}/}" filename="${f#"./${dist}/"}"
if [ "$i" -eq "$ar_files_len" ] if [ "$i" -eq "$ar_files_len" ]
then then

77
scripts/snap/build.sh Normal file
View file

@ -0,0 +1,77 @@
#!/bin/sh
verbose="${VERBOSE:-0}"
if [ "$verbose" -gt '0' ]
then
set -x
fi
set -e -f -u
# Function log is an echo wrapper that writes to stderr if the caller requested
# verbosity level greater than 0. Otherwise, it does nothing.
#
# TODO(a.garipov): Add to helpers.sh and use more actively in scripts.
log() {
if [ "$verbose" -gt '0' ]
then
# Don't use quotes to get word splitting.
echo "$1" 1>&2
fi
}
version="$( ./AdGuardHome_amd64 --version | cut -d ' ' -f 4 )"
if [ "$version" = '' ]
then
log 'empty version from ./AdGuardHome_amd64'
exit 1
fi
readonly version
log "version '$version'"
for arch in\
'i386'\
'amd64'\
'armhf'\
'arm64'
do
build_output="./AdGuardHome_${arch}"
snap_output="./AdGuardHome_${arch}.snap"
snap_dir="${snap_output}.dir"
# Create the meta subdirectory and copy files there.
mkdir -p "${snap_dir}/meta"
cp "$build_output" "${snap_dir}/AdGuardHome"
cp './snap/local/adguard-home-web.sh' "$snap_dir"
cp -r './snap/gui' "${snap_dir}/meta/"
# Create a snap.yaml file, setting the values.
sed\
-e 's/%VERSION%/'"$version"'/'\
-e 's/%ARCH%/'"$arch"'/'\
./snap/snap.tmpl.yaml\
> "${snap_dir}/meta/snap.yaml"
# TODO(a.garipov): The snapcraft tool will *always* write everything,
# including errors, to stdout. And there doesn't seem to be a way to change
# that. So, save the combined output, but only show it when snapcraft
# actually fails.
set +e
snapcraft_output="$(
snapcraft pack "$snap_dir" --output "$snap_output" 2>&1
)"
snapcraft_exit_code="$?"
set -e
if [ "$snapcraft_exit_code" -ne '0' ]
then
log "$snapcraft_output"
exit "$snapcraft_exit_code"
fi
log "$snap_output"
rm -f -r "$snap_dir"
done

29
scripts/snap/download.sh Normal file
View file

@ -0,0 +1,29 @@
#!/bin/sh
verbose="${VERBOSE:-0}"
if [ "$verbose" -gt '0' ]
then
set -x
fi
set -e -f -u
channel="${CHANNEL:?please set CHANNEL}"
readonly channel
printf '%s %s\n'\
'386' 'i386'\
'amd64' 'amd64'\
'armv7' 'armhf'\
'arm64' 'arm64' \
| while read -r arch snap_arch
do
release_url="https://static.adtidy.org/adguardhome/${channel}/AdGuardHome_linux_${arch}.tar.gz"
output="./AdGuardHome_linux_${arch}.tar.gz"
curl -o "$output" -v "$release_url"
tar -f "$output" -v -x -z
cp ./AdGuardHome/AdGuardHome "./AdGuardHome_${snap_arch}"
rm -f -r "$output" ./AdGuardHome
done

93
scripts/snap/upload.sh Normal file
View file

@ -0,0 +1,93 @@
#!/bin/sh
verbose="${VERBOSE:-0}"
if [ "$verbose" -gt '0' ]
then
set -x
fi
set -e -f -u
# Function log is an echo wrapper that writes to stderr if the caller requested
# verbosity level greater than 0. Otherwise, it does nothing.
log() {
if [ "$verbose" -gt '0' ]
then
# Don't use quotes to get word splitting.
echo "$1" 1>&2
fi
}
# Do not set a new lowercase variable, because the snapcraft tool expects the
# uppercase form.
if [ "${SNAPCRAFT_STORE_CREDENTIALS:-}" = '' ]
then
log 'please set SNAPCRAFT_STORE_CREDENTIALS'
exit 1
fi
export SNAPCRAFT_STORE_CREDENTIALS
snapcraft_channel="${SNAPCRAFT_CHANNEL:?please set SNAPCRAFT_CHANNEL}"
readonly snapcraft_channel
# Allow developers to overwrite the command, e.g. for testing.
snapcraft_cmd="${SNAPCRAFT_CMD:-snapcraft}"
readonly snapcraft_cmd
default_timeout='90s'
kill_timeout='120s'
readonly default_timeout kill_timeout
for arch in\
'i386'\
'amd64'\
'armhf'\
'arm64'
do
snap_file="./AdGuardHome_${arch}.snap"
# Catch the exit code and the combined output to later inspect it.
set +e
snapcraft_output="$(
# Use timeout(1) to force snapcraft to quit after a certain time. There
# seems to be no environment variable or flag to force this behavior.
timeout\
--preserve-status\
-k "$kill_timeout"\
-v "$default_timeout"\
"$snapcraft_cmd" upload\
--release="${snapcraft_channel}"\
--quiet\
"${snap_file}"\
2>&1
)"
snapcraft_exit_code="$?"
set -e
if [ "$snapcraft_exit_code" -eq '0' ]
then
log "successful upload: ${snapcraft_output}"
continue
fi
# Skip the ones that were failed by a duplicate upload error.
case "$snapcraft_output"
in
(*'A file with this exact same content has already been uploaded'|\
'Error checking upload uniqueness'*)
log "warning: duplicate upload, skipping"
log "snapcraft upload error: ${snapcraft_output}"
continue
;;
(*)
echo "unexpected snapcraft upload error: ${snapcraft_output}"
return "$snapcraft_exit_code"
;;
esac
done

View file

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB