Bump actions/setup-dotnet from 3 to 4 #345
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 }} |