Skip to content

Bump actions/setup-dotnet from 3 to 4 #345

Bump actions/setup-dotnet from 3 to 4

Bump actions/setup-dotnet from 3 to 4 #345

Workflow file for this run

name: Service
on:
push:
paths:
- 'App/**'
- 'Service/**'
- '.github/workflows/*.yml'
branches:
- '**'
tags:
- '*.*.*'
workflow_dispatch:
env:
ARTIFACT_NAME: ServerMonitor-Service
DOCKER_IMAGE_NAME: server-monitor
DOCKER_REGISTRY_DOMAIN: ghcr.io
jobs:
build:
name: Build
runs-on: ubuntu-22.04
defaults:
run:
working-directory: Service
permissions:
contents: read
packages: read
steps:
- name: Clone repository
uses: actions/checkout@v4
- name: Setup .NET Core
uses: actions/setup-dotnet@v4
with:
dotnet-version: 7.0.x
- name: Add GitHub Packages source
if: ${{ github.event_name != 'pull_request' && !startsWith( github.ref_name, 'dependabot/' ) }}
run: dotnet nuget add source --name github --username ${{ github.repository_owner }} --password ${{ secrets.GITHUB_TOKEN }} --store-password-in-clear-text https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json
- name: Restore dependencies
run: dotnet restore ServerMonitor/ServerMonitor.csproj
- name: Build project
run: dotnet build --nologo --configuration Release --no-restore --no-self-contained ServerMonitor/ServerMonitor.csproj
- name: Upload build artifact
uses: actions/upload-artifact@v3
with:
name: ${{ env.ARTIFACT_NAME }}
path: Service/ServerMonitor/bin/Release/net7.0/*
test:
name: Test
runs-on: ${{ matrix.os }}
needs: build
defaults:
run:
working-directory: Service
strategy:
fail-fast: false
matrix:
name: [ Ubuntu, Windows ]
include:
- name: Ubuntu
os: ubuntu-22.04
docker: unix:///var/run/docker.sock
- name: Windows
os: windows-2022
docker: npipe://./pipe/docker_engine
permissions:
contents: read
packages: read
steps:
- name: Clone repository
uses: actions/checkout@v4
- name: Setup .NET Core
uses: actions/setup-dotnet@v4
with:
dotnet-version: 7.0.x
- name: Add GitHub Packages source
if: ${{ github.event_name != 'pull_request' && !startsWith( github.ref_name, 'dependabot/' ) }}
run: dotnet nuget add source --name github --username ${{ github.repository_owner }} --password ${{ secrets.GITHUB_TOKEN }} --store-password-in-clear-text https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json
- name: Restore dependencies
run: dotnet restore ServerMonitor.Tests/ServerMonitor.Tests.csproj
- name: Build project
run: dotnet build --nologo --configuration Release --no-restore --no-self-contained ServerMonitor.Tests/ServerMonitor.Tests.csproj
# Can't connect to Prometheus in PR because of secrets
- name: Run unit & integration tests
if: ${{ github.event_name != 'pull_request' && !startsWith( github.ref_name, 'dependabot/' ) }}
env:
SERVER_MONITOR_PROMETHEUSMETRICSPREFIX: github
SERVER_MONITOR_PROMETHEUSAPIADDRESS: ${{ secrets.PROMETHEUS_DOMAIN_NAME }}
SERVER_MONITOR_PROMETHEUSAPIPORT: 443
SERVER_MONITOR_DOCKERENGINEAPIADDRESS: ${{ matrix.docker }}
SERVER_MONITOR_SNMPMANAGERLISTENADDRESS: 127.0.0.1
SERVER_MONITOR_SNMPMANAGERLISTENPORT: 1620
SERVER_MONITOR_CONNECTORLISTENADDRESS: 127.0.0.1
SERVER_MONITOR_CONNECTORAUTHENTICATIONCREDENTIALS__0__USERNAME: GitHub
SERVER_MONITOR_CONNECTORAUTHENTICATIONCREDENTIALS__0__PASSWORD: P4ssw0rd
SERVER_MONITOR_CONNECTORAUTHENTICATIONREALM: Workflow
SERVER_MONITOR_CLOUDFLAREACCESSSERVICETOKENID: ${{ secrets.CLOUDFLARE_ACCESS_ID }}
SERVER_MONITOR_CLOUDFLAREACCESSSERVICETOKENSECRET: ${{ secrets.CLOUDFLARE_ACCESS_SECRET }}
run: dotnet test --nologo --configuration Release --no-build ServerMonitor.Tests/ServerMonitor.Tests.csproj
launch:
name: Launch
runs-on: ${{ matrix.os }}
needs: test
defaults:
run:
working-directory: Service
strategy:
fail-fast: false
matrix:
name: [ Ubuntu, Windows ]
include:
- name: Ubuntu
os: ubuntu-22.04
docker: unix:///var/run/docker.sock
- name: Windows
os: windows-2022
docker: npipe://./pipe/docker_engine
permissions:
contents: read
steps:
- name: Clone repository
uses: actions/checkout@v4
- name: Setup .NET Core
uses: actions/setup-dotnet@v4
with:
dotnet-version: 7.0.x
- name: Download build artifact
uses: actions/download-artifact@v3
with:
name: ${{ env.ARTIFACT_NAME }}
path: Service/artifact
- name: Launch as Collector (Ubuntu)
if: ${{ matrix.name == 'Ubuntu' }}
env:
SERVER_MONITOR_DOCKERENGINEAPIADDRESS: ${{ matrix.docker }}
SERVER_MONITOR_COLLECTPROCESSORMETRICS: true
SERVER_MONITOR_COLLECTMEMORYMETRICS: true
SERVER_MONITOR_COLLECTDISKMETRICS: true
SERVER_MONITOR_COLLECTNETWORKMETRICS: true
SERVER_MONITOR_COLLECTINFORMATIONMETRICS: true
SERVER_MONITOR_COLLECTPOWERMETRICS: false
SERVER_MONITOR_COLLECTFANMETRICS: false
SERVER_MONITOR_COLLECTSERVICEMETRICS: true
SERVER_MONITOR_COLLECTDOCKERMETRICS: true
SERVER_MONITOR_COLLECTSNMPMETRICS: true
SERVER_MONITOR_SNMPMANAGERLISTENADDRESS: 127.0.0.1
SERVER_MONITOR_SNMPMANAGERLISTENPORT: 1620
run: sudo dotnet artifact/ServerMonitor.dll --once collector
- name: Launch as Collector (Windows)
if: ${{ matrix.name == 'Windows' }}
env:
SERVER_MONITOR_DOCKERENGINEAPIADDRESS: ${{ matrix.docker }}
SERVER_MONITOR_COLLECTPROCESSORMETRICS: true
SERVER_MONITOR_COLLECTMEMORYMETRICS: true
SERVER_MONITOR_COLLECTDISKMETRICS: true
SERVER_MONITOR_COLLECTNETWORKMETRICS: true
SERVER_MONITOR_COLLECTINFORMATIONMETRICS: true
SERVER_MONITOR_COLLECTPOWERMETRICS: false
SERVER_MONITOR_COLLECTFANMETRICS: false
SERVER_MONITOR_COLLECTSERVICEMETRICS: true
SERVER_MONITOR_COLLECTDOCKERMETRICS: true
SERVER_MONITOR_COLLECTSNMPMETRICS: true
SERVER_MONITOR_SNMPMANAGERLISTENADDRESS: 127.0.0.1
SERVER_MONITOR_SNMPMANAGERLISTENPORT: 1620
run: dotnet artifact/ServerMonitor.dll --once collector
- name: Launch as Connector
env:
SERVER_MONITOR_CONNECTORLISTENADDRESS: 127.0.0.1
SERVER_MONITOR_CONNECTORLISTENPORT: 8080
SERVER_MONITOR_CONNECTORAUTHENTICATIONCREDENTIALS__0__USERNAME: GitHub
SERVER_MONITOR_CONNECTORAUTHENTICATIONCREDENTIALS__0__PASSWORD: GitHub
SERVER_MONITOR_CONNECTORAUTHENTICATIONREALM: GitHub
run: dotnet artifact/ServerMonitor.dll --once connector --no-listen
docker:
name: Docker
runs-on: ${{ matrix.os }}
needs: launch
defaults:
run:
working-directory: Service
strategy:
fail-fast: false # Sometimes Windows & Ubuntu can fail for different reasons
matrix:
name: [ Ubuntu, Windows ]
include:
- name: Ubuntu
os: ubuntu-22.04
dockerfile: Ubuntu.Dockerfile
suffix: ubuntu
- name: Windows
os: windows-2022
dockerfile: Windows.Dockerfile
suffix: windows
concurrency:
group: ${{ github.workflow }}-${{ github.job }}-${{ github.ref }}-${{ matrix.suffix }}
cancel-in-progress: false
permissions:
contents: read
packages: write
steps:
- name: Clone repository
uses: actions/checkout@v4
- name: Setup QEMU (Ubuntu)
if: ${{ matrix.name == 'Ubuntu' }}
uses: docker/setup-qemu-action@v3
- name: Setup Docker (Ubuntu)
if: ${{ matrix.name == 'Ubuntu' }}
uses: docker/setup-buildx-action@v3
with:
platforms: linux/amd64
- name: Login to GitHub Container Registry
if: ${{ github.event_name != 'pull_request' && !startsWith( github.ref_name, 'dependabot/' ) }}
uses: docker/login-action@v3
with:
registry: ${{ env.DOCKER_REGISTRY_DOMAIN }}
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Download build artifact
uses: actions/download-artifact@v3
with:
name: ${{ env.ARTIFACT_NAME }}
path: Service/artifact
- name: Create metadata for Docker image
id: metadata
uses: docker/metadata-action@v5
with:
images: ${{ env.DOCKER_REGISTRY_DOMAIN }}/${{ github.repository_owner }}/${{ env.DOCKER_IMAGE_NAME }}
flavor: |
latest=false
suffix=-${{ matrix.suffix }},onlatest=false
tags: |
type=ref,event=pr
type=ref,event=branch
type=semver,pattern={{major}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}.{{minor}}.{{patch}}
labels: |
org.opencontainers.image.title=Server Monitor
org.opencontainers.image.vendor=${{ github.repository_owner }}
org.opencontainers.image.licenses=CC-BY-SA-4.0
com.docker.extension.publisher-url=https://viral32111.com
- name: Build & push Docker image (Ubuntu)
if: ${{ matrix.name == 'Ubuntu' }}
uses: docker/build-push-action@v5
with:
push: ${{ github.event_name != 'pull_request' && !startsWith( github.ref_name, 'dependabot/' ) }}
file: Service/${{ matrix.dockerfile }}
context: Service/artifact
tags: ${{ steps.metadata.outputs.tags }}
labels: ${{ steps.metadata.outputs.labels }}
platforms: linux/amd64
provenance: false
no-cache: true
pull: true
- name: Format metadata for Docker image (Windows)
id: format
if: ${{ matrix.name == 'Windows' }}
uses: actions/github-script@v7
with:
script: |
const { DOCKER_METADATA_OUTPUT_JSON } = process.env;
const { tags, labels } = JSON.parse( DOCKER_METADATA_OUTPUT_JSON );
core.setOutput( "tags", tags.join( " --tag " ) );
core.setOutput( "labels", Object.entries( labels ).map( label => `${label[ 0 ]}='${ label[ 1 ] }'` ).join( " --label " ) );
- name: Build Docker image (Windows)
if: ${{ matrix.name == 'Windows' }}
run: docker image build --no-cache --pull --file ${{ matrix.dockerfile }} --tag ${{ steps.format.outputs.tags }} --label ${{ steps.format.outputs.labels }} artifact
- name: Push Docker image (Windows)
if: ${{ matrix.name == 'Windows' && github.event_name != 'pull_request' && !startsWith( github.ref_name, 'dependabot/' ) }}
run: docker image push --all-tags ${{ env.DOCKER_REGISTRY_DOMAIN }}/${{ github.repository_owner }}/${{ env.DOCKER_IMAGE_NAME }}
cleanup:
name: Cleanup
runs-on: ubuntu-22.04
needs: docker
if: ${{ github.event_name != 'pull_request' && !startsWith( github.ref_name, 'dependabot/' ) }}
continue-on-error: true
steps:
- name: Delete old Docker images
uses: snok/container-retention-policy@v2
with:
image-names: ${{ env.DOCKER_IMAGE_NAME }}
cut-off: 24 hours ago UTC
keep-at-least: 1
untagged-only: true
skip-tags: latest
account-type: personal
token: ${{ secrets.PACKAGES_PERSONAL_ACCESS_TOKEN }}
# deploy:
# name: Deploy
# runs-on: ubuntu-22.04
# needs: cleanup
# if: ${{ github.event_name != 'pull_request' && !startsWith( github.ref_name, 'dependabot/' ) }}
# strategy:
# fail-fast: false
# matrix:
# name: [ Ubuntu, Windows ]
# include:
# - name: Ubuntu
# ssh: ssh-ubuntu-server
# suffix: ubuntu
# - name: Windows
# ssh: ssh-windows-server
# suffix: windows
# concurrency:
# group: service-deploy-${{ matrix.ssh }}
# cancel-in-progress: true
# permissions:
# contents: read
# steps:
# - name: Clone repository
# uses: actions/checkout@v4
# - name: Download build artifact
# uses: actions/download-artifact@v3
# with:
# name: ${{ env.ARTIFACT_NAME }}
# path: ~/artifact
# - name: Install Cloudflare Tunnel
# run: |
# sudo mkdir --parents --mode 0755 /usr/share/keyrings
# curl --fail --show-error --silent --location https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg > /dev/null
# echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared jammy main' | sudo tee /etc/apt/sources.list.d/cloudflared.list
# sudo apt-get update
# sudo apt-get install --no-install-recommends --yes cloudflared
# - name: Save SSH private key
# run: |
# umask 077
# mkdir --verbose --parents ~/.ssh
# echo ${{ secrets.SSH_PRIVATE_KEY }} | base64 --decode > ~/.ssh/github-actions
# - name: Update Docker image
# continue-on-error: true
# run: |
# ssh \
# -o 'BatchMode Yes' \
# -o 'ConnectTimeout 30' \
# -o 'UpdateHostKeys No' \
# -o 'StrictHostKeyChecking No' \
# -o 'IdentityFile ~/.ssh/github-actions' \
# -o 'IdentitiesOnly Yes' \
# -o 'ProxyCommand cloudflared access ssh --hostname %h --service-token-id ${{ secrets.CLOUDFLARE_ACCESS_ID }} --service-token-secret ${{ secrets.CLOUDFLARE_ACCESS_SECRET }}' \
# ${{ secrets.SSH_USER_NAME }}@${{ matrix.ssh }}.${{ secrets.SSH_DOMAIN_NAME }} \
# 'docker image pull ${{ env.DOCKER_REGISTRY_DOMAIN }}/${{ github.repository_owner }}/${{ env.DOCKER_IMAGE_NAME }}:main-${{ matrix.suffix }}; docker image prune --force'
# - name: Transfer build artifact (Ubuntu)
# if: ${{ matrix.name == 'Ubuntu' }}
# continue-on-error: true
# run: |
# ssh \
# -o 'BatchMode Yes' \
# -o 'ConnectTimeout 30' \
# -o 'UpdateHostKeys No' \
# -o 'StrictHostKeyChecking No' \
# -o 'IdentityFile ~/.ssh/github-actions' \
# -o 'IdentitiesOnly Yes' \
# -o 'ProxyCommand cloudflared access ssh --hostname %h --service-token-id ${{ secrets.CLOUDFLARE_ACCESS_ID }} --service-token-secret ${{ secrets.CLOUDFLARE_ACCESS_SECRET }}' \
# ${{ secrets.SSH_USER_NAME }}@${{ matrix.ssh }}.${{ secrets.SSH_DOMAIN_NAME }} \
# 'rm --verbose --recursive --force ~/server-monitor/artifact/'
# scp \
# -o 'BatchMode Yes' \
# -o 'ConnectTimeout 30' \
# -o 'UpdateHostKeys No' \
# -o 'StrictHostKeyChecking No' \
# -o 'IdentityFile ~/.ssh/github-actions' \
# -o 'IdentitiesOnly Yes' \
# -o 'ProxyCommand cloudflared access ssh --hostname %h --service-token-id ${{ secrets.CLOUDFLARE_ACCESS_ID }} --service-token-secret ${{ secrets.CLOUDFLARE_ACCESS_SECRET }}' \
# -r ~/artifact/ \
# ${{ secrets.SSH_USER_NAME }}@${{ matrix.ssh }}.${{ secrets.SSH_DOMAIN_NAME }}:~/server-monitor/artifact/
# - name: Transfer build artifact (Windows)
# if: ${{ matrix.name == 'Windows' }}
# continue-on-error: true
# run: |
# ssh \
# -o 'BatchMode Yes' \
# -o 'ConnectTimeout 30' \
# -o 'UpdateHostKeys No' \
# -o 'StrictHostKeyChecking No' \
# -o 'IdentityFile ~/.ssh/github-actions' \
# -o 'IdentitiesOnly Yes' \
# -o 'ProxyCommand cloudflared access ssh --hostname %h --service-token-id ${{ secrets.CLOUDFLARE_ACCESS_ID }} --service-token-secret ${{ secrets.CLOUDFLARE_ACCESS_SECRET }}' \
# ${{ secrets.SSH_USER_NAME }}@${{ matrix.ssh }}.${{ secrets.SSH_DOMAIN_NAME }} \
# 'Remove-Item -Path "$HOME/Server Monitor/Artifact" -Recurse -Force'
# scp \
# -o 'BatchMode Yes' \
# -o 'ConnectTimeout 30' \
# -o 'UpdateHostKeys No' \
# -o 'StrictHostKeyChecking No' \
# -o 'IdentityFile ~/.ssh/github-actions' \
# -o 'IdentitiesOnly Yes' \
# -o 'ProxyCommand cloudflared access ssh --hostname %h --service-token-id ${{ secrets.CLOUDFLARE_ACCESS_ID }} --service-token-secret ${{ secrets.CLOUDFLARE_ACCESS_SECRET }}' \
# -r ~/artifact/ \
# ${{ secrets.SSH_USER_NAME }}@${{ matrix.ssh }}.${{ secrets.SSH_DOMAIN_NAME }}:"'Server Monitor/Artifact'"
release:
name: Release
runs-on: ubuntu-22.04
needs: launch
defaults:
run:
working-directory: Service
if: ${{ github.event_name == 'push' && github.ref_type == 'tag' }}
permissions:
contents: write
steps:
- name: Clone repository
uses: actions/checkout@v4
- name: Download build artifact
uses: actions/download-artifact@v3
with:
name: ${{ env.ARTIFACT_NAME }}
path: Service/artifact
- name: Bundle build artifacts
run: zip -r ${{ env.ARTIFACT_NAME }}.zip artifact
- name: Create draft release
uses: softprops/action-gh-release@v1
with:
draft: true
tag_name: ${{ github.ref_name }}
files: Service/${{ env.ARTIFACT_NAME }}.zip
token: ${{ secrets.GITHUB_TOKEN }}