diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index d4270c7a..00000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,71 +0,0 @@ ---- -version: 2.1 -orbs: - prometheus: prometheus/prometheus@0.17.1 -executors: - golang: - docker: - - image: cimg/go:1.25 - - image: quay.io/prometheus/node-exporter:latest - -jobs: - test: - executor: golang - environment: - prom_ver: 3.7.3 - steps: - - prometheus/setup_environment - - run: wget https://github.com/prometheus/prometheus/releases/download/v${prom_ver}/prometheus-${prom_ver}.linux-amd64.tar.gz - - run: tar xzf prometheus-${prom_ver}.linux-amd64.tar.gz - - run: sudo cp -v prometheus-${prom_ver}.linux-amd64/prometheus /bin/prometheus - - run: - name: Configure Prometheus - command: | - cat \<< EOF > prometheus.yml - global: - scrape_interval: 1s - scrape_configs: - - job_name: pushprox - proxy_url: http://127.0.0.1:8080 - static_configs: - - targets: ['$(hostname):9100'] - EOF - - run: make - - run: - name: Run everything and test that Prometheus can scrape node_exporter via pushprox - command: ./end-to-end-test.sh -workflows: - version: 2 - PushProx: - jobs: - - test: - filters: - tags: - only: /.*/ - - prometheus/build: - name: build - filters: - tags: - only: /.*/ - - prometheus/publish_master: - context: org-context - docker_hub_organization: prometheuscommunity - quay_io_organization: prometheuscommunity - requires: - - test - - build - filters: - branches: - only: master - - prometheus/publish_release: - context: org-context - docker_hub_organization: prometheuscommunity - quay_io_organization: prometheuscommunity - requires: - - test - - build - filters: - tags: - only: /^v.*/ - branches: - ignore: /.*/ diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..8f8eaae5 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,78 @@ +--- +name: CI +on: + pull_request: + push: + branches: [main, master, 'release-*'] + tags: ['v*'] + +permissions: + contents: read + +jobs: + test_go: + name: Go tests + runs-on: ubuntu-latest + container: + # Whenever the Go version is updated here, .promu.yml + # should also be updated. + image: quay.io/prometheus/golang-builder:1.26-base + steps: + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + with: + persist-credentials: false + - uses: prometheus/promci-setup@5af30ba8c199a91d6c04ebdc3c48e630e355f62d # v0.1.0 + - run: make GO_ONLY=1 SKIP_GOLANGCI_LINT=1 + - run: git diff --exit-code + + build: + name: Build + runs-on: ubuntu-latest + strategy: + matrix: + thread: [ 0, 1, 2, 3] + steps: + - uses: prometheus/promci/build@d9d4f5688814f0b77bf003d07fb8c00507390634 # v0.8.2 + with: + parallelism: 4 + thread: ${{ matrix.thread }} + + publish_default: + name: Publish default branch artifacts + runs-on: ubuntu-latest + permissions: + packages: write + needs: [test_go, build] + if: | + (github.event_name == 'push' && github.event.ref == 'refs/heads/main') + || + (github.event_name == 'push' && github.event.ref == 'refs/heads/master') + steps: + - uses: prometheus/promci/publish_main@13941414d409d227afd67544e5d306827db5a1a2 # v0.8.5 + with: + docker_hub_organization: prometheuscommunity + docker_hub_password: ${{ secrets.docker_hub_password }} + ghcr_io_organization: prometheus-community + ghcr_io_password: ${{ github.token }} + quay_io_organization: prometheuscommunity + quay_io_password: ${{ secrets.quay_io_password }} + + publish_release: + name: Publish release artefacts + runs-on: ubuntu-latest + permissions: + contents: write + packages: write + needs: [test_go, build] + if: | + (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')) + steps: + - uses: prometheus/promci/publish_release@d9d4f5688814f0b77bf003d07fb8c00507390634 # v0.8.2 + with: + docker_hub_organization: prometheuscommunity + docker_hub_password: ${{ secrets.docker_hub_password }} + ghcr_io_organization: prometheus-community + ghcr_io_password: ${{ github.token }} + quay_io_organization: prometheuscommunity + quay_io_password: ${{ secrets.quay_io_password }} + github_token: ${{ github.token }} diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml new file mode 100644 index 00000000..f0caccaf --- /dev/null +++ b/.github/workflows/integration.yml @@ -0,0 +1,33 @@ +--- +name: Integration +on: + pull_request: + push: + branches: [main, master, 'release-*'] + tags: ['v*'] + +permissions: + contents: read + +jobs: + integration: + name: Integration test + runs-on: ubuntu-latest + services: + node-exporter: + image: quay.io/prometheus/node-exporter:latest + ports: + - 9100:9100 + env: + PROM_VERSION: 3.12.0 + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6.5.0 + with: + go-version: 1.26.x + - run: make build + - run: curl -sSf -L https://github.com/prometheus/prometheus/releases/download/v${PROM_VERSION}/prometheus-${PROM_VERSION}.linux-amd64.tar.gz | tar xz + - run: sudo cp -v prometheus-${PROM_VERSION}.linux-amd64/prometheus /usr/bin/prometheus + - run: sed -i "s/node-exporter/${HOSTNAME}/" ./end-to-end/prometheus.yml + - run: cat ./end-to-end/prometheus.yml + - run: ./end-to-end/test.sh diff --git a/.promu.yml b/.promu.yml index 05f1645f..cfcc84ff 100644 --- a/.promu.yml +++ b/.promu.yml @@ -1,6 +1,6 @@ go: - # This must match .circle/config.yml. - version: 1.25 + # This must match .github/workflows/ci.yml. + version: 1.26 repository: path: github.com/prometheus-community/pushprox build: diff --git a/end-to-end-test.sh b/end-to-end-test.sh deleted file mode 100755 index 3ceb681b..00000000 --- a/end-to-end-test.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/bash - -set -u -o pipefail - -tmpdir=$(mktemp -d /tmp/pushprox_e2e_test.XXXXXX) - -cleanup() { - for f in "${tmpdir}"/*.pid ; do - kill -9 "$(< $f)" - done - rm -r "${tmpdir}" -} - -trap cleanup EXIT - -if type node_exporter > /dev/null 2>&1 ; then - node_exporter & - echo $! > "${tmpdir}/node_exporter.pid" -fi -while ! curl -s -f -L http://localhost:9100; do - echo 'Waiting for node_exporter' - sleep 2 -done - -./pushprox-proxy --log.level=debug & -echo $! > "${tmpdir}/proxy.pid" -while ! curl -s -f -L http://localhost:8080/clients; do - echo 'Waiting for proxy' - sleep 2 -done - -./pushprox-client --log.level=debug --proxy-url=http://localhost:8080 & -echo $! > "${tmpdir}/client.pid" -while [ "$(curl -s -L 'http://localhost:8080/clients' | jq 'length')" != '1' ] ; do - echo 'Waiting for client' - sleep 2 -done - -prometheus --config.file=prometheus.yml --log.level=debug & -echo $! > "${tmpdir}/prometheus.pid" -while ! curl -s -f -L http://localhost:9090/-/ready; do - echo 'Waiting for Prometheus' - sleep 2 -done -sleep 15 - -query='http://localhost:9090/api/v1/query?query=node_exporter_build_info' -while [ $(curl -s -L "${query}" | jq '.data.result | length') != '1' ]; do - echo 'Waiting for results' - sleep 2 -done diff --git a/end-to-end/prometheus.yml b/end-to-end/prometheus.yml new file mode 100644 index 00000000..58488776 --- /dev/null +++ b/end-to-end/prometheus.yml @@ -0,0 +1,8 @@ +global: + scrape_interval: 1s +scrape_configs: + - job_name: pushprox + proxy_url: http://localhost:8080 + static_configs: + - targets: + - node-exporter:9100 diff --git a/end-to-end/test.sh b/end-to-end/test.sh new file mode 100755 index 00000000..37a7350b --- /dev/null +++ b/end-to-end/test.sh @@ -0,0 +1,84 @@ +#!/usr/bin/env bash + +set -u -o pipefail + +tmpdir=$(mktemp -d /tmp/pushprox_e2e_test.XXXXXX) + +cleanup() { + for f in "${tmpdir}"/*.pid ; do + kill -9 "$(< $f)" + done + rm -r "${tmpdir}" +} + +trap cleanup EXIT + +get_clients() { + curl -s -f -L http://localhost:8080/clients +} + +run_client() { + ./pushprox-client --log.level=debug --fqdn="${HOSTNAME}" --proxy-url=http://localhost:8080 2>&1 | sed 's/^/pushprox-client: /' +} + +run_proxy() { + ./pushprox-proxy --log.level=debug 2>&1 | sed 's/^/pushprox-proxy: /' +} + +run_node_exporter() { + node_exporter 2>&1 | sed 's/^/node_exporter: /' +} + +run_prometheus() { + prometheus --config.file=end-to-end/prometheus.yml --log.level=debug 2>&1 | sed 's/^/prometheus: /' +} + +if type node_exporter > /dev/null 2>&1 ; then + echo "INFO: Starting node_exporter" + run_node_exporter & + pidof node_exporter > "${tmpdir}/node_exporter.pid" +fi +while ! curl -s -f -L "http://localhost:9100" > /dev/null; do + echo 'INFO: Waiting for node_exporter' + sleep 2 +done + +if [[ ! -f 'pushprox-proxy' ]] ; then + echo 'ERROR: Missing pushprox-proxy binary' + exit 1 +fi +run_proxy & +pidof pushprox-proxy > "${tmpdir}/proxy.pid" +while ! get_clients > /dev/null; do + echo 'INFO: Waiting for proxy' + sleep 2 +done + +if [[ ! -f 'pushprox-client' ]] ; then + echo 'ERROR: Missing pushprox-client binary' + exit 1 +fi +run_client & +pidof pushproxy-proxy > "${tmpdir}/client.pid" +while [ "$(get_clients | jq 'length')" != '1' ] ; do + echo 'INFO: Waiting for client' + sleep 2 +done + +echo "INFO: Found clients: $(get_clients | jq -rc .)" + +if type prometheus > /dev/null 2>&1 ; then + run_prometheus & + pidof prometheus > "${tmpdir}/prometheus.pid" +fi +while ! curl -s -f -L "http://localhost:9090/-/ready"; do + echo 'INFO: Waiting for Prometheus' + sleep 2 +done +sleep 15 + +query="http://localhost:9090/api/v1/query?query=node_exporter_build_info" +while [ $(curl -s -L "${query}" | jq '.data.result | length') != '1' ]; do + echo 'INFO: Waiting for results' + sleep 2 +done