switch 32bit release to armhf dynamically linked

This commit is contained in:
Kenneth Bingham 2024-07-25 13:27:31 -04:00
parent 477edd503c
commit a60c0bfab3
No known key found for this signature in database
GPG Key ID: 31709281860130B6
7 changed files with 173 additions and 47 deletions

View File

@ -159,7 +159,7 @@ jobs:
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
steps: steps:
- run: sudo apt update - run: sudo apt update
- run: sudo apt-get install gcc-arm-linux-gnueabi - run: sudo apt-get install gcc-arm-linux-gnueabihf
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:

144
.goreleaser-linux-armel.yml Normal file
View File

@ -0,0 +1,144 @@
# this is a DiY build config for the soft-float, armel platform (32bit ARMv7 devices lacking an FPU) see
# instructions to cross-build this binary in ./docker/images/cross-build/README.md or
# https://github.com/openziti/zrok/tree/main/docker/images/cross-build#readme
version: 2
builds:
- id: zrok-armel
main: ./cmd/zrok
binary: zrok
ldflags:
- "-s -w -X github.com/openziti/zrok/build.Version={{.Tag}} -X github.com/openziti/zrok/build.Hash={{.ShortCommit}}"
env:
- CC=arm-linux-gnueabi-gcc
- CGO_ENABLED=1
- CC_FOR_TARGET=gcc-arm-linux-gnueabi
goos:
- linux
goarch:
- arm
goarm:
- 7
nfpms:
- package_name: zrok
id: zrok-cli
vendor: NetFoundry
homepage: https://zrok.io/
maintainer: support@zrok.io
description: |-
zrok is a next-generation sharing platform, designed to make sharing network and file resources simple and
secure.
license: Apache 2.0
# Build IDs for the builds you want to create NFPM packages for.
builds:
- zrok-armel
# Formats to be generated.
formats:
- deb
- rpm
# {{ .ConventionalFileName }} satisfies the RPM name convention.
file_name_template: "{{ .ConventionalFileName }}"
# Umask to be used on files without explicit mode set. (overridable)
umask: 0o002
# Package version within this release version.
release: 1
# Section.
section: default
# Priority.
priority: optional
# GoReleaser will automatically add the binaries here
bindir: /opt/openziti/bin
# Contents to add to the package.
contents:
- src: /opt/openziti/bin/zrok
dst: /usr/bin/zrok
type: "symlink"
- package_name: zrok-share
id: zrok-share
vendor: NetFoundry
homepage: https://zrok.io/
maintainer: support@zrok.io
description: |-
This package provides zrok-share.service. To enable, edit the "/opt/openziti/etc/zrok/zrok-share.env" file with the
desired target for sharing, and run "systemctl enable --now zrok-share.service".
license: Apache 2.0
# do not bundle the built binaries, only supporting files
meta: true
# Formats to be generated.
formats:
- deb
- rpm
# {{ .ConventionalFileName }} satisfies the RPM name convention.
file_name_template: "{{ .ConventionalFileName }}"
# Umask to be used on files without explicit mode set. (overridable)
umask: 0o002
# Package version within this release version.
release: 1
# Section.
section: default
# Priority.
priority: optional
# GoReleaser will automatically add the binaries here
dependencies:
- zrok
# this allows users to satisfy the requirement for jq another way, not with the package manager, e.g.
# apt install --no-recommends zrok-share
recommends:
- jq
overrides:
# yum and dnf do not automatically install "weak deps" aka "recommends", so we need to add them as a dependency
rpm:
dependencies:
- zrok
- jq
# Contents to add to the package.
contents:
- dst: /lib/systemd/system/
src: ./nfpm/zrok-share.service
- dst: /etc/systemd/system/zrok-share.service.d/override.conf
src: ./nfpm/zrok-share.service.override.conf
- dst: /opt/openziti/etc/zrok
type: dir
file_info:
mode: 0755
- dst: /opt/openziti/bin/
src: ./nfpm/zrok-share.bash
file_info:
mode: 0755
- dst: /opt/openziti/bin/
src: ./nfpm/zrok-enable.bash
file_info:
mode: 0755
- dst: /opt/openziti/etc/zrok/
src: ./nfpm/zrok-share.env
type: config|noreplace
- dst: /opt/openziti/etc/zrok/
src: ./etc/caddy/multiple_upstream.Caddyfile
type: config|noreplace

View File

@ -1,15 +1,15 @@
# this is the release build config for hard-float, arm/v7 platform (32bit ARM devices with a FPU)
version: 2 version: 2
builds: builds:
- id: zrok-armv7 - id: zrok-armhf
main: ./cmd/zrok main: ./cmd/zrok
binary: zrok binary: zrok
ldflags: ldflags:
- '-extldflags "-static"'
- "-s -w -X github.com/openziti/zrok/build.Version={{.Tag}} -X github.com/openziti/zrok/build.Hash={{.ShortCommit}}" - "-s -w -X github.com/openziti/zrok/build.Version={{.Tag}} -X github.com/openziti/zrok/build.Hash={{.ShortCommit}}"
env: env:
- CC=arm-linux-gnueabi-gcc - CC=arm-linux-gnueabihf-gcc
- CGO_ENABLED=1 - CGO_ENABLED=1
- CC_FOR_TARGET=gcc-arm-linux-gnueabi - CC_FOR_TARGET=gcc-arm-linux-gnueabihf
goos: goos:
- linux - linux
goarch: goarch:
@ -30,7 +30,7 @@ nfpms:
# Build IDs for the builds you want to create NFPM packages for. # Build IDs for the builds you want to create NFPM packages for.
builds: builds:
- zrok-armv7 - zrok-armhf
# Formats to be generated. # Formats to be generated.
formats: formats:

View File

@ -17,6 +17,7 @@ ARG go_cache=/usr/share/go
RUN apt-get -y update \ RUN apt-get -y update \
&& apt-get -y install \ && apt-get -y install \
gcc-arm-linux-gnueabi \ gcc-arm-linux-gnueabi \
gcc-arm-linux-gnueabihf \
gcc-aarch64-linux-gnu \ gcc-aarch64-linux-gnu \
wget \ wget \
git \ git \

View File

@ -1,21 +1,15 @@
# Cross-build Container for Building the Linux Executables for this zrok Project # Cross-build Container for Building the Linux Executables for this zrok Project
Running this container produces three executables for zrok, one for each platform architecture: amd64, arm, arm64. You may specify the target CPU architecture as a parameter to the `docker run` command. Running this container produces one snapshot executable for zrok from the current checkout, even if dirty. Platform choices are: `amd64`, `arm64`, `arm` (the arm/v7 "armhf" ABI target), and `armel` (the arm/v7 "armel" ABI). You may specify the target architecture as a parameter to the `docker run` command.
## Build the Container Image ## Build the Container Image
You only need to build the container image once unless you change the Dockerfile or `./linux-build.sh`. You only need to build the container image once unless you change the Dockerfile or `./linux-build.sh`.
```bash ```bash
# build a container image named "zrok-builder" with the same version of Go that's declared in go.mod # build a container image named "zrok-builder"
docker buildx build \ docker buildx build -t zrok-builder ./docker/images/cross-build --load;
--tag=zrok-builder \
--build-arg uid=$UID \
--build-arg gid=$GID \
--build-arg golang_version=$(grep -Po '^go\s+\K\d+\.\d+(\.\d+)?$' go.mod) \
--load \
./docker/images/cross-build/
``` ```
## Run the Container to Build Executables for the Desired Architectures ## Run the Container to Build Executables for the Desired Architectures
@ -24,23 +18,11 @@ Executing the following `docker run` command will:
1. Mount the top-level of this repo on the container's `/mnt` 1. Mount the top-level of this repo on the container's `/mnt`
2. Run `linux-build.sh ${@}` inside the container 2. Run `linux-build.sh ${@}` inside the container
3. Deposit built executables in `./dist/` 3. Deposit built executable in `./dist/`
```bash ```bash
# build for all three architectures: amd64 arm arm64 # cross-build for arm64/aarch64 architecture on Linux
docker run \ docker run --user "${UID}" --rm --volume=${HOME}/.cache/go-build:/usr/share/go --volume "${PWD}:/mnt" zrok-builder arm64
--rm \
--name=zrok-builder \
--volume=$PWD:/mnt \
zrok-builder
# build only amd64
docker run \
--rm \
--name=zrok-builder \
--volume=$PWD:/mnt \
zrok-builder \
amd64
``` ```
You will find the built artifacts in `./dist/`. You will find the built artifacts in `./dist/`.

View File

@ -1,10 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# #
# build the Linux artifacts for amd64, arm, arm64 # build the Linux artifact for amd64, armhf, armel, or arm64
# #
# runs one background job per desired architecture unless there are too few CPUs
#
#
set -o errexit set -o errexit
set -o nounset set -o nounset
@ -13,7 +10,7 @@ set -o xtrace
resolveArch() { resolveArch() {
case ${1} in case ${1} in
arm|armv7*|arm/v7*|armhf*) echo armhf arm|armv7*|arm/v7*) echo armhf
;; ;;
armv8*|arm/v8*) echo arm64 armv8*|arm/v8*) echo arm64
;; ;;
@ -22,11 +19,11 @@ resolveArch() {
esac esac
} }
# if no architectures supplied then default list of three # if no architectures supplied then default to amd64
if (( ${#} )); then if (( ${#} )); then
typeset -a JOBS=(${@}) typeset -a JOBS=(${@})
else else
typeset -a JOBS=(amd64 arm arm64) typeset -a JOBS=(amd64)
fi fi
( (
@ -43,7 +40,7 @@ for ARCH in "${JOBS[@]}"; do
goreleaser build \ goreleaser build \
--clean \ --clean \
--snapshot \ --snapshot \
--output ./dist/ \ --output "./dist/" \
--config "./.goreleaser-linux-$(resolveArch "${ARCH}").yml" --config "./.goreleaser-linux-$(resolveArch "${ARCH}").yml"
done done

View File

@ -64,11 +64,9 @@ Download the binary distribution for your Linux distribution's architecture or r
<Details> <Details>
<summary>Script to install binary in `/usr/local/bin/zrok`</summary> <summary>Script to install binary in `/usr/local/bin/zrok`</summary>
This script auto-selects the correct architecture, and may be helpful for Raspberry Pi users. This script auto-selects the correct architecture and may be helpful for Raspberry Pi users.
```text ```text
(set -euo pipefail;
cd $(mktemp -d); cd $(mktemp -d);
ZROK_VERSION=$( ZROK_VERSION=$(
@ -77,11 +75,15 @@ ZROK_VERSION=$(
); );
case $(uname -m) in case $(uname -m) in
x86_64) GOXARCH=amd64 ;; x86_64) GOXARCH=amd64
aarch64|arm64) GOXARCH=arm64 ;; ;;
armv7|armhf|arm) GOXARCH=arm ;; aarch64|arm64) GOXARCH=arm64
*) echo "ERROR: unknown arch '$(uname -m)'" >&2 ;;
exit 1 ;; arm*) GOXARCH=arm
;;
*) echo "ERROR: unknown arch '$(uname -m)'" >&2
exit 1
;;
esac; esac;
curl -sSfL \ curl -sSfL \
@ -89,8 +91,8 @@ curl -sSfL \
| tar -xz -f -; | tar -xz -f -;
sudo install -o root -g root ./zrok /usr/local/bin/; sudo install -o root -g root ./zrok /usr/local/bin/;
zrok version; zrok version;
)
``` ```
</Details> </Details>