release: Produce static binaries (#2057)
This change adds release targets for static binaries (using musl). Expected checksec outputs are split per platform, to account for cross-compiled MUSL binaries. With this change, we retain debug symbols in an separate file. So they can be loaded in a debugger. This change bumps the devcontainer to v38 to include just-cargo fixes.
This commit is contained in:
		
							parent
							
								
									194ca211b5
								
							
						
					
					
						commit
						adf06c492d
					
				| 
						 | 
				
			
			@ -1,10 +1,8 @@
 | 
			
		|||
{
 | 
			
		||||
  "canary": "yes",
 | 
			
		||||
  "fortify_source": "no",
 | 
			
		||||
  "nx": "yes",
 | 
			
		||||
  "pie": "yes",
 | 
			
		||||
  "relro": "full",
 | 
			
		||||
  "rpath": "no",
 | 
			
		||||
  "runpath": "no",
 | 
			
		||||
  "symbols": "no"
 | 
			
		||||
  "runpath": "no"
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,8 @@
 | 
			
		|||
{
 | 
			
		||||
  "canary": "yes",
 | 
			
		||||
  "nx": "yes",
 | 
			
		||||
  "pie": "yes",
 | 
			
		||||
  "relro": "full",
 | 
			
		||||
  "rpath": "no",
 | 
			
		||||
  "runpath": "no"
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,8 @@
 | 
			
		|||
{
 | 
			
		||||
  "canary": "yes",
 | 
			
		||||
  "nx": "yes",
 | 
			
		||||
  "pie": "yes",
 | 
			
		||||
  "relro": "full",
 | 
			
		||||
  "rpath": "no",
 | 
			
		||||
  "runpath": "no"
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,8 @@
 | 
			
		|||
{
 | 
			
		||||
  "canary": "yes",
 | 
			
		||||
  "nx": "yes",
 | 
			
		||||
  "pie": "no",
 | 
			
		||||
  "relro": "partial",
 | 
			
		||||
  "rpath": "no",
 | 
			
		||||
  "runpath": "no"
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,8 @@
 | 
			
		|||
{
 | 
			
		||||
  "canary": "yes",
 | 
			
		||||
  "nx": "yes",
 | 
			
		||||
  "pie": "yes",
 | 
			
		||||
  "relro": "full",
 | 
			
		||||
  "rpath": "no",
 | 
			
		||||
  "runpath": "no"
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,8 @@
 | 
			
		|||
{
 | 
			
		||||
  "canary": "yes",
 | 
			
		||||
  "nx": "yes",
 | 
			
		||||
  "pie": "no",
 | 
			
		||||
  "relro": "partial",
 | 
			
		||||
  "rpath": "no",
 | 
			
		||||
  "runpath": "no"
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
{
 | 
			
		||||
	"name": "linkerd2-proxy",
 | 
			
		||||
	"image": "ghcr.io/linkerd/dev:v37",
 | 
			
		||||
	"image": "ghcr.io/linkerd/dev:v38",
 | 
			
		||||
	"extensions": [
 | 
			
		||||
		"DavidAnson.vscode-markdownlint",
 | 
			
		||||
		"kokakiwi.vscode-just",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
FROM ghcr.io/linkerd/dev:v37-rust
 | 
			
		||||
FROM ghcr.io/linkerd/dev:v38-rust
 | 
			
		||||
RUN apt-get update && apt-get install -y --no-install-recommends jq \
 | 
			
		||||
    && rm -rf /var/lib/apt/lists/*
 | 
			
		||||
COPY entrypoint.sh /
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,7 +22,7 @@ permissions:
 | 
			
		|||
jobs:
 | 
			
		||||
  build:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    container: ghcr.io/linkerd/dev:v37-rust
 | 
			
		||||
    container: ghcr.io/linkerd/dev:v38-rust
 | 
			
		||||
    timeout-minutes: 20
 | 
			
		||||
    continue-on-error: true
 | 
			
		||||
    steps:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,7 +22,7 @@ jobs:
 | 
			
		|||
  check-all:
 | 
			
		||||
    timeout-minutes: 20
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    container: ghcr.io/linkerd/dev:v37-rust
 | 
			
		||||
    container: ghcr.io/linkerd/dev:v38-rust
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8
 | 
			
		||||
      - run: just fetch
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -49,7 +49,7 @@ jobs:
 | 
			
		|||
    needs: list-changed-crates
 | 
			
		||||
    timeout-minutes: 20
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    container: ghcr.io/linkerd/dev:v37-rust
 | 
			
		||||
    container: ghcr.io/linkerd/dev:v38-rust
 | 
			
		||||
    strategy:
 | 
			
		||||
      matrix:
 | 
			
		||||
        crate: ${{ fromJson(needs.list-changed-crates.outputs.crates) }}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,7 +23,7 @@ jobs:
 | 
			
		|||
    runs-on: ubuntu-latest
 | 
			
		||||
    timeout-minutes: 30
 | 
			
		||||
    container:
 | 
			
		||||
      image: docker://ghcr.io/linkerd/dev:v37-rust
 | 
			
		||||
      image: docker://ghcr.io/linkerd/dev:v38-rust
 | 
			
		||||
      options: --security-opt seccomp=unconfined # 🤷
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -46,7 +46,7 @@ jobs:
 | 
			
		|||
  deprecated:
 | 
			
		||||
    timeout-minutes: 20
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    container: ghcr.io/linkerd/dev:v37-rust
 | 
			
		||||
    container: ghcr.io/linkerd/dev:v38-rust
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8
 | 
			
		||||
      - run: just fetch
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,9 +15,7 @@ jobs:
 | 
			
		|||
  build:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    timeout-minutes: 20
 | 
			
		||||
    env:
 | 
			
		||||
      DOCKER_BUILDKIT: "1"
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: extractions/setup-just@95b912dc5d3ed106a72907f2f9b91e76d60bdb76
 | 
			
		||||
      - uses: linkerd/dev/actions/setup-tools@v38
 | 
			
		||||
      - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8
 | 
			
		||||
      - run: just docker
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,7 +26,7 @@ jobs:
 | 
			
		|||
  test:
 | 
			
		||||
    timeout-minutes: 20
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    container: ghcr.io/linkerd/dev:v37-rust
 | 
			
		||||
    container: ghcr.io/linkerd/dev:v38-rust
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8
 | 
			
		||||
      - run: just fetch
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,7 +21,7 @@ jobs:
 | 
			
		|||
  clippy:
 | 
			
		||||
    timeout-minutes: 10
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    container: ghcr.io/linkerd/dev:v37-rust
 | 
			
		||||
    container: ghcr.io/linkerd/dev:v38-rust
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8
 | 
			
		||||
      - run: just fetch
 | 
			
		||||
| 
						 | 
				
			
			@ -30,7 +30,7 @@ jobs:
 | 
			
		|||
  fmt:
 | 
			
		||||
    timeout-minutes: 10
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    container: ghcr.io/linkerd/dev:v37-rust
 | 
			
		||||
    container: ghcr.io/linkerd/dev:v38-rust
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8
 | 
			
		||||
      - run: just check-fmt
 | 
			
		||||
| 
						 | 
				
			
			@ -38,7 +38,7 @@ jobs:
 | 
			
		|||
  docs:
 | 
			
		||||
    timeout-minutes: 10
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    container: ghcr.io/linkerd/dev:v37-rust
 | 
			
		||||
    container: ghcr.io/linkerd/dev:v38-rust
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8
 | 
			
		||||
      - run: just fetch
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,7 +22,7 @@ permissions:
 | 
			
		|||
jobs:
 | 
			
		||||
  build:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    container: ghcr.io/linkerd/dev:v37-rust
 | 
			
		||||
    container: ghcr.io/linkerd/dev:v38-rust
 | 
			
		||||
    timeout-minutes: 20
 | 
			
		||||
    continue-on-error: true
 | 
			
		||||
    steps:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,40 +52,20 @@ jobs:
 | 
			
		|||
    strategy:
 | 
			
		||||
      matrix:
 | 
			
		||||
        arch: [amd64, arm64, arm]
 | 
			
		||||
        libc: [gnu, musl]
 | 
			
		||||
 | 
			
		||||
    # If we're not actually building on a release tag, don't short-circuit on
 | 
			
		||||
    # errors. This helps us know whether a failure is platform-specific.
 | 
			
		||||
    continue-on-error: ${{ !needs.meta.outputs.publish }}
 | 
			
		||||
    name: Package (${{ matrix.arch }})
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    timeout-minutes: 40
 | 
			
		||||
    container: docker://ghcr.io/linkerd/dev:v37-rust
 | 
			
		||||
    container: docker://ghcr.io/linkerd/dev:v38-rust-musl
 | 
			
		||||
    steps:
 | 
			
		||||
      - if: matrix.arch == 'arm64'
 | 
			
		||||
        run: |
 | 
			
		||||
          rustup target add aarch64-unknown-linux-gnu
 | 
			
		||||
          apt-get update
 | 
			
		||||
          apt-get install -y --no-install-recommends \
 | 
			
		||||
            binutils-aarch64-linux-gnu \
 | 
			
		||||
            g++-aarch64-linux-gnu \
 | 
			
		||||
            gcc-aarch64-linux-gnu \
 | 
			
		||||
            libc6-dev-arm64-cross
 | 
			
		||||
          echo CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc >> "$GITHUB_ENV"
 | 
			
		||||
 | 
			
		||||
      - if: matrix.arch == 'arm'
 | 
			
		||||
        run: |
 | 
			
		||||
          rustup target add armv7-unknown-linux-gnueabihf
 | 
			
		||||
          apt-get update
 | 
			
		||||
          apt-get install -y --no-install-recommends \
 | 
			
		||||
            binutils-arm-linux-gnueabihf \
 | 
			
		||||
            g++-arm-linux-gnueabihf \
 | 
			
		||||
            gcc-arm-linux-gnueabihf \
 | 
			
		||||
            libc6-dev-armhf-cross
 | 
			
		||||
          echo CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc >> "$GITHUB_ENV"
 | 
			
		||||
 | 
			
		||||
      - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8
 | 
			
		||||
      - run: just fetch
 | 
			
		||||
      - name: Run just package
 | 
			
		||||
        run: just profile=release package_arch=${{ matrix.arch }} package_version=${{ needs.meta.outputs.version }} package
 | 
			
		||||
      - run: just arch=${{ matrix.arch }} libc=${{ matrix.libc }} rustup
 | 
			
		||||
      - run: just arch=${{ matrix.arch }} libc=${{ matrix.libc }} profile=release build
 | 
			
		||||
      - run: just arch=${{ matrix.arch }} libc=${{ matrix.libc }} profile=release package_version=${{ needs.meta.outputs.version }} package
 | 
			
		||||
      - uses: actions/upload-artifact@83fd05a356d7e2593de66fc9913b3002723633cb
 | 
			
		||||
        with:
 | 
			
		||||
          name: ${{ matrix.arch }}-artifacts
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,7 +24,7 @@ jobs:
 | 
			
		|||
  meshtls:
 | 
			
		||||
    timeout-minutes: 10
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    container: ghcr.io/linkerd/dev:v37-rust
 | 
			
		||||
    container: ghcr.io/linkerd/dev:v38-rust
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8
 | 
			
		||||
      - run: just fetch
 | 
			
		||||
| 
						 | 
				
			
			@ -42,7 +42,7 @@ jobs:
 | 
			
		|||
  unit:
 | 
			
		||||
    timeout-minutes: 10
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    container: ghcr.io/linkerd/dev:v37-rust
 | 
			
		||||
    container: ghcr.io/linkerd/dev:v38-rust
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8
 | 
			
		||||
      - run: just fetch
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,7 +14,7 @@ permissions:
 | 
			
		|||
jobs:
 | 
			
		||||
  devcontainer:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    container: ghcr.io/linkerd/dev:v37-rust
 | 
			
		||||
    container: ghcr.io/linkerd/dev:v38-rust
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8
 | 
			
		||||
      - run: |
 | 
			
		||||
| 
						 | 
				
			
			@ -24,22 +24,6 @@ jobs:
 | 
			
		|||
            exit 1
 | 
			
		||||
          fi
 | 
			
		||||
 | 
			
		||||
  dockerfiles:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8
 | 
			
		||||
      - run: |
 | 
			
		||||
          VERSION="$(cat rust-toolchain)"
 | 
			
		||||
          ex=0
 | 
			
		||||
          while IFS= read -r file ; do
 | 
			
		||||
            versions=$(sed -nE 's/^ARG RUST_VERSION=([^ ]+)/\1/p' "$file")
 | 
			
		||||
            for mismatch in $(echo "$versions" | grep -vF "$VERSION" || true) ; do
 | 
			
		||||
              echo "::error file=$file::$file uses incorrect rust version(s): $mismatch"
 | 
			
		||||
              ex=$((ex + 1))
 | 
			
		||||
            done
 | 
			
		||||
          done < <(find . -name Dockerfile)
 | 
			
		||||
          exit $ex
 | 
			
		||||
 | 
			
		||||
  workflows:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -64,7 +64,7 @@ members = [
 | 
			
		|||
    "linkerd/transport-metrics",
 | 
			
		||||
    "linkerd2-proxy",
 | 
			
		||||
    "opencensus-proto",
 | 
			
		||||
    "tools"
 | 
			
		||||
    "tools",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
# Debug symbols end up chewing up several GB of disk space, so better to just
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										49
									
								
								Dockerfile
								
								
								
								
							
							
						
						
									
										49
									
								
								Dockerfile
								
								
								
								
							| 
						 | 
				
			
			@ -16,50 +16,39 @@
 | 
			
		|||
#
 | 
			
		||||
#     :; docker buildx build . --load
 | 
			
		||||
 | 
			
		||||
ARG RUST_VERSION=1.64.0
 | 
			
		||||
ARG RUST_IMAGE=rust:${RUST_VERSION}-bullseye
 | 
			
		||||
ARG RUST_IMAGE=ghcr.io/linkerd/dev:v38-rust
 | 
			
		||||
 | 
			
		||||
# Use an arbitrary ~recent edge release image to get the proxy
 | 
			
		||||
# identity-initializing and linkerd-await wrappers.
 | 
			
		||||
ARG RUNTIME_IMAGE=ghcr.io/linkerd/proxy:edge-22.2.1
 | 
			
		||||
ARG RUNTIME_IMAGE=ghcr.io/linkerd/proxy:edge-22.12.1
 | 
			
		||||
 | 
			
		||||
# Build the proxy, leveraging (new, experimental) cache mounting.
 | 
			
		||||
#
 | 
			
		||||
# See: https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/experimental.md#run---mounttypecache
 | 
			
		||||
FROM $RUST_IMAGE as build
 | 
			
		||||
FROM --platform=$BUILDPLATFORM $RUST_IMAGE as build
 | 
			
		||||
 | 
			
		||||
# When set, causes the proxy to be compiled in development mode.
 | 
			
		||||
ARG PROXY_UNOPTIMIZED
 | 
			
		||||
 | 
			
		||||
# Controls what features are enabled in the proxy.
 | 
			
		||||
ARG PROXY_FEATURES="multicore,meshtls-rustls"
 | 
			
		||||
 | 
			
		||||
RUN --mount=type=cache,target=/var/lib/apt/lists \
 | 
			
		||||
    --mount=type=cache,target=/var/tmp \
 | 
			
		||||
  apt update && apt install -y time
 | 
			
		||||
 | 
			
		||||
RUN --mount=type=cache,target=/var/lib/apt/lists \
 | 
			
		||||
    --mount=type=cache,target=/var/tmp \
 | 
			
		||||
  if $(echo "$PROXY_FEATURES" | grep "meshtls-boring" >/dev/null); then \
 | 
			
		||||
    apt install -y cmake clang golang ; \
 | 
			
		||||
  fi
 | 
			
		||||
ARG PROXY_FEATURES=""
 | 
			
		||||
RUN apt-get update && \
 | 
			
		||||
    apt-get install -y time && \
 | 
			
		||||
    if [[ "$PROXY_FEATURES" =~ .*meshtls-boring.* ]] ; then \
 | 
			
		||||
      apt-get install -y golang ; \
 | 
			
		||||
    fi && \
 | 
			
		||||
    rm -rf /var/lib/apt/lists/*
 | 
			
		||||
 | 
			
		||||
WORKDIR /usr/src/linkerd2-proxy
 | 
			
		||||
COPY . .
 | 
			
		||||
RUN --mount=type=cache,target=target \
 | 
			
		||||
    --mount=type=cache,from=rust:1.64.0-bullseye,source=/usr/local/cargo,target=/usr/local/cargo \
 | 
			
		||||
  mkdir -p /out && \
 | 
			
		||||
  if [ -n "$PROXY_UNOPTIMIZED" ]; then \
 | 
			
		||||
    (cd linkerd2-proxy && /usr/bin/time -v cargo build --locked --no-default-features --features="$PROXY_FEATURES") && \
 | 
			
		||||
    mv target/debug/linkerd2-proxy /out/linkerd2-proxy ; \
 | 
			
		||||
  else \
 | 
			
		||||
    (cd linkerd2-proxy && /usr/bin/time -v cargo build --locked --no-default-features --features="$PROXY_FEATURES" --release) && \
 | 
			
		||||
    mv target/release/linkerd2-proxy /out/linkerd2-proxy ; \
 | 
			
		||||
  fi
 | 
			
		||||
RUN --mount=type=cache,id=cargo,target=/usr/local/cargo/registry \
 | 
			
		||||
    just fetch
 | 
			
		||||
ARG TARGETARCH="amd64"
 | 
			
		||||
ARG PROFILE="release"
 | 
			
		||||
RUN --mount=type=cache,id=target,target=target \
 | 
			
		||||
    --mount=type=cache,id=cargo,target=/usr/local/cargo/registry \
 | 
			
		||||
    just arch=$TARGETARCH features=$PROXY_FEATURES profile=$PROFILE build && \
 | 
			
		||||
    bin=$(just --evaluate profile="$PROFILE" _target_bin) ; \
 | 
			
		||||
    mkdir -p /out && mv $bin /out/linkerd2-proxy
 | 
			
		||||
 | 
			
		||||
## Install the proxy binary into the base runtime image.
 | 
			
		||||
FROM $RUNTIME_IMAGE as runtime
 | 
			
		||||
 | 
			
		||||
WORKDIR /linkerd
 | 
			
		||||
COPY --from=build /out/linkerd2-proxy /usr/lib/linkerd/linkerd2-proxy
 | 
			
		||||
ENV LINKERD2_PROXY_LOG=warn,linkerd=info
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										89
									
								
								justfile
								
								
								
								
							
							
						
						
									
										89
									
								
								justfile
								
								
								
								
							| 
						 | 
				
			
			@ -12,7 +12,6 @@ export PROTOC_NO_VENDOR := "1"
 | 
			
		|||
# By default we compile in development mode mode because it's faster.
 | 
			
		||||
profile := if env_var_or_default("RELEASE", "") == "" { "debug" } else { "release" }
 | 
			
		||||
toolchain := ""
 | 
			
		||||
_cargo := "just-cargo profile=" + profile + " toolchain=" + toolchain
 | 
			
		||||
 | 
			
		||||
features := ""
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -25,25 +24,28 @@ docker_tag := `git rev-parse --abbrev-ref HEAD | sed 's|/|.|'` + "." + `git rev-
 | 
			
		|||
docker_image := docker_repo + ":" + docker_tag
 | 
			
		||||
 | 
			
		||||
# The architecture name to use for packages. Either 'amd64', 'arm64', or 'arm'.
 | 
			
		||||
package_arch := "amd64"
 | 
			
		||||
arch := "amd64"
 | 
			
		||||
 | 
			
		||||
# If a `package_arch` is specified, then we change the default cargo `--target`
 | 
			
		||||
libc := 'gnu'
 | 
			
		||||
 | 
			
		||||
# If a `arch` is specified, then we change the default cargo `--target`
 | 
			
		||||
# to support cross-compilation. Otherwise, we use `rustup` to find the default.
 | 
			
		||||
cargo_target := if package_arch == "arm64" {
 | 
			
		||||
        "aarch64-unknown-linux-gnu"
 | 
			
		||||
    } else if package_arch == "arm" {
 | 
			
		||||
        "armv7-unknown-linux-gnueabihf"
 | 
			
		||||
_target := if arch == 'amd64' {
 | 
			
		||||
        "x86_64-unknown-linux-" + libc
 | 
			
		||||
    } else if arch == "arm64" {
 | 
			
		||||
        "aarch64-unknown-linux-" + libc
 | 
			
		||||
    } else if arch == "arm" {
 | 
			
		||||
        "armv7-unknown-linux-" + libc + "eabihf"
 | 
			
		||||
    } else {
 | 
			
		||||
        `rustup show | sed -n 's/^Default host: \(.*\)/\1/p'`
 | 
			
		||||
        error("unsupported arch=" + arch)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
# Support cross-compilation when `package_arch` changes.
 | 
			
		||||
strip := if package_arch == "arm64" { "aarch64-linux-gnu-strip" } else if package_arch == "arm" { "arm-linux-gnueabihf-strip" } else { "strip" }
 | 
			
		||||
_cargo := 'just-cargo profile=' + profile + ' target=' + _target + ' toolchain=' + toolchain
 | 
			
		||||
 | 
			
		||||
target_dir := join("target", cargo_target, profile)
 | 
			
		||||
target_bin := join(target_dir, "linkerd2-proxy")
 | 
			
		||||
package_name := "linkerd2-proxy-" + package_version + "-" + package_arch
 | 
			
		||||
package_dir := join("target/package", package_name)
 | 
			
		||||
_target_dir := "target" / _target / profile
 | 
			
		||||
_target_bin := _target_dir / "linkerd2-proxy"
 | 
			
		||||
_package_name := "linkerd2-proxy-" + package_version + "-" + arch + if libc == 'musl' { '-static' } else { '' }
 | 
			
		||||
_package_dir := "target/package" / _package_name
 | 
			
		||||
shasum := "shasum -a 256"
 | 
			
		||||
 | 
			
		||||
_features := if features == "all" {
 | 
			
		||||
| 
						 | 
				
			
			@ -56,6 +58,9 @@ _features := if features == "all" {
 | 
			
		|||
# Recipes
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
rustup:
 | 
			
		||||
    @{{ _cargo }} _target-installed
 | 
			
		||||
 | 
			
		||||
# Run all lints
 | 
			
		||||
lint: sh-lint md-lint clippy doc action-lint action-dev-check
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -106,27 +111,40 @@ test-dir dir *flags:
 | 
			
		|||
    cd {{ dir }} && {{ _cargo }} test --frozen {{ _features }} {{ flags }}
 | 
			
		||||
 | 
			
		||||
# Build the proxy
 | 
			
		||||
build:
 | 
			
		||||
    @{{ _cargo }} build --frozen --package=linkerd2-proxy --target={{ cargo_target }} {{ _features }}
 | 
			
		||||
build: && checksec _strip
 | 
			
		||||
    @rm -f {{ _target_bin }} {{ _target_bin }}.dbg
 | 
			
		||||
    @{{ _cargo }} build --frozen --package=linkerd2-proxy {{ _features }}
 | 
			
		||||
 | 
			
		||||
_package_bin := package_dir / "bin" / "linkerd2-proxy"
 | 
			
		||||
_strip:
 | 
			
		||||
    {{ _objcopy }} --only-keep-debug {{ _target_bin }} {{ _target_bin }}.dbg
 | 
			
		||||
    {{ _objcopy }} --strip-unneeded {{ _target_bin }}
 | 
			
		||||
    {{ _objcopy }} --add-gnu-debuglink={{ _target_bin }}.dbg {{ _target_bin }}
 | 
			
		||||
 | 
			
		||||
_package_bin := _package_dir / "bin" / "linkerd2-proxy"
 | 
			
		||||
 | 
			
		||||
# XXX {aarch64,arm}-musl builds do not enable PIE, so we use target-specific
 | 
			
		||||
# files to document those differences.
 | 
			
		||||
_expected_checksec := '.checksec' / arch + '-' + libc + '.json'
 | 
			
		||||
 | 
			
		||||
# Check the security properties of the proxy binary.
 | 
			
		||||
checksec:
 | 
			
		||||
    checksec --output=json --file='{{ _target_bin }}' \
 | 
			
		||||
        | jq '.' | tee /dev/stderr \
 | 
			
		||||
        | jq -S '.[] | del(."fortify_source") | del(."fortify-able") | del(.fortified) | del(.symbols)' \
 | 
			
		||||
        | diff -u {{ _expected_checksec }} - >&2
 | 
			
		||||
 | 
			
		||||
_objcopy := 'llvm-objcopy-' + `just-cargo --evaluate _llvm-version`
 | 
			
		||||
 | 
			
		||||
# Build a package (i.e. for a release)
 | 
			
		||||
package: build
 | 
			
		||||
    mkdir -p {{ package_dir }}/bin
 | 
			
		||||
    cp LICENSE {{ package_dir }}/
 | 
			
		||||
    cp {{ target_dir }}/linkerd2-proxy {{ _package_bin }}
 | 
			
		||||
    {{ strip }} {{ _package_bin }}
 | 
			
		||||
    checksec --output=json --file='{{ _package_bin }}' \
 | 
			
		||||
        | jq '.["{{ _package_bin }}"] | del(."fortify-able") | del(.fortified)' \
 | 
			
		||||
        > target/package/{{ package_name }}-checksec.json
 | 
			
		||||
    jq -S '.'  target/package/{{ package_name }}-checksec.json \
 | 
			
		||||
        | diff -u .checksec-expected.json - >&2
 | 
			
		||||
    cd target/package \
 | 
			
		||||
        && (tar -czvf {{ package_name }}.tar.gz {{ package_name }} >/dev/null) \
 | 
			
		||||
        && ({{ shasum }} {{ package_name }}.tar.gz > {{ package_name }}.txt)
 | 
			
		||||
    @rm -rf {{ package_dir }}
 | 
			
		||||
    @du -h target/package/{{ package_name }}*
 | 
			
		||||
    @mkdir -p {{ _package_dir }}/bin
 | 
			
		||||
    cp LICENSE {{ _package_dir }}/
 | 
			
		||||
    cp {{ _target_bin }} {{ _target_bin }}.dbg {{ _package_dir }}/
 | 
			
		||||
    tar -czvf target/package/{{ _package_name }}.tar.gz  -C target/package {{ _package_name }} >/dev/null
 | 
			
		||||
    cd target/package && ({{ shasum }} {{ _package_name }}.tar.gz | tee {{ _package_name }}.txt)
 | 
			
		||||
    @rm -rf {{ _package_dir }}
 | 
			
		||||
    @du -h target/package/{{ _package_name }}.tar.gz
 | 
			
		||||
    @tar tzvf target/package/{{ _package_name }}.tar.gz
 | 
			
		||||
 | 
			
		||||
# Build all of the fuzzers (SLOW).
 | 
			
		||||
fuzzers:
 | 
			
		||||
| 
						 | 
				
			
			@ -141,18 +159,19 @@ fuzzers:
 | 
			
		|||
        echo "cd $dir && {{ _cargo }} fuzz build"
 | 
			
		||||
        (
 | 
			
		||||
            cd $dir
 | 
			
		||||
            @{{ _cargo }} fuzz build --target={{ cargo_target }} \
 | 
			
		||||
            @{{ _cargo }} fuzz build \
 | 
			
		||||
                {{ if profile == "release" { "--release" } else { "" } }}
 | 
			
		||||
        )
 | 
			
		||||
    done
 | 
			
		||||
 | 
			
		||||
# Build a docker image (FOR TESTING ONLY)
 | 
			
		||||
docker mode='load':
 | 
			
		||||
docker *args='--output=type=docker':
 | 
			
		||||
    docker buildx build . \
 | 
			
		||||
        --pull \
 | 
			
		||||
        --tag={{ docker_image }} \
 | 
			
		||||
        {{ if profile != 'release' { "--build-arg PROXY_UNOPTIMIZED=1" } else { "" } }} \
 | 
			
		||||
        --build-arg PROFILE='{{ profile }}' \
 | 
			
		||||
        {{ if features != "" { "--build-arg PROXY_FEATURES=" + features } else { "" } }} \
 | 
			
		||||
        {{ if mode == 'push' { "--push" } else { "--load" } }}
 | 
			
		||||
        {{ args }}
 | 
			
		||||
 | 
			
		||||
# Lints all shell scripts in the repo.
 | 
			
		||||
sh-lint:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue