idk lets try this
This commit is contained in:
parent
cf64b3d548
commit
c7a7fe517b
14 changed files with 373 additions and 0 deletions
8
.github/actions/expand-tokens/Dockerfile
vendored
Normal file
8
.github/actions/expand-tokens/Dockerfile
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
FROM mcr.microsoft.com/powershell
|
||||
WORKDIR /action
|
||||
|
||||
RUN pwsh -c '$ProgressPreference = "SilentlyContinue"; Install-Module Axinom.DevOpsTooling -Scope AllUsers -AllowPrerelease -Force'
|
||||
|
||||
COPY *.ps1 .
|
||||
|
||||
ENTRYPOINT ["pwsh", "-c", "& /action/entrypoint.ps1"]
|
14
.github/actions/expand-tokens/action.yml
vendored
Normal file
14
.github/actions/expand-tokens/action.yml
vendored
Normal file
|
@ -0,0 +1,14 @@
|
|||
name: 'Expand tokens'
|
||||
description: 'Replaces `__TOKENS__` with the values of equivalent environment variables in files.'
|
||||
inputs:
|
||||
path:
|
||||
description: 'Path to the file or directory to process.'
|
||||
required: true
|
||||
filenames:
|
||||
description: 'Filename filter, used if path is a directory.'
|
||||
recursive:
|
||||
description: 'Whether to recursively search for files, used if path is a directory.'
|
||||
default: false
|
||||
runs:
|
||||
using: 'docker'
|
||||
image: 'Dockerfile'
|
7
.github/actions/expand-tokens/entrypoint.ps1
vendored
Normal file
7
.github/actions/expand-tokens/entrypoint.ps1
vendored
Normal file
|
@ -0,0 +1,7 @@
|
|||
$ErrorActionPreference = "Stop"
|
||||
|
||||
Import-Module Axinom.DevOpsTooling
|
||||
|
||||
$path = Join-Path $env:GITHUB_WORKSPACE $env:INPUT_PATH
|
||||
|
||||
Expand-Tokens -path $path -filenames $env:INPUT_FILENAMES -recursive:([bool]$env:INPUT_RECURSIVE)
|
8
.github/actions/make-version-string/Dockerfile
vendored
Normal file
8
.github/actions/make-version-string/Dockerfile
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
FROM mcr.microsoft.com/powershell
|
||||
WORKDIR /action
|
||||
|
||||
RUN pwsh -c '$ProgressPreference = "SilentlyContinue"; Install-Module Axinom.DevOpsTooling -Scope AllUsers -AllowPrerelease -Force'
|
||||
|
||||
COPY *.ps1 .
|
||||
|
||||
ENTRYPOINT ["pwsh", "-c", "& /action/entrypoint.ps1"]
|
12
.github/actions/make-version-string/action.yml
vendored
Normal file
12
.github/actions/make-version-string/action.yml
vendored
Normal file
|
@ -0,0 +1,12 @@
|
|||
name: 'Create the version string'
|
||||
description: 'Generates a version string of the form [branch-]1.2.3-NNNNNNNNNNN-CCCCCCC, where N is an incrementing value and C identifies the commit, with an optional branch prefix. Fields lengths are unspecified and may increase in future versions.'
|
||||
inputs:
|
||||
assemblyInfoPath:
|
||||
description: 'Path to a .NET style AssemblyInfo file containing the numeric version component.'
|
||||
required: true
|
||||
outputs:
|
||||
versionstring:
|
||||
description: 'The generated version string'
|
||||
runs:
|
||||
using: 'docker'
|
||||
image: 'Dockerfile'
|
8
.github/actions/make-version-string/entrypoint.ps1
vendored
Normal file
8
.github/actions/make-version-string/entrypoint.ps1
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
$ErrorActionPreference = "Stop"
|
||||
|
||||
Import-Module Axinom.DevOpsTooling
|
||||
|
||||
$path = Join-Path $env:GITHUB_WORKSPACE $env:INPUT_ASSEMBLYINFOPATH
|
||||
|
||||
$version = Set-DotNetBuildAndVersionStrings -assemblyInfoPath $path -commitId $ENV:GITHUB_SHA
|
||||
Write-Host "::set-output name=versionstring::$version"
|
21
.github/workflows/build.yml
vendored
Normal file
21
.github/workflows/build.yml
vendored
Normal file
|
@ -0,0 +1,21 @@
|
|||
on: [push, pull_request]
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@master
|
||||
- id: make_version_string
|
||||
uses: ./.github/actions/make-version-string
|
||||
with:
|
||||
assemblyInfoPath: AssemblyInfo.cs
|
||||
- uses: ./.github/actions/expand-tokens
|
||||
env:
|
||||
VERSIONSTRING: ${{ steps.make_version_string.outputs.versionstring }}
|
||||
with:
|
||||
path: Constants.cs
|
||||
# - name: Publish to Registry
|
||||
# uses: elgohr/Publish-Docker-Github-Action@master
|
||||
# with:
|
||||
# name: sandersaares/test123
|
||||
# username: sandersaares
|
||||
# password: ${{ secrets.docker_hub_token }}
|
5
AssemblyInfo.cs
Normal file
5
AssemblyInfo.cs
Normal file
|
@ -0,0 +1,5 @@
|
|||
using System.Reflection;
|
||||
|
||||
[assembly: AssemblyCompany("prometheus-net")]
|
||||
[assembly: AssemblyProduct("Docker Stats Exporter")]
|
||||
[assembly: AssemblyVersion("1.0.0")]
|
15
Constants.cs
Normal file
15
Constants.cs
Normal file
|
@ -0,0 +1,15 @@
|
|||
using System;
|
||||
|
||||
namespace DockerExporter
|
||||
{
|
||||
static class Constants
|
||||
{
|
||||
// Will be replaced with real version string (AssemblyInfo number + build parameters) on automated build.
|
||||
public const string VersionString = "__VERSIONSTRING__";
|
||||
|
||||
/// <summary>
|
||||
/// Docker can sometimes be slow to respond. If that is the case, we just give up and try again later.
|
||||
/// </summary>
|
||||
public static readonly TimeSpan DockerCommandTimeout = TimeSpan.FromSeconds(30);
|
||||
}
|
||||
}
|
30
DockerExporter.csproj
Normal file
30
DockerExporter.csproj
Normal file
|
@ -0,0 +1,30 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||
<AssemblyName>DockerExporter</AssemblyName>
|
||||
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
|
||||
<LangVersion>preview</LangVersion>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||
<WarningsAsErrors />
|
||||
<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||
<WarningsAsErrors />
|
||||
<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Axinom.Toolkit" Version="14.0.0" />
|
||||
<PackageReference Include="Docker.DotNet" Version="3.125.2" />
|
||||
<PackageReference Include="Mono.Options" Version="5.3.0.1" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
25
DockerExporter.sln
Normal file
25
DockerExporter.sln
Normal file
|
@ -0,0 +1,25 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.29609.76
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DockerExporter", "DockerExporter.csproj", "{A961E4EB-A444-4DCD-AE0F-48F5FDBFA88F}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{A961E4EB-A444-4DCD-AE0F-48F5FDBFA88F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{A961E4EB-A444-4DCD-AE0F-48F5FDBFA88F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{A961E4EB-A444-4DCD-AE0F-48F5FDBFA88F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{A961E4EB-A444-4DCD-AE0F-48F5FDBFA88F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {645E4C22-DEE1-4A82-AD14-9C7036CA28C0}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
18
Dockerfile
Normal file
18
Dockerfile
Normal file
|
@ -0,0 +1,18 @@
|
|||
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
|
||||
WORKDIR /app
|
||||
|
||||
# Separate layers here to avoid redoing dependencies on code change.
|
||||
COPY *.sln .
|
||||
COPY DockerExporter/*.csproj ./DockerExporter/
|
||||
RUN dotnet restore
|
||||
|
||||
# Now the code.
|
||||
COPY DockerExporter/. ./DockerExporter/
|
||||
WORKDIR /app/DockerExporter
|
||||
RUN dotnet publish -c Release -o out
|
||||
|
||||
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS runtime
|
||||
WORKDIR /app
|
||||
COPY --from=build /app/DockerExporter/out ./
|
||||
|
||||
ENTRYPOINT ["dotnet", "DockerExporter.dll"]
|
47
ExporterLogic.cs
Normal file
47
ExporterLogic.cs
Normal file
|
@ -0,0 +1,47 @@
|
|||
using Axinom.Toolkit;
|
||||
using Docker.DotNet;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace DockerExporter
|
||||
{
|
||||
public sealed class ExporterLogic
|
||||
{
|
||||
public string DockerUrl { get; set; }
|
||||
|
||||
public ExporterLogic()
|
||||
{
|
||||
// Default value only valid if not running as container.
|
||||
if (Helpers.Environment.IsMicrosoftOperatingSystem())
|
||||
{
|
||||
DockerUrl = "npipe://./pipe/docker_engine";
|
||||
}
|
||||
else
|
||||
{
|
||||
DockerUrl = "unix:///var/run/docker.sock";
|
||||
}
|
||||
}
|
||||
|
||||
public async Task RunAsync(CancellationToken cancel)
|
||||
{
|
||||
_log.Info($"Connecting to Docker via {DockerUrl}");
|
||||
|
||||
var clientConfig = new DockerClientConfiguration(new Uri(DockerUrl), null, Constants.DockerCommandTimeout);
|
||||
|
||||
using (var client = clientConfig.CreateClient())
|
||||
{
|
||||
var allContainers = await client.Containers.ListContainersAsync(new Docker.DotNet.Models.ContainersListParameters
|
||||
{
|
||||
All = true
|
||||
}, cancel);
|
||||
|
||||
_log.Info(Helpers.Debug.ToDebugString(allContainers));
|
||||
}
|
||||
}
|
||||
|
||||
private static readonly LogSource _log = Log.Default;
|
||||
}
|
||||
}
|
155
Program.cs
Normal file
155
Program.cs
Normal file
|
@ -0,0 +1,155 @@
|
|||
using Axinom.Toolkit;
|
||||
using Mono.Options;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Threading;
|
||||
|
||||
namespace DockerExporter
|
||||
{
|
||||
internal sealed class Program
|
||||
{
|
||||
private readonly LogSource _log = Log.Default;
|
||||
private readonly FilteringLogListener _filteringLogListener;
|
||||
|
||||
private readonly ExporterLogic _logic = new ExporterLogic();
|
||||
|
||||
private void Run(string[] args)
|
||||
{
|
||||
// We signal this to shut down the service.
|
||||
var cancel = new CancellationTokenSource();
|
||||
|
||||
try
|
||||
{
|
||||
if (!ParseArguments(args))
|
||||
{
|
||||
Environment.ExitCode = -1;
|
||||
return;
|
||||
}
|
||||
|
||||
_log.Info(GetVersionString());
|
||||
|
||||
// Control+C will gracefully shut us down.
|
||||
Console.CancelKeyPress += (s, e) =>
|
||||
{
|
||||
_log.Info("Canceling execution due to received signal.");
|
||||
e.Cancel = true;
|
||||
cancel.Cancel();
|
||||
};
|
||||
|
||||
_logic.RunAsync(cancel.Token).WaitAndUnwrapExceptions();
|
||||
|
||||
_log.Info("Application logic execution has completed.");
|
||||
}
|
||||
catch (OperationCanceledException)
|
||||
{
|
||||
if (cancel.IsCancellationRequested)
|
||||
{
|
||||
// We really were cancelled. That's fine.
|
||||
}
|
||||
else
|
||||
{
|
||||
_log.Error("Unexpected cancellation/timeout halted execution.");
|
||||
}
|
||||
|
||||
Environment.ExitCode = -1;
|
||||
}
|
||||
catch (AggregateException ex)
|
||||
{
|
||||
foreach (var innerException in ex.InnerExceptions)
|
||||
{
|
||||
_log.Error(innerException.Message);
|
||||
_log.Error(innerException.GetType().Name);
|
||||
}
|
||||
|
||||
Environment.ExitCode = -1;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(ex.Message))
|
||||
{
|
||||
_log.Error(ex.Message);
|
||||
_log.Error(ex.GetType().Name);
|
||||
}
|
||||
|
||||
Environment.ExitCode = -1;
|
||||
}
|
||||
}
|
||||
|
||||
private bool ParseArguments(string[] args)
|
||||
{
|
||||
var showHelp = false;
|
||||
var verbose = false;
|
||||
var debugger = false;
|
||||
|
||||
var options = new OptionSet
|
||||
{
|
||||
GetVersionString(),
|
||||
"",
|
||||
"General",
|
||||
{ "h|?|help", "Displays usage instructions.", val => showHelp = val != null },
|
||||
{ "docker-url=", "URL to use for accessing Docker.", val => _logic.DockerUrl = val },
|
||||
|
||||
"",
|
||||
"Diagnostics",
|
||||
{ "verbose", "Displays extensive diagnostic information.", val => verbose = val != null },
|
||||
{ "debugger", "Requests a debugger to be attached before execution starts.", val => debugger = val != null, true },
|
||||
};
|
||||
|
||||
List<string> remainingOptions;
|
||||
|
||||
try
|
||||
{
|
||||
remainingOptions = options.Parse(args);
|
||||
|
||||
if (showHelp)
|
||||
{
|
||||
options.WriteOptionDescriptions(Console.Out);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (verbose)
|
||||
_filteringLogListener.MinimumSeverity = LogEntrySeverity.Debug;
|
||||
}
|
||||
catch (OptionException ex)
|
||||
{
|
||||
Console.WriteLine(ex.Message);
|
||||
Console.WriteLine("For usage instructions, use the --help command line parameter.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (remainingOptions.Count != 0)
|
||||
{
|
||||
Console.WriteLine("Unknown command line parameters: {0}", string.Join(" ", remainingOptions.ToArray()));
|
||||
Console.WriteLine("For usage instructions, use the --help command line parameter.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (debugger)
|
||||
Debugger.Launch();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private string GetVersionString()
|
||||
{
|
||||
return $"{typeof(Program).Namespace} v{Constants.VersionString}";
|
||||
}
|
||||
|
||||
private Program()
|
||||
{
|
||||
// We default to displaying Info or higher but allow this to be reconfiured later, if the user wishes.
|
||||
_filteringLogListener = new FilteringLogListener(new ConsoleLogListener())
|
||||
{
|
||||
MinimumSeverity = LogEntrySeverity.Info
|
||||
};
|
||||
|
||||
Log.Default.RegisterListener(_filteringLogListener);
|
||||
}
|
||||
|
||||
private static void Main(string[] args)
|
||||
{
|
||||
new Program().Run(args);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue