diff --git a/.github/workflows/build_libtestoptimization.yml b/.github/workflows/build_libtestoptimization.yml index 86132a7..576de01 100644 --- a/.github/workflows/build_libtestoptimization.yml +++ b/.github/workflows/build_libtestoptimization.yml @@ -99,8 +99,11 @@ jobs: cp -rf ./native/* external/internal/civisibility/native/ - name: Build and run linux-arm64 run: | - docker buildx build --platform linux/arm64 --build-arg GOARCH=arm64 --build-arg FILE_NAME=linux-arm64-libtestoptimization -t libtestoptimization-builder:arm64 -f ./Dockerfile ../../.. --load - docker run --rm -v ./output:/libtestoptimization libtestoptimization-builder:arm64 + docker buildx build --platform linux/arm64 --build-arg GOARCH=arm64 --build-arg FILE_NAME=linux-arm64-libtestoptimization -t libtestoptimization-builder-static:arm64 -f ./Dockerfile-static ../../.. --load + docker run --rm -v ./output:/libtestoptimization libtestoptimization-builder-static:arm64 + + docker buildx build --platform linux/arm64 --build-arg GOARCH=arm64 --build-arg FILE_NAME=linux-arm64-libtestoptimization -t libtestoptimization-builder-dynamic:arm64 -f ./Dockerfile-dynamic ../../.. --load + docker run --rm -v ./output:/libtestoptimization libtestoptimization-builder-dynamic:arm64 working-directory: external/internal/civisibility/native - name: Upload artifact uses: actions/upload-artifact@v4 @@ -130,8 +133,11 @@ jobs: cp -rf ./native/* external/internal/civisibility/native/ - name: Build and run linux-amd64 run: | - docker build --platform linux/amd64 --build-arg GOARCH=amd64 --build-arg FILE_NAME=linux-x64-libtestoptimization -t libtestoptimization-builder:amd64 -f ./Dockerfile ../../.. - docker run --rm -v ./output:/libtestoptimization libtestoptimization-builder:amd64 + docker build --platform linux/amd64 --build-arg GOARCH=amd64 --build-arg FILE_NAME=linux-x64-libtestoptimization -t libtestoptimization-builder-static:amd64 -f ./Dockerfile-static ../../.. + docker run --rm -v ./output:/libtestoptimization libtestoptimization-builder-static:amd64 + + docker build --platform linux/amd64 --build-arg GOARCH=amd64 --build-arg FILE_NAME=linux-x64-libtestoptimization -t libtestoptimization-builder-dynamic:amd64 -f ./Dockerfile-dynamic ../../.. + docker run --rm -v ./output:/libtestoptimization libtestoptimization-builder-dynamic:amd64 working-directory: external/internal/civisibility/native - name: Build and run android-arm64 run: | diff --git a/build/Dockerfile-android b/build/Dockerfile-android index f2399af..2611115 100644 --- a/build/Dockerfile-android +++ b/build/Dockerfile-android @@ -1,5 +1,5 @@ # Stage 1: Build the static library -FROM golang:1 AS builder +FROM golang:1-bullseye AS builder # Install dependencies RUN apt-get update && apt search openjdk && apt-get install -y gcc musl-tools build-essential devscripts openjdk-17-jdk diff --git a/build/Dockerfile b/build/Dockerfile-dynamic similarity index 71% rename from build/Dockerfile rename to build/Dockerfile-dynamic index aa8e567..7091a30 100644 --- a/build/Dockerfile +++ b/build/Dockerfile-dynamic @@ -1,5 +1,5 @@ # Stage 1: Build the static library -FROM golang:1.24.1-bookworm AS builder +FROM golang:1-bullseye AS builder # Install dependencies RUN apt-get update && apt-get install -y gcc binutils @@ -23,8 +23,6 @@ COPY . . WORKDIR /app/internal/civisibility/native # Build the library -RUN go build -tags civisibility_native -buildmode=c-archive -ldflags="-s -w" -gcflags="all=-l" -o ./output/static/libtestoptimization.a *.go -RUN strip --strip-unneeded ./output/static/libtestoptimization.a RUN go build -tags civisibility_native -buildmode=c-shared -ldflags="-s -w" -gcflags="all=-l" -o ./output/dynamic/libtestoptimization.so *.go RUN strip --strip-unneeded ./output/dynamic/libtestoptimization.so @@ -41,19 +39,15 @@ RUN apk add --no-cache zip RUN mkdir -p /output # Copy the static library and header from the builder stage -COPY --from=builder /app/internal/civisibility/native/output/static/libtestoptimization.a /output/static/libtestoptimization.a -COPY --from=builder /app/internal/civisibility/native/output/static/libtestoptimization.h /output/static/libtestoptimization.h COPY --from=builder /app/internal/civisibility/native/output/dynamic/libtestoptimization.so /output/dynamic/libtestoptimization.so COPY --from=builder /app/internal/civisibility/native/output/dynamic/libtestoptimization.h /output/dynamic/libtestoptimization.h # Compress both files into zip archives -RUN cd /output/static && zip -j -9 ../${FILE_NAME}-static.zip *.* RUN cd /output/dynamic && zip -j -9 ../${FILE_NAME}-dynamic.zip *.* # Create a SHA256 checksum file for the archive -RUN sha256sum /output/${FILE_NAME}-static.zip > /output/${FILE_NAME}-static.zip.sha256sum RUN sha256sum /output/${FILE_NAME}-dynamic.zip > /output/${FILE_NAME}-dynamic.zip.sha256sum -RUN rm -r /output/static /output/dynamic +RUN rm -r /output/dynamic # Command to run when the container starts -ENTRYPOINT ["sh", "-c", "ls /output && cp /output/*.* /libtestoptimization && echo 'Static library copied.'"] +ENTRYPOINT ["sh", "-c", "ls /output && cp /output/*.* /libtestoptimization && echo 'Dynamic library copied.'"] diff --git a/build/Dockerfile-static b/build/Dockerfile-static new file mode 100644 index 0000000..36908d5 --- /dev/null +++ b/build/Dockerfile-static @@ -0,0 +1,79 @@ +# Stage 1: Build the static library using musl (Alpine) +FROM golang:1-alpine AS builder + +# Install dependencies for the static build with musl and cgo +RUN apk add --no-cache gcc musl-dev build-base + +# Allow changing the architecture during the build if needed +ARG GOARCH=amd64 +# Option to link libresolv explicitly for arm64, set to "true" or "false" at build time. +ARG LINK_LIBRESOLV=false + +# Configure environment variables for compilation +ENV CGO_ENABLED=1 \ + GOOS=linux \ + GOARCH=$GOARCH \ + # Default CC for amd64 (para arm64 se cambiará más abajo) + CC="gcc -static" \ + CGO_CFLAGS="-O2 -s -DNDEBUG -fdata-sections -ffunction-sections" \ + CGO_LDFLAGS="-static -s -Wl,--gc-sections" + +# Set working directory +WORKDIR /app + +# Copy all code to the container +COPY . . + +# Change to the directory where the code to compile is located +WORKDIR /app/internal/civisibility/native + +# Conditional compilation based on architecture and linking option +RUN if [ "$GOARCH" = "arm64" ]; then \ + echo "Compilando para arm64 usando musl-gcc -static"; \ + export CC="musl-gcc -static"; \ + if [ "$LINK_LIBRESOLV" = "true" ]; then \ + EXTRA="-lresolv"; \ + else \ + EXTRA=""; \ + fi; \ + echo "Flags extra del linker: $EXTRA"; \ + go build -tags "civisibility_native netgo" -buildmode=c-archive \ + -ldflags="-extldflags '-static $EXTRA' -s -w" \ + -o ./output/static/libtestoptimization.a *.go; \ + else \ + echo "Compilando para amd64"; \ + go build -tags "civisibility_native netgo" -buildmode=c-archive \ + -ldflags="-extldflags '-static' -s -w" \ + -o ./output/static/libtestoptimization.a *.go; \ + fi + +# Optimizar la librería eliminando símbolos innecesarios +RUN strip --strip-unneeded ./output/static/libtestoptimization.a + +# Stage 2: Package the library +FROM alpine:latest + +# Rename the final file using build args +ARG FILE_NAME=libtestoptimization + +# Install zip to compress the files +RUN apk add --no-cache zip + +# Create the output directory +RUN mkdir -p /output/static + +# Copy the library and header from the builder stage +COPY --from=builder /app/internal/civisibility/native/output/static/libtestoptimization.a /output/static/libtestoptimization.a +COPY --from=builder /app/internal/civisibility/native/output/static/libtestoptimization.h /output/static/libtestoptimization.h + +# Compress the library and header in a zip archive +RUN cd /output/static && zip -j -9 ../${FILE_NAME}-static.zip *.* + +# Create a SHA256 checksum file for the zip to verify integrity +RUN sha256sum /output/${FILE_NAME}-static.zip > /output/${FILE_NAME}-static.zip.sha256sum + +# Clean up intermediate files +RUN rm -r /output/static + +# When the container starts, list the content and copy the files to a destination directory +ENTRYPOINT ["sh", "-c", "ls /output && cp /output/*.* /libtestoptimization && echo 'Static library copied.'"]