From 195cfa8d5c42043ff227371ef9af2a99e8309850 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan-Otto=20Kr=C3=B6pke?= Date: Sat, 11 May 2024 23:06:22 +0200 Subject: [PATCH] Add: push docker images to dockerhub and quay.io (#1469) --- .github/workflows/lint.yml | 3 --- .github/workflows/release.yml | 33 +++++++++++++++++++++-- Dockerfile | 2 +- Makefile | 27 ++++++++++++++----- README.md | 50 ++++++++++++++++++++--------------- 5 files changed, 82 insertions(+), 33 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 9f26c1466..02fea9704 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -44,7 +44,6 @@ jobs: Expand-Archive -Path promu-$($Env:PROMU_VER).windows-amd64.zip -DestinationPath . Copy-Item -Path promu-$($Env:PROMU_VER).windows-amd64\promu.exe -Destination "$(go env GOPATH)\bin" - go install github.com/josephspurrier/goversioninfo/cmd/goversioninfo@v1.2.0 # GOPATH\bin dir must be appended to PATH else the `promu` command won't be found echo "$(go env GOPATH)\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append @@ -69,8 +68,6 @@ jobs: Expand-Archive -Path promu-$($Env:PROMU_VER).windows-amd64.zip -DestinationPath . Copy-Item -Path promu-$($Env:PROMU_VER).windows-amd64\promu.exe -Destination "$(go env GOPATH)\bin" - # No binaries available so build from source - go install github.com/josephspurrier/goversioninfo/cmd/goversioninfo@v1.2.0 # GOPATH\bin dir must be appended to PATH else the `promu` command won't be found echo "$(go env GOPATH)\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ef0076de7..a2d9bf39f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,6 +2,10 @@ name: Releases # Trigger on releases. on: + push: + branches: + - master + pull_request: release: types: - published @@ -68,7 +72,7 @@ jobs: path: output\windows_exporter-*.exe - name: Build Release Artifacts - if: startsWith(github.ref, 'refs/tags/') + if: ${{ github.event_name != 'pull_request' }} run: | $ErrorActionPreference = "Stop" $BuildVersion = Get-Content VERSION @@ -83,6 +87,31 @@ jobs: promu checksum output\ + - name: Build Docker Artifacts + run: make build-all + env: + VERSION: >- + ${{ + startsWith(github.ref, 'refs/tags/') && 'latest' || + ( + github.event_name == 'pull_request' && format('pr-{0}', github.event.number) || github.ref_name + ) + }} + + - name: Login to Docker Hub + if: ${{ github.event_name != 'pull_request' }} + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_HUB_LOGIN }} + password: ${{ secrets.DOCKER_HUB_PASSWORD }} + + - name: Login to Docker Hub + if: ${{ github.event_name != 'pull_request' }} + uses: docker/login-action@v3 + with: + username: '$token' + password: ${{ secrets.QUAY_IO_API_TOKEN }} + - name: Login to GitHub container registry if: ${{ github.event_name != 'pull_request' }} uses: docker/login-action@v3 @@ -95,8 +124,8 @@ jobs: if: ${{ github.event_name != 'pull_request' }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + VERSION: ${{ startsWith(github.ref, 'refs/tags/') && 'latest' || github.ref_name }} run: | - $Env:VERSION = 'latest' make push-all - name: Release diff --git a/Dockerfile b/Dockerfile index a59d913e3..2e1424db0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ # Note this image doesn't really matter for hostprocess but it is good to build per OS version # the files in the image are copied to $env:CONTAINER_SANDBOX_MOUNT_POINT on the host # but the file system is the Host NOT the container -ARG BASE="mcr.microsoft.com/windows/nanoserver:1809" +ARG BASE="mcr.microsoft.com/windows/nanoserver:ltsc2022" FROM $BASE ENV PATH="C:\Windows\system32;C:\Windows;" diff --git a/Makefile b/Makefile index 2a16cd1ed..2fe867f0a 100644 --- a/Makefile +++ b/Makefile @@ -1,15 +1,21 @@ export GOOS=windows export DOCKER_IMAGE_NAME ?= windows-exporter -export DOCKER_REPO ?= ghcr.io/prometheus-community + +# DOCKER_REPO is the official image repository name at docker.io, quay.io. +DOCKER_REPO:= prometheuscommunity + +# ALL_DOCKER_REPOS is the list of repositories to push the image to. ghcr.io requires that org name be the same as the image repo name. +ALL_DOCKER_REPOS:=docker.io/$(DOCKER_REPO) quay.io/$(DOCKER_REPO) ghcr.io/prometheus-community VERSION?=$(shell cat VERSION) DOCKER?=docker # Image Variables for Hostprocess Container # Windows image build is heavily influenced by https://github.com/kubernetes/kubernetes/blob/master/cluster/images/etcd/Makefile -OS=1809 -ALL_OS:= 1809 ltsc2022 +OS=ltsc2019 +ALL_OS:= ltsc2019 ltsc2022 BASE_IMAGE=mcr.microsoft.com/windows/nanoserver +BASE_HOST_PROCESS_IMAGE=mcr.microsoft.com/oss/kubernetes/windows-host-process-containers-base-image:v1.0.0 .PHONY: build build: generate windows_exporter.exe @@ -48,7 +54,7 @@ crossbuild: generate GOARCH=arm64 promu build --prefix=output/arm64 build-image: crossbuild - $(DOCKER) build --build-arg=BASE=$(BASE_IMAGE):$(OS) -f Dockerfile -t $(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(VERSION)-$(OS) . + $(DOCKER) build --build-arg=BASE=$(BASE_IMAGE):$(OS) -f Dockerfile -t local/$(DOCKER_IMAGE_NAME):$(VERSION)-$(OS) . sub-build-%: $(MAKE) OS=$* build-image @@ -58,11 +64,20 @@ build-all: $(addprefix sub-build-,$(ALL_OS)) push: set -x; \ for osversion in ${ALL_OS}; do \ + $(DOCKER) tag local/$(DOCKER_IMAGE_NAME):$(VERSION)-$${osversion} $(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(VERSION)-$${osversion}; \ $(DOCKER) push $(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(VERSION)-$${osversion}; \ $(DOCKER) manifest create --amend $(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(VERSION) $(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(VERSION)-$${osversion}; \ full_version=`$(DOCKER) manifest inspect $(BASE_IMAGE):$${osversion} | grep "os.version" | head -n 1 | awk -F\" '{print $$4}'` || true; \ $(DOCKER) manifest annotate --os windows --arch amd64 --os-version $${full_version} $(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(VERSION) $(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(VERSION)-$${osversion}; \ done - $(DOCKER) manifest push --purge $(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(VERSION) + $(DOCKER) manifest push --purge $(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(VERSION); + +sub-push-%: + $(MAKE) DOCKER_REPO=$* push + +push-all: build-all $(addprefix sub-push-,$(ALL_DOCKER_REPOS)) -push-all: build-all push +# Mandatory target for container description sync action +.PHONY: docker-repo-name +docker-repo-name: + @echo "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)" \ No newline at end of file diff --git a/README.md b/README.md index 20de3a6a9..c2ebab24f 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,6 @@ A Prometheus exporter for Windows machines. - ## Collectors Name | Description | Enabled by default @@ -82,17 +81,17 @@ This can be useful for having different Prometheus servers collect specific metr windows_exporter accepts flags to configure certain behaviours. The ones configuring the global behaviour of the exporter are listed below, while collector-specific ones are documented in the respective collector documentation above. -Flag | Description | Default value ----------|-------------|-------------------- -`--web.listen-address` | host:port for exporter. | `:9182` -`--telemetry.path` | URL path for surfacing collected metrics. | `/metrics` -`--telemetry.max-requests` | Maximum number of concurrent requests. 0 to disable. | `5` -`--collectors.enabled` | Comma-separated list of collectors to use. Use `[defaults]` as a placeholder which gets expanded containing all the collectors enabled by default." | `[defaults]` -`--collectors.print` | If true, print available collectors and exit. | -`--scrape.timeout-margin` | Seconds to subtract from the timeout allowed by the client. Tune to allow for overhead or high loads. | `0.5` -`--web.config.file` | A [web config][web_config] for setting up TLS and Auth | None -`--config.file` | [Using a config file](#using-a-configuration-file) from path or URL | None -`--config.file.insecure-skip-verify` | Skip TLS when loading config file from URL | false +| Flag | Description | Default value | +|--------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------|---------------| +| `--web.listen-address` | host:port for exporter. | `:9182` | +| `--telemetry.path` | URL path for surfacing collected metrics. | `/metrics` | +| `--telemetry.max-requests` | Maximum number of concurrent requests. 0 to disable. | `5` | +| `--collectors.enabled` | Comma-separated list of collectors to use. Use `[defaults]` as a placeholder which gets expanded containing all the collectors enabled by default." | `[defaults]` | +| `--collectors.print` | If true, print available collectors and exit. | | +| `--scrape.timeout-margin` | Seconds to subtract from the timeout allowed by the client. Tune to allow for overhead or high loads. | `0.5` | +| `--web.config.file` | A [web config][web_config] for setting up TLS and Auth | None | +| `--config.file` | [Using a config file](#using-a-configuration-file) from path or URL | None | +| `--config.file.insecure-skip-verify` | Skip TLS when loading config file from URL | false | ## Installation The latest release can be downloaded from the [releases page](https://github.com/prometheus-community/windows_exporter/releases). @@ -101,15 +100,15 @@ Each release provides a .msi installer. The installer will setup the windows_exp If the installer is run without any parameters, the exporter will run with default settings for enabled collectors, ports, etc. The following parameters are available: -Name | Description ------|------------ -`ENABLED_COLLECTORS` | As the `--collectors.enabled` flag, provide a comma-separated list of enabled collectors -`LISTEN_ADDR` | The IP address to bind to. Defaults to 0.0.0.0 -`LISTEN_PORT` | The port to bind to. Defaults to 9182. -`METRICS_PATH` | The path at which to serve metrics. Defaults to `/metrics` -`TEXTFILE_DIRS` | As the `--collector.textfile.directories` flag, provide a directory to read text files with metrics from -`REMOTE_ADDR` | Allows setting comma separated remote IP addresses for the Windows Firewall exception (allow list). Defaults to an empty string (any remote address). -`EXTRA_FLAGS` | Allows passing full CLI flags. Defaults to an empty string. +| Name | Description | +|----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------| +| `ENABLED_COLLECTORS` | As the `--collectors.enabled` flag, provide a comma-separated list of enabled collectors | +| `LISTEN_ADDR` | The IP address to bind to. Defaults to 0.0.0.0 | +| `LISTEN_PORT` | The port to bind to. Defaults to 9182. | +| `METRICS_PATH` | The path at which to serve metrics. Defaults to `/metrics` | +| `TEXTFILE_DIRS` | As the `--collector.textfile.directories` flag, provide a directory to read text files with metrics from | +| `REMOTE_ADDR` | Allows setting comma separated remote IP addresses for the Windows Firewall exception (allow list). Defaults to an empty string (any remote address). | +| `EXTRA_FLAGS` | Allows passing full CLI flags. Defaults to an empty string. | Parameters are sent to the installer via `msiexec`. Example invocations: @@ -142,6 +141,15 @@ $PSNativeCommandArgumentPassing = 'Legacy' msiexec /i ENABLED_COLLECTORS=os,service --% EXTRA_FLAGS="--collector.service.services-where ""Name LIKE 'sql%'""" ``` +## Docker Implementation + +The windows_exporter can be run as a Docker container. The Docker image is available on + +* [Docker Hub](https://hub.docker.com/r/prometheuscommunity/windows-exporter): `ghcr.io/prometheus-community/windows-exporter` +* [GitHub Container Registry](https://github.com/prometheus-community/windows_exporter/pkgs/container/windows-exporter): `docker.io/prometheuscommunity/windows-exporter` +* [quay.io Registry](https://quay.io/repository/prometheuscommunity/windows-exporter): `quay.io/prometheuscommunity/windows-exporter` + + ## Kubernetes Implementation See detailed steps to install on Windows Kubernetes [here](./kubernetes/kubernetes.md).