Browse Source

Add project CI config and others.

master
yangxiaodong 7 years ago
parent
commit
d477e60271
14 changed files with 594 additions and 11 deletions
  1. +19
    -0
      .travis.yml
  2. +7
    -1
      CAP.sln
  3. +23
    -0
      CHANGELOG.md
  4. +46
    -0
      CODE_OF_CONDUCT.md
  5. +40
    -0
      ConfigureMSDTC.ps1
  6. +0
    -0
      LICENSE.txt
  7. +10
    -10
      appveyor.yml
  8. +100
    -0
      build.cake
  9. +183
    -0
      build.ps1
  10. +3
    -0
      build.sh
  11. +16
    -0
      build/common.props
  12. +2
    -0
      build/index.cake
  13. +25
    -0
      build/util.cake
  14. +120
    -0
      build/version.cake

+ 19
- 0
.travis.yml View File

@@ -0,0 +1,19 @@
language: csharp
sudo: required
dist: trusty
mono: none
dotnet: 1.0.0

install:
- export DOTNET_CLI_TELEMETRY_OPTOUT=1
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then rvm get stable; brew update; brew install openssl; fi
os:
- linux
- osx
osx_image: xcode7.3
before_script:
- chmod a+x ./build.sh
script:
- ./build.sh
notifications:
email: false

+ 7
- 1
CAP.sln View File

@@ -9,9 +9,15 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{C09CDAB0-6
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{57A8A8E5-5715-41BF-A0A6-46B819933FBC}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{57A8A8E5-5715-41BF-A0A6-46B819933FBC}"
ProjectSection(SolutionItems) = preProject ProjectSection(SolutionItems) = preProject
.gitattributes = .gitattributes
.gitignore = .gitignore .gitignore = .gitignore
.travis.yml = .travis.yml
appveyor.yml = appveyor.yml
CAP.vssettings = CAP.vssettings CAP.vssettings = CAP.vssettings
LICENSE = LICENSE
CHANGELOG.md = CHANGELOG.md
CODE_OF_CONDUCT.md = CODE_OF_CONDUCT.md
ConfigureMSDTC.ps1 = ConfigureMSDTC.ps1
LICENSE.txt = LICENSE.txt
README.md = README.md README.md = README.md
EndProjectSection EndProjectSection
EndProject EndProject


+ 23
- 0
CHANGELOG.md View File

@@ -0,0 +1,23 @@
# Change Log
All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).

## [Unreleased]
_Nothing yet..._

## [0.7.0] - 2017-06-08
### Changed
- SqlServer: Set migration history's table name and schema.

### Fixed
- Services not being disposed correctly after a job execution. [#4](https://github.com/mrahhal/MR.AspNetCore.Jobs/issues/4)

## [0.6.0] - 2017-04-22
### Changed
- SqlServer: Move to using EFCore to manage internal migrations and connections to the database.

[Unreleased]: https://github.com/mrahhal/MR.AspNetCore.Jobs/compare/0.7.0...HEAD
[0.7.0]: https://github.com/mrahhal/MR.AspNetCore.Jobs/compare/0.6.0...0.7.0
[0.6.0]: https://github.com/mrahhal/MR.AspNetCore.Jobs/compare/0.5.0...0.6.0

+ 46
- 0
CODE_OF_CONDUCT.md View File

@@ -0,0 +1,46 @@
# Contributor Covenant Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment include:

* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at m.r992@hotmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]

[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/

+ 40
- 0
ConfigureMSDTC.ps1 View File

@@ -0,0 +1,40 @@
# ————————————
# Enable MSDTC
# ————————————

Write-Host "Enabling MSDTC..." -ForegroundColor Yellow
$DTCSecurity = "Incoming"
$RegPath = "HKLM:\SOFTWARE\Microsoft\MSDTC\"

#Set Security and MSDTC path

$RegSecurityPath = "$RegPath\Security"

Set-ItemProperty –path $RegSecurityPath –name "NetworkDtcAccess" –value 1
Set-ItemProperty –path $RegSecurityPath –name "NetworkDtcAccessClients" –value 1
Set-ItemProperty –path $RegSecurityPath –name "NetworkDtcAccessTransactions" –value 1
Set-ItemProperty –path $RegSecurityPath –name "NetworkDtcAccessInbound" –value 1
Set-ItemProperty –path $RegSecurityPath –name "NetworkDtcAccessOutbound" –value 1
Set-ItemProperty –path $RegSecurityPath –name "LuTransactions" –value 1

if ($DTCSecurity –eq "None")
{
Set-ItemProperty –path $RegPath –name "TurnOffRpcSecurity" –value 1
Set-ItemProperty –path $RegPath –name "AllowOnlySecureRpcCalls" –value 0
Set-ItemProperty –path $RegPath –name "FallbackToUnsecureRPCIfNecessary" –value 0
}
elseif ($DTCSecurity –eq "Incoming")
{
Set-ItemProperty –path $RegPath –name "TurnOffRpcSecurity" –value 0
Set-ItemProperty –path $RegPath –name "AllowOnlySecureRpcCalls" –value 0
Set-ItemProperty –path $RegPath –name "FallbackToUnsecureRPCIfNecessary" –value 1
}
else
{
Set-ItemProperty –path $RegPath –name "TurnOffRpcSecurity" –value 0
Set-ItemProperty –path $RegPath –name "AllowOnlySecureRpcCalls" –value 1
Set-ItemProperty –path $RegPath –name "FallbackToUnsecureRPCIfNecessary" –value 0
}

Restart-Service MSDTC
Write-Host "——MSDTC has been configured—–" –foregroundcolor green

LICENSE → LICENSE.txt View File


+ 10
- 10
appveyor.yml View File

@@ -3,20 +3,20 @@ os: Visual Studio 2015
environment: environment:
BUILDING_ON_PLATFORM: win BUILDING_ON_PLATFORM: win
BuildEnvironment: appveyor BuildEnvironment: appveyor
# Jobs_SqlServer_ConnectionStringTemplate: Server=.\SQL2012SP1;Database={0};User ID=sa;Password=Password12!
Cap_SqlServer_ConnectionStringTemplate: Server=.\SQL2012SP1;Database={0};User ID=sa;Password=Password12!
services: services:
- mssql2012sp1 - mssql2012sp1
build_script: build_script:
#- ps: ./ConfigureMSDTC.ps1
- ps: ./ConfigureMSDTC.ps1
- ps: ./build.ps1 - ps: ./build.ps1
test: off test: off
artifacts: artifacts:
- path: artifacts/packages/*.nupkg - path: artifacts/packages/*.nupkg
#deploy:
# provider: NuGet
# on:
# appveyor_repo_tag: true
# api_key:
# secure: PWCeOQ12fgAhPiBjgkBAqHbvaPQArarsO2sI+8KCeXjBjE+AHaMIMW8b7efmDzQ6
# skip_symbols: true
# artifact: /artifacts\/packages\/.+\.nupkg/
deploy:
provider: NuGet
on:
appveyor_repo_tag: true
api_key:
secure: P4da9c6a6-00e1-47d0-a821-b62380362dc9
skip_symbols: true
artifact: /artifacts\/packages\/.+\.nupkg/

+ 100
- 0
build.cake View File

@@ -0,0 +1,100 @@
#addin "nuget:https://www.nuget.org/api/v2?package=Newtonsoft.Json&version=9.0.1"

#load "./build/index.cake"

var target = Argument("target", "Default");

var build = BuildParameters.Create(Context);
var util = new Util(Context, build);

Task("Clean")
.Does(() =>
{
if (DirectoryExists("./artifacts"))
{
DeleteDirectory("./artifacts", true);
}
});

Task("Restore")
.IsDependentOn("Clean")
.Does(() =>
{
var settings = new DotNetCoreRestoreSettings
{
ArgumentCustomization = args =>
{
args.Append($"/p:VersionSuffix={build.Version.Suffix}");
return args;
}
};
DotNetCoreRestore(settings);
});

Task("Build")
.IsDependentOn("Restore")
.Does(() =>
{
var settings = new DotNetCoreBuildSettings
{
Configuration = build.Configuration,
VersionSuffix = build.Version.Suffix,
ArgumentCustomization = args =>
{
args.Append($"/p:InformationalVersion={build.Version.VersionWithSuffix()}");
return args;
}
};
foreach (var project in build.ProjectFiles)
{
DotNetCoreBuild(project.FullPath, settings);
}
});

Task("Test")
.IsDependentOn("Build")
.Does(() =>
{
foreach (var testProject in build.TestProjectFiles)
{
DotNetCoreTest(testProject.FullPath);
}
});

Task("Pack")
.Does(() =>
{
var settings = new DotNetCorePackSettings
{
Configuration = build.Configuration,
VersionSuffix = build.Version.Suffix,
OutputDirectory = "./artifacts/packages"
};
foreach (var project in build.ProjectFiles)
{
DotNetCorePack(project.FullPath, settings);
}
});

Task("Default")
.IsDependentOn("Build")
.IsDependentOn("Test")
.IsDependentOn("Pack")
.Does(() =>
{
util.PrintInfo();
});

Task("Version")
.Does(() =>
{
Information($"{build.FullVersion()}");
});

Task("Print")
.Does(() =>
{
util.PrintInfo();
});

RunTarget(target);

+ 183
- 0
build.ps1 View File

@@ -0,0 +1,183 @@
<#

.SYNOPSIS
This is a Powershell script to bootstrap a Cake build.

.DESCRIPTION
This Powershell script will download NuGet if missing, restore NuGet tools (including Cake)
and execute your Cake build script with the parameters you provide.

.PARAMETER Script
The build script to execute.
.PARAMETER Target
The build script target to run.
.PARAMETER Configuration
The build configuration to use.
.PARAMETER Verbosity
Specifies the amount of information to be displayed.
.PARAMETER Experimental
Tells Cake to use the latest Roslyn release.
.PARAMETER WhatIf
Performs a dry run of the build script.
No tasks will be executed.
.PARAMETER Mono
Tells Cake to use the Mono scripting engine.
.PARAMETER SkipToolPackageRestore
Skips restoring of packages.
.PARAMETER ScriptArgs
Remaining arguments are added here.

.LINK
http://cakebuild.net

#>

[CmdletBinding()]
Param(
[string]$Script = "build.cake",
[string]$Target = "Default",
[ValidateSet("Release", "Debug")]
[string]$Configuration = "Debug",
[ValidateSet("Quiet", "Minimal", "Normal", "Verbose", "Diagnostic")]
[string]$Verbosity = "Normal",
[switch]$Experimental = $true,
[Alias("DryRun","Noop")]
[switch]$WhatIf,
[switch]$Mono,
[switch]$SkipToolPackageRestore,
[Parameter(Position=0,Mandatory=$false,ValueFromRemainingArguments=$true)]
[string[]]$ScriptArgs
)

[Reflection.Assembly]::LoadWithPartialName("System.Security") | Out-Null
function MD5HashFile([string] $filePath)
{
if ([string]::IsNullOrEmpty($filePath) -or !(Test-Path $filePath -PathType Leaf))
{
return $null
}

[System.IO.Stream] $file = $null;
[System.Security.Cryptography.MD5] $md5 = $null;
try
{
$md5 = [System.Security.Cryptography.MD5]::Create()
$file = [System.IO.File]::OpenRead($filePath)
return [System.BitConverter]::ToString($md5.ComputeHash($file))
}
finally
{
if ($file -ne $null)
{
$file.Dispose()
}
}
}

Write-Host "Preparing to run build script..."

if(!$PSScriptRoot){
$PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent
}

$TOOLS_DIR = Join-Path $PSScriptRoot "tools"
$NUGET_EXE = Join-Path $TOOLS_DIR "nuget.exe"
$CAKE_EXE = Join-Path $TOOLS_DIR "Cake/Cake.exe"
$NUGET_URL = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe"
$PACKAGES_CONFIG = Join-Path $TOOLS_DIR "packages.config"
$PACKAGES_CONFIG_MD5 = Join-Path $TOOLS_DIR "packages.config.md5sum"

# Should we use mono?
$UseMono = "";
if($Mono.IsPresent) {
Write-Verbose -Message "Using the Mono based scripting engine."
$UseMono = "-mono"
}

# Should we use the new Roslyn?
$UseExperimental = "";
if($Experimental.IsPresent -and !($Mono.IsPresent)) {
Write-Verbose -Message "Using experimental version of Roslyn."
$UseExperimental = "-experimental"
}

# Is this a dry run?
$UseDryRun = "";
if($WhatIf.IsPresent) {
$UseDryRun = "-dryrun"
}

# Make sure tools folder exists
if ((Test-Path $PSScriptRoot) -and !(Test-Path $TOOLS_DIR)) {
Write-Verbose -Message "Creating tools directory..."
New-Item -Path $TOOLS_DIR -Type directory | out-null
}

# Make sure that packages.config exist.
if (!(Test-Path $PACKAGES_CONFIG)) {
Write-Verbose -Message "Downloading packages.config..."
try { (New-Object System.Net.WebClient).DownloadFile("http://cakebuild.net/download/bootstrapper/packages", $PACKAGES_CONFIG) } catch {
Throw "Could not download packages.config."
}
}

# Try find NuGet.exe in path if not exists
if (!(Test-Path $NUGET_EXE)) {
Write-Verbose -Message "Trying to find nuget.exe in PATH..."
$existingPaths = $Env:Path -Split ';' | Where-Object { (![string]::IsNullOrEmpty($_)) -and (Test-Path $_) }
$NUGET_EXE_IN_PATH = Get-ChildItem -Path $existingPaths -Filter "nuget.exe" | Select -First 1
if ($NUGET_EXE_IN_PATH -ne $null -and (Test-Path $NUGET_EXE_IN_PATH.FullName)) {
Write-Verbose -Message "Found in PATH at $($NUGET_EXE_IN_PATH.FullName)."
$NUGET_EXE = $NUGET_EXE_IN_PATH.FullName
}
}

# Try download NuGet.exe if not exists
if (!(Test-Path $NUGET_EXE)) {
Write-Verbose -Message "Downloading NuGet.exe..."
try {
(New-Object System.Net.WebClient).DownloadFile($NUGET_URL, $NUGET_EXE)
} catch {
Throw "Could not download NuGet.exe."
}
}

# Save nuget.exe path to environment to be available to child processed
$ENV:NUGET_EXE = $NUGET_EXE

# Restore tools from NuGet?
if(-Not $SkipToolPackageRestore.IsPresent) {
Push-Location
Set-Location $TOOLS_DIR

# Check for changes in packages.config and remove installed tools if true.
[string] $md5Hash = MD5HashFile($PACKAGES_CONFIG)
if((!(Test-Path $PACKAGES_CONFIG_MD5)) -Or
($md5Hash -ne (Get-Content $PACKAGES_CONFIG_MD5 ))) {
Write-Verbose -Message "Missing or changed package.config hash..."
Remove-Item * -Recurse -Exclude packages.config,nuget.exe
}

Write-Verbose -Message "Restoring tools from NuGet..."
$NuGetOutput = Invoke-Expression "&`"$NUGET_EXE`" install -ExcludeVersion -OutputDirectory `"$TOOLS_DIR`""

if ($LASTEXITCODE -ne 0) {
Throw "An error occured while restoring NuGet tools."
}
else
{
$md5Hash | Out-File $PACKAGES_CONFIG_MD5 -Encoding "ASCII"
}
Write-Verbose -Message ($NuGetOutput | out-string)
Pop-Location
}

# Make sure that Cake has been installed.
if (!(Test-Path $CAKE_EXE)) {
Throw "Could not find Cake.exe at $CAKE_EXE"
}

# Start Cake
Write-Host "Running build script..."
Invoke-Expression "& `"$CAKE_EXE`" `"$Script`" -target=`"$Target`" -configuration=`"$Configuration`" -verbosity=`"$Verbosity`" $UseMono $UseDryRun $UseExperimental $ScriptArgs"
exit $LASTEXITCODE

+ 3
- 0
build.sh View File

@@ -0,0 +1,3 @@
dotnet --info
dotnet restore
dotnet test test/DotNetCore.CAP.Test/DotNetCore.CAP.Test.csproj -f netcoreapp1.1

+ 16
- 0
build/common.props View File

@@ -0,0 +1,16 @@
<Project>

<Import Project="version.props" />

<PropertyGroup Label="Build">
<TargetFrameworks>netstandard1.6</TargetFrameworks>
</PropertyGroup>

<PropertyGroup Label="Package">
<Product>Cap</Product>
<Authors>Savorboard</Authors>
<PackageProjectUrl>https://github.com/ouraspnet/cap</PackageProjectUrl>
<PackageLicenseUrl>https://github.com/ouraspnet/cap/blob/master/LICENSE</PackageLicenseUrl>
</PropertyGroup>

</Project>

+ 2
- 0
build/index.cake View File

@@ -0,0 +1,2 @@
#load "./util.cake"
#load "./version.cake"

+ 25
- 0
build/util.cake View File

@@ -0,0 +1,25 @@
public class Util
{
public Util(ICakeContext context, BuildParameters build)
{
Context = context;
Build = build;
}

public ICakeContext Context { get; set; }
public BuildParameters Build { get; set; }

public void PrintInfo()
{
Context.Information($@"
Version: {Build.FullVersion()}
Configuration: {Build.Configuration}
");
}

public static string CreateStamp()
{
var seconds = (long)(DateTime.UtcNow - new DateTime(2017, 1, 1)).TotalSeconds;
return seconds.ToString().PadLeft(11, (char)'0');
}
}

+ 120
- 0
build/version.cake View File

@@ -0,0 +1,120 @@
using System.Xml;

public class BuildParameters
{
public BuildParameters(ICakeContext context)
{
Context = context;
}

public ICakeContext Context { get; }
public BuildVersion Version { get; private set; }
public string Configuration { get; private set; }
public bool IsTagged { get; private set; }
public bool IsCI { get; private set; }
public DirectoryPathCollection Projects { get; set; }
public DirectoryPathCollection TestProjects { get; set; }
public FilePathCollection ProjectFiles { get; set; }
public FilePathCollection TestProjectFiles { get; set; }

public static BuildParameters Create(ICakeContext context)
{
var buildParameters = new BuildParameters(context);
buildParameters.Initialize();
return buildParameters;
}

public string FullVersion()
{
return Version.VersionWithSuffix();
}

private void Initialize()
{
InitializeCore();
InitializeVersion();
}

private void InitializeCore()
{
Projects = Context.GetDirectories("./src/*");
TestProjects = Context.GetDirectories("./test/*");
ProjectFiles = Context.GetFiles("./src/*/*.csproj");
TestProjectFiles = Context.GetFiles("./test/*/*.csproj");

var buildSystem = Context.BuildSystem();
if (!buildSystem.IsLocalBuild)
{
IsCI = true;
if ((buildSystem.IsRunningOnAppVeyor && buildSystem.AppVeyor.Environment.Repository.Tag.IsTag) ||
(buildSystem.IsRunningOnTravisCI && string.IsNullOrWhiteSpace(buildSystem.TravisCI.Environment.Build.Tag)))
{
IsTagged = true;
}
}

Configuration = Context.Argument("Configuration", "Debug");
if (IsCI)
{
Configuration = "Release";
}
}

private void InitializeVersion()
{
var versionFile = Context.File("./build/version.props");
var content = System.IO.File.ReadAllText(versionFile.Path.FullPath);

XmlDocument doc = new XmlDocument();
doc.LoadXml(content);

var versionMajor = doc.DocumentElement.SelectSingleNode("/Project/PropertyGroup/VersionMajor").InnerText;
var versionMinor = doc.DocumentElement.SelectSingleNode("/Project/PropertyGroup/VersionMinor").InnerText;
var versionPatch = doc.DocumentElement.SelectSingleNode("/Project/PropertyGroup/VersionPatch").InnerText;
var versionQuality = doc.DocumentElement.SelectSingleNode("/Project/PropertyGroup/VersionQuality").InnerText;
versionQuality = string.IsNullOrWhiteSpace(versionQuality) ? null : versionQuality;

var suffix = versionQuality;
if (!IsTagged)
{
suffix += (IsCI ? "ci-" : "dv-") + Util.CreateStamp();
}
suffix = string.IsNullOrWhiteSpace(suffix) ? null : suffix;

Version =
new BuildVersion(int.Parse(versionMajor), int.Parse(versionMinor), int.Parse(versionPatch), versionQuality);
Version.Suffix = suffix;
}
}

public class BuildVersion
{
public BuildVersion(int major, int minor, int patch, string quality)
{
Major = major;
Minor = minor;
Patch = patch;
Quality = quality;
}

public int Major { get; set; }
public int Minor { get; set; }
public int Patch { get; set; }
public string Quality { get; set; }
public string Suffix { get; set; }

public string VersionWithoutQuality()
{
return $"{Major}.{Minor}.{Patch}";
}

public string Version()
{
return VersionWithoutQuality() + (Quality == null ? string.Empty : $"-{Quality}");
}

public string VersionWithSuffix()
{
return Version() + (Suffix == null ? string.Empty : $"-{Suffix}");
}
}

Loading…
Cancel
Save