From d2d6fd1f559e650a61c46217cba333323c5621dc Mon Sep 17 00:00:00 2001 From: Sean Breen Date: Fri, 19 Sep 2025 12:18:47 +0100 Subject: [PATCH 1/4] reduce packaging time by building only two binaries --- .nfpm.amd64.yaml | 60 ++++++++++++++++++++++++++++++++++++++++++++++ .nfpm.arm64.yaml | 60 ++++++++++++++++++++++++++++++++++++++++++++++ .nfpm.yaml | 2 +- Makefile.packaging | 42 ++++++++++++++++---------------- 4 files changed, 143 insertions(+), 21 deletions(-) create mode 100644 .nfpm.amd64.yaml create mode 100644 .nfpm.arm64.yaml diff --git a/.nfpm.amd64.yaml b/.nfpm.amd64.yaml new file mode 100644 index 000000000..8d7d1e085 --- /dev/null +++ b/.nfpm.amd64.yaml @@ -0,0 +1,60 @@ +# this is the base "template" for the package +name: nginx-agent +description: NGINX Agent +arch: amd64 +version: ${VERSION} +priority: optional +vendor: NGINX Software, Inc. +maintainer: NGINX Inc. +homepage: https://github.com/nginx/agent +license: Apache 2.0 +contents: + - src: ./build/amd64/nginx-agent + dst: /usr/bin/nginx-agent + - src: nginx-agent.conf + dst: /etc/nginx-agent/nginx-agent.conf + type: config|noreplace + file_info: + mode: 0640 + - src: ./scripts/packages/nginx-agent.service + dst: /etc/systemd/system/nginx-agent.service + - src: ./scripts/packages/nginx-agent.openrc + dst: /etc/init.d/nginx-agent + packager: apk + - src: ./scripts/nginx-agent.logrotate + dst: /etc/logrotate.d/nginx-agent + - src: ./scripts/selinux/nginx_agent_selinux.8 + dst: /usr/share/man/man8/nginx_agent_selinux.8 + packager: rpm + - src: ./scripts/selinux/nginx_agent.if + dst: /usr/share/selinux/devel/include/contrib/nginx_agent.if + packager: rpm + - src: ./scripts/selinux/nginx_agent.pp + dst: /usr/share/selinux/packages/nginx_agent.pp + packager: rpm + - dst: /var/log/nginx-agent + type: dir + - dst: /var/lib/nginx-agent + type: dir +overrides: + deb: + depends: + - apt-transport-https +#deb: +# signature: +# method: dpkg-sig +# key_file: ".key.asc" +#rpm: +# signature: +# key_file: ".key.asc" +apk: +# signature: +# key_file: ".key.rsa" + scripts: + preupgrade: "./scripts/packages/preinstall.sh" + postupgrade: "./scripts/packages/postinstall.sh" +scripts: + preinstall: "./scripts/packages/preinstall.sh" + postinstall: "./scripts/packages/postinstall.sh" + preremove: "./scripts/packages/preremove.sh" + postremove: "./scripts/packages/postremove.sh" diff --git a/.nfpm.arm64.yaml b/.nfpm.arm64.yaml new file mode 100644 index 000000000..20d635efd --- /dev/null +++ b/.nfpm.arm64.yaml @@ -0,0 +1,60 @@ +# this is the base "template" for the package +name: nginx-agent +description: NGINX Agent +arch: arm64 +version: ${VERSION} +priority: optional +vendor: NGINX Software, Inc. +maintainer: NGINX Inc. +homepage: https://github.com/nginx/agent +license: Apache 2.0 +contents: + - src: ./build/arm64/nginx-agent + dst: /usr/bin/nginx-agent + - src: nginx-agent.conf + dst: /etc/nginx-agent/nginx-agent.conf + type: config|noreplace + file_info: + mode: 0640 + - src: ./scripts/packages/nginx-agent.service + dst: /etc/systemd/system/nginx-agent.service + - src: ./scripts/packages/nginx-agent.openrc + dst: /etc/init.d/nginx-agent + packager: apk + - src: ./scripts/nginx-agent.logrotate + dst: /etc/logrotate.d/nginx-agent + - src: ./scripts/selinux/nginx_agent_selinux.8 + dst: /usr/share/man/man8/nginx_agent_selinux.8 + packager: rpm + - src: ./scripts/selinux/nginx_agent.if + dst: /usr/share/selinux/devel/include/contrib/nginx_agent.if + packager: rpm + - src: ./scripts/selinux/nginx_agent.pp + dst: /usr/share/selinux/packages/nginx_agent.pp + packager: rpm + - dst: /var/log/nginx-agent + type: dir + - dst: /var/lib/nginx-agent + type: dir +overrides: + deb: + depends: + - apt-transport-https +#deb: +# signature: +# method: dpkg-sig +# key_file: ".key.asc" +#rpm: +# signature: +# key_file: ".key.asc" +apk: +# signature: +# key_file: ".key.rsa" + scripts: + preupgrade: "./scripts/packages/preinstall.sh" + postupgrade: "./scripts/packages/postinstall.sh" +scripts: + preinstall: "./scripts/packages/preinstall.sh" + postinstall: "./scripts/packages/postinstall.sh" + preremove: "./scripts/packages/preremove.sh" + postremove: "./scripts/packages/postremove.sh" diff --git a/.nfpm.yaml b/.nfpm.yaml index ece9110c1..f8a4ac256 100644 --- a/.nfpm.yaml +++ b/.nfpm.yaml @@ -1,7 +1,7 @@ # this is the base "template" for the package name: nginx-agent description: NGINX Agent -arch: ${ARCH} +arch: ${ARCH} # Duplicate this file to create .nfpm.amd64.yaml and .nfpm.arm64.yaml with amd64/arm64 values version: ${VERSION} priority: optional vendor: NGINX Software, Inc. diff --git a/Makefile.packaging b/Makefile.packaging index 7f09250af..1d2720b93 100644 --- a/Makefile.packaging +++ b/Makefile.packaging @@ -35,70 +35,72 @@ $(PACKAGES_DIR): @mkdir -p $(PACKAGES_DIR)/deb && mkdir -p $(PACKAGES_DIR)/rpm && mkdir -p $(PACKAGES_DIR)/apk .PHONY: package -package: gpg-key $(PACKAGES_DIR) #### Create final packages for all supported distros +package: $(PACKAGES_DIR) #### Create final packages for all supported distros + + # Build binaries for both amd64 and arm64 + for arch in $(DEB_ARCHS); do \ + mkdir -p $(BUILD_DIR)/$${arch}; \ + GOWORK=off CGO_ENABLED=0 GOARCH=$${arch} GOOS=linux \ + go build -pgo=auto -ldflags=${LDFLAGS} \ + -o $(BUILD_DIR)/$${arch}/$(BINARY_NAME) \ + $(PROJECT_DIR)/$(PROJECT_FILE); \ + done; \ + + find $(BUILD_DIR) -type f -name $(BINARY_NAME) -exec cp {} $(BINARY_PATH) \;; \ + # Create deb packages - @for arch in $(DEB_ARCHS); do \ - GOWORK=off CGO_ENABLED=0 GOARCH=$${arch} GOOS=linux go build -pgo=auto -ldflags=${LDFLAGS} -o $(BINARY_PATH) $(PROJECT_DIR)/$(PROJECT_FILE); \ + for arch in $(DEB_ARCHS); do \ for distro in $(DEB_DISTROS); do \ deb_codename=`echo $$distro | cut -d- -f 2`; \ - VERSION=$(PACKAGE_VERSION)~$${deb_codename} ARCH=$${arch} nfpm pkg --config .nfpm.yaml --packager deb --target ${PACKAGES_DIR}/deb/${PACKAGE_PREFIX}_$(PACKAGE_VERSION)~$${deb_codename}_$${arch}.deb; \ + VERSION=$(PACKAGE_VERSION)~$${deb_codename} nfpm pkg --config .nfpm.$$arch.yaml --packager deb --target ${PACKAGES_DIR}/deb/${PACKAGE_PREFIX}_$(PACKAGE_VERSION)~$${deb_codename}_$${arch}.deb; \ done; \ - rm -rf $(BINARY_PATH); \ done; \ # Create rpm packages - @GOWORK=off CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build -pgo=auto -ldflags=${LDFLAGS} -o $(BINARY_PATH) $(PROJECT_DIR)/$(PROJECT_FILE) - @for distro in $(RPM_DISTROS); do \ + for distro in $(RPM_DISTROS); do \ rpm_distro=`echo $$distro | cut -d- -f 1`; \ rpm_major=`echo $$distro | cut -d- -f 2`; \ rpm_codename='na'; \ if [ "$$rpm_distro" = "suse" ]; then rpm_codename="sles$$rpm_major"; \ fi; \ if [ "$$rpm_codename" != "na" ]; then \ - VERSION=$(PACKAGE_VERSION) ARCH=amd64 nfpm pkg --config .nfpm.yaml --packager rpm --target $(PACKAGES_DIR)/rpm/${PACKAGE_PREFIX}-$(PACKAGE_VERSION).$${rpm_codename}.ngx.${RPM_ARCH}.rpm; \ + VERSION=$(PACKAGE_VERSION) ARCH=amd64 nfpm pkg --config .nfpm.amd64.yaml --packager rpm --target $(PACKAGES_DIR)/rpm/${PACKAGE_PREFIX}-$(PACKAGE_VERSION).$${rpm_codename}.ngx.${RPM_ARCH}.rpm; \ fi; \ done; \ - rm -rf $(BINARY_PATH) # Create redhat rpm packages - @for arch in $(REDHAT_ARCHS); do \ + for arch in $(REDHAT_ARCHS); do \ goarch=amd64; \ if [ "$$arch" = "aarch64" ]; then goarch="arm64"; fi; \ - GOWORK=off CGO_ENABLED=0 GOARCH=$${goarch} GOOS=linux go build -pgo=auto -ldflags=${LDFLAGS} -o $(BINARY_PATH) $(PROJECT_DIR)/$(PROJECT_FILE); \ for distro in $(REDHAT_VERSIONS); do \ rpm_distro=`echo $$distro | cut -d- -f 1`; \ rpm_major=`echo $$distro | cut -d- -f 2`; \ rpm_codename="el$$rpm_major"; \ - VERSION=$(PACKAGE_VERSION) ARCH=$${arch} nfpm pkg --config .nfpm.yaml --packager rpm --target $(PACKAGES_DIR)/rpm/${PACKAGE_PREFIX}-$(PACKAGE_VERSION).$${rpm_codename}.ngx.$${arch}.rpm; \ + VERSION=$(PACKAGE_VERSION) ARCH=$${arch} nfpm pkg --config .nfpm.$$goarch.yaml --packager rpm --target $(PACKAGES_DIR)/rpm/${PACKAGE_PREFIX}-$(PACKAGE_VERSION).$${rpm_codename}.ngx.$${arch}.rpm; \ done; \ - rm -rf $(BINARY_PATH); \ done; \ # Create amazon rpm packages - @for arch in $(AMAZON_ARCHS); do \ + for arch in $(AMAZON_ARCHS); do \ goarch=amd64; \ if [ "$$arch" = "aarch64" ]; then goarch="arm64"; fi; \ - GOWORK=off CGO_ENABLED=0 GOARCH=$${goarch} GOOS=linux go build -pgo=auto -ldflags=${LDFLAGS} -o $(BINARY_PATH) $(PROJECT_DIR)/$(PROJECT_FILE); \ for version in $(AMAZON_VERSIONS); do \ rpm_major=`echo $$version | cut -d- -f 2`; \ rpm_codename="amzn$$rpm_major";\ - VERSION=$(PACKAGE_VERSION) ARCH=$${arch} nfpm pkg --config .nfpm.yaml --packager rpm --target $(PACKAGES_DIR)/rpm/${PACKAGE_PREFIX}-$(PACKAGE_VERSION).$${rpm_codename}.ngx.$${arch}.rpm; \ + VERSION=$(PACKAGE_VERSION) ARCH=$${arch} nfpm pkg --config .nfpm.$$goarch.yaml --packager rpm --target $(PACKAGES_DIR)/rpm/${PACKAGE_PREFIX}-$(PACKAGE_VERSION).$${rpm_codename}.ngx.$${arch}.rpm; \ done; \ - rm -rf $(BINARY_PATH); \ done; \ # Create apk packages @for arch in $(APK_ARCHS); do \ goarch=amd64; \ if [ "$$arch" = "aarch64" ]; then goarch="arm64"; fi; \ - GOWORK=off CGO_ENABLED=0 GOARCH=$${goarch} GOOS=linux go build -pgo=auto -ldflags=${LDFLAGS} -o $(BINARY_PATH) $(PROJECT_DIR)/$(PROJECT_FILE); \ for version in $(APK_VERSIONS); do \ if [ ! -d "$(PACKAGES_DIR)/apk/v$${version}/$${arch}" ]; then mkdir -p $(PACKAGES_DIR)/apk/v$${version}/$${arch}; fi; \ - VERSION=$(PACKAGE_VERSION) ARCH=$${arch} nfpm pkg --config .nfpm.yaml --packager apk --target $(PACKAGES_DIR)/apk/v$${version}/$${arch}/${PACKAGE_PREFIX}-$(PACKAGE_VERSION).apk; \ + VERSION=$(PACKAGE_VERSION) ARCH=$${arch} nfpm pkg --config .nfpm.$$goarch.yaml --packager apk --target $(PACKAGES_DIR)/apk/v$${version}/$${arch}/${PACKAGE_PREFIX}-$(PACKAGE_VERSION).apk; \ done; \ - rm -rf $(BINARY_PATH); \ done; \ # Package build complete From 51d031e642f32f731304efa73040ee06dbfe1b7a Mon Sep 17 00:00:00 2001 From: Sean Breen Date: Fri, 26 Sep 2025 17:52:16 +0100 Subject: [PATCH 2/4] use pushd --- Makefile.packaging | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.packaging b/Makefile.packaging index 1d2720b93..2a4270aa2 100644 --- a/Makefile.packaging +++ b/Makefile.packaging @@ -113,7 +113,7 @@ package: $(PACKAGES_DIR) #### Create final packages for all supported distros find $(PACKAGES_DIR)/apk ;\ # Create tarball containing all packages - cd $(PACKAGES_DIR) && tar -czvf "./$(TARBALL_NAME)" * && cd ../..; \ + pushd $(PACKAGES_DIR) && tar -czvf "./$(TARBALL_NAME)" * && popd; \ .PHONY: gpg-key gpg-key: ## Generate GPG public key From 8512685d22aee5257c17cf8ea104e20be0f88fba Mon Sep 17 00:00:00 2001 From: Sean Breen Date: Tue, 30 Sep 2025 13:12:35 +0100 Subject: [PATCH 3/4] tidy up console output --- Makefile.packaging | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Makefile.packaging b/Makefile.packaging index 2a4270aa2..e73afd627 100644 --- a/Makefile.packaging +++ b/Makefile.packaging @@ -46,7 +46,8 @@ package: $(PACKAGES_DIR) #### Create final packages for all supported distros $(PROJECT_DIR)/$(PROJECT_FILE); \ done; \ - find $(BUILD_DIR) -type f -name $(BINARY_NAME) -exec cp {} $(BINARY_PATH) \;; \ + @echo "Built binaries:"; \ + find $(BUILD_DIR) -type f -name $(BINARY_NAME) \ # Create deb packages for arch in $(DEB_ARCHS); do \ @@ -104,15 +105,16 @@ package: $(PACKAGES_DIR) #### Create final packages for all supported distros done; \ # Package build complete - echo "DEB packages:"; \ - find $(PACKAGES_DIR)/deb ;\ + find $(PACKAGES_DIR)/deb -type f | grep -E "${BINARY_NAME}[-_]${PACKAGE_VERSION}" | sort; \ echo "RPM packages:"; \ - find $(PACKAGES_DIR)/rpm ;\ + find $(PACKAGES_DIR)/rpm -type f | grep -E "${BINARY_NAME}[-_]${PACKAGE_VERSION}" | sort; \ echo "APK packages:"; \ - find $(PACKAGES_DIR)/apk ;\ + find $(PACKAGES_DIR)/apk -type f | grep -E "${BINARY_NAME}[-_]${PACKAGE_VERSION}" | sort; \ # Create tarball containing all packages + @echo "Creating tarball: $(TARBALL_NAME)"; \ + rm -f $(PACKAGES_DIR)/$(TARBALL_NAME); \ pushd $(PACKAGES_DIR) && tar -czvf "./$(TARBALL_NAME)" * && popd; \ .PHONY: gpg-key From f6b404a54d73454e2830550a60c4e19eaede6bc8 Mon Sep 17 00:00:00 2001 From: Sean Breen Date: Tue, 30 Sep 2025 13:37:44 +0100 Subject: [PATCH 4/4] perform string substitution when creating files for release packaging --- .nfpm.amd64.yaml | 60 ---------------------------------------------- .nfpm.arm64.yaml | 60 ---------------------------------------------- .nfpm.yaml | 2 +- Makefile.packaging | 3 +++ 4 files changed, 4 insertions(+), 121 deletions(-) delete mode 100644 .nfpm.amd64.yaml delete mode 100644 .nfpm.arm64.yaml diff --git a/.nfpm.amd64.yaml b/.nfpm.amd64.yaml deleted file mode 100644 index 8d7d1e085..000000000 --- a/.nfpm.amd64.yaml +++ /dev/null @@ -1,60 +0,0 @@ -# this is the base "template" for the package -name: nginx-agent -description: NGINX Agent -arch: amd64 -version: ${VERSION} -priority: optional -vendor: NGINX Software, Inc. -maintainer: NGINX Inc. -homepage: https://github.com/nginx/agent -license: Apache 2.0 -contents: - - src: ./build/amd64/nginx-agent - dst: /usr/bin/nginx-agent - - src: nginx-agent.conf - dst: /etc/nginx-agent/nginx-agent.conf - type: config|noreplace - file_info: - mode: 0640 - - src: ./scripts/packages/nginx-agent.service - dst: /etc/systemd/system/nginx-agent.service - - src: ./scripts/packages/nginx-agent.openrc - dst: /etc/init.d/nginx-agent - packager: apk - - src: ./scripts/nginx-agent.logrotate - dst: /etc/logrotate.d/nginx-agent - - src: ./scripts/selinux/nginx_agent_selinux.8 - dst: /usr/share/man/man8/nginx_agent_selinux.8 - packager: rpm - - src: ./scripts/selinux/nginx_agent.if - dst: /usr/share/selinux/devel/include/contrib/nginx_agent.if - packager: rpm - - src: ./scripts/selinux/nginx_agent.pp - dst: /usr/share/selinux/packages/nginx_agent.pp - packager: rpm - - dst: /var/log/nginx-agent - type: dir - - dst: /var/lib/nginx-agent - type: dir -overrides: - deb: - depends: - - apt-transport-https -#deb: -# signature: -# method: dpkg-sig -# key_file: ".key.asc" -#rpm: -# signature: -# key_file: ".key.asc" -apk: -# signature: -# key_file: ".key.rsa" - scripts: - preupgrade: "./scripts/packages/preinstall.sh" - postupgrade: "./scripts/packages/postinstall.sh" -scripts: - preinstall: "./scripts/packages/preinstall.sh" - postinstall: "./scripts/packages/postinstall.sh" - preremove: "./scripts/packages/preremove.sh" - postremove: "./scripts/packages/postremove.sh" diff --git a/.nfpm.arm64.yaml b/.nfpm.arm64.yaml deleted file mode 100644 index 20d635efd..000000000 --- a/.nfpm.arm64.yaml +++ /dev/null @@ -1,60 +0,0 @@ -# this is the base "template" for the package -name: nginx-agent -description: NGINX Agent -arch: arm64 -version: ${VERSION} -priority: optional -vendor: NGINX Software, Inc. -maintainer: NGINX Inc. -homepage: https://github.com/nginx/agent -license: Apache 2.0 -contents: - - src: ./build/arm64/nginx-agent - dst: /usr/bin/nginx-agent - - src: nginx-agent.conf - dst: /etc/nginx-agent/nginx-agent.conf - type: config|noreplace - file_info: - mode: 0640 - - src: ./scripts/packages/nginx-agent.service - dst: /etc/systemd/system/nginx-agent.service - - src: ./scripts/packages/nginx-agent.openrc - dst: /etc/init.d/nginx-agent - packager: apk - - src: ./scripts/nginx-agent.logrotate - dst: /etc/logrotate.d/nginx-agent - - src: ./scripts/selinux/nginx_agent_selinux.8 - dst: /usr/share/man/man8/nginx_agent_selinux.8 - packager: rpm - - src: ./scripts/selinux/nginx_agent.if - dst: /usr/share/selinux/devel/include/contrib/nginx_agent.if - packager: rpm - - src: ./scripts/selinux/nginx_agent.pp - dst: /usr/share/selinux/packages/nginx_agent.pp - packager: rpm - - dst: /var/log/nginx-agent - type: dir - - dst: /var/lib/nginx-agent - type: dir -overrides: - deb: - depends: - - apt-transport-https -#deb: -# signature: -# method: dpkg-sig -# key_file: ".key.asc" -#rpm: -# signature: -# key_file: ".key.asc" -apk: -# signature: -# key_file: ".key.rsa" - scripts: - preupgrade: "./scripts/packages/preinstall.sh" - postupgrade: "./scripts/packages/postinstall.sh" -scripts: - preinstall: "./scripts/packages/preinstall.sh" - postinstall: "./scripts/packages/postinstall.sh" - preremove: "./scripts/packages/preremove.sh" - postremove: "./scripts/packages/postremove.sh" diff --git a/.nfpm.yaml b/.nfpm.yaml index f8a4ac256..3be825754 100644 --- a/.nfpm.yaml +++ b/.nfpm.yaml @@ -9,7 +9,7 @@ maintainer: NGINX Inc. homepage: https://github.com/nginx/agent license: Apache 2.0 contents: - - src: ./build/nginx-agent + - src: ^BUILD_PATH^/nginx-agent dst: /usr/bin/nginx-agent - src: nginx-agent.conf dst: /etc/nginx-agent/nginx-agent.conf diff --git a/Makefile.packaging b/Makefile.packaging index e73afd627..acc6b6510 100644 --- a/Makefile.packaging +++ b/Makefile.packaging @@ -40,10 +40,13 @@ package: $(PACKAGES_DIR) #### Create final packages for all supported distros # Build binaries for both amd64 and arm64 for arch in $(DEB_ARCHS); do \ mkdir -p $(BUILD_DIR)/$${arch}; \ + cp .nfpm.yaml .nfpm.$$arch.yaml; \ + sed -i.bak "s/\^BUILD_PATH\^/\.\/build\/$${arch}/g" ".nfpm.$$arch.yaml"; \ GOWORK=off CGO_ENABLED=0 GOARCH=$${arch} GOOS=linux \ go build -pgo=auto -ldflags=${LDFLAGS} \ -o $(BUILD_DIR)/$${arch}/$(BINARY_NAME) \ $(PROJECT_DIR)/$(PROJECT_FILE); \ + rm -f .nfpm.$$arch.yaml.bak; \ done; \ @echo "Built binaries:"; \