diff --git a/.envrc b/.envrc index a63eb96..3550a30 100644 --- a/.envrc +++ b/.envrc @@ -1 +1 @@ -use asdf +use flake diff --git a/.gitignore b/.gitignore index 50364fe..bd1eeef 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,9 @@ obj/ .idea/ _ReSharper.Caches/ node_modules/ +.direnv/ +coverage/ +tests/artifacts/ +TestResults/ +.config/ +.direnv/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index faa6ded..a571da1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,42 +1,25 @@ stages: - build + - test + - release default: - before_script: - - curl -sL https://deb.nodesource.com/setup_15.x | bash - - - apt-get install -y nodejs + image: registry.gitlab.com/dmoonfire/nix-flake-docker:latest build: - image: mcr.microsoft.com/dotnet/sdk:5.0 stage: build script: - # Set up the environment. - - npx npm install --ci - - npx commitlint-gitlab-ci -x @commitlint/config-conventional - - # Build and test everything. - - dotnet restore - - dotnet build - - 'dotnet test --test-adapter-path:. --logger:"junit;LogFilePath=../artifacts/{assembly}-test-result.xml;MethodFormat=Default;FailureBodyFormat=Verbose" --collect:"XPlat Code Coverage"' - - # Summarize the output for Gitlab CI reporting. - - dotnet new tool-manifest - - dotnet tool install dotnet-reportgenerator-globaltool - - dotnet tool run reportgenerator -reports:src/*/TestResults/*/coverage.cobertura.xml -targetdir:./coverage "-reporttypes:Cobertura;TextSummary" - - grep "Line coverage" coverage/Summary.txt - - # Perform the release. - - npx semantic-release - + - nix develop --command scripts/ci-build.sh rules: - - if: '$CI_COMMIT_TITLE =~ /^chore\(release\)/' - when: never - - if: '$CI_COMMIT_TAG' - when: never - - if: '$CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH' - when: never - - when: on_success + - if: $CI_COMMIT_BRANCH +test: + stage: test + script: + - nix develop --command scripts/ci-test.sh + rules: + - if: $CI_COMMIT_BRANCH + - if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME artifacts: when: always paths: @@ -49,3 +32,10 @@ build: - ./**/*test-result.xml cobertura: - ./coverage/Cobertura.xml + +release: + stage: release + script: + - nix develop --command scripts/ci-release.sh + rules: + - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH diff --git a/.tool-versions b/.tool-versions deleted file mode 100644 index f84212e..0000000 --- a/.tool-versions +++ /dev/null @@ -1,3 +0,0 @@ -dotnet-core 5.0.100 -yarn 1.22.10 -nodejs 15.0.1 diff --git a/commitlint.config.js b/commitlint.config.js index db74d15..29519fc 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -1,3 +1,6 @@ module.exports = { extends: ["@commitlint/config-conventional"], + rules: { + "body-max-line-length": [0], + }, }; diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..a918885 --- /dev/null +++ b/flake.lock @@ -0,0 +1,42 @@ +{ + "nodes": { + "flake-utils": { + "locked": { + "lastModified": 1638122382, + "narHash": "sha256-sQzZzAbvKEqN9s0bzWuYmRaA03v40gaJ4+iL1LXjaeI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "74f7e4319258e287b0f9cb95426c9853b282730b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1638198142, + "narHash": "sha256-plU9b8r4St6q4U7VHtG9V7oF8k9fIpfXl/KDaZLuY9k=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "8a308775674e178495767df90c419425474582a1", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixos-unstable", + "type": "indirect" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..d6a1166 --- /dev/null +++ b/flake.nix @@ -0,0 +1,17 @@ +{ + description = "A .NET core library for building tools"; + + inputs = { + nixpkgs.url = "nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { self, nixpkgs, flake-utils }: + flake-utils.lib.eachDefaultSystem (system: + let pkgs = nixpkgs.legacyPackages.${system}; + in { + devShell = pkgs.mkShell { + buildInputs = [ pkgs.dotnet-sdk_5 pkgs.nodejs-16_x pkgs.nixfmt ]; + }; + }); +} diff --git a/release.config.js b/release.config.js index 34d154d..b217e78 100644 --- a/release.config.js +++ b/release.config.js @@ -1,6 +1,7 @@ module.exports = { + extends: ["@commitlint/config-conventional"], branches: ["main"], - message: "chore(release): v${nextRelease.version}\n\n${nextRelease.notes}", + message: "chore(release): v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}", plugins: [ [ "@semantic-release/commit-analyzer", @@ -10,7 +11,12 @@ module.exports = { ], "@semantic-release/release-notes-generator", "@semantic-release/npm", - "semantic-release-dotnet", + [ + "semantic-release-dotnet", + { + paths: ["src/Directory.Build.props"], + }, + ], [ "semantic-release-nuget", { diff --git a/scripts/ci-build.sh b/scripts/ci-build.sh new file mode 100755 index 0000000..f49cd78 --- /dev/null +++ b/scripts/ci-build.sh @@ -0,0 +1,3 @@ +npm install --ci +dotnet restore +dotnet build diff --git a/scripts/ci-release.sh b/scripts/ci-release.sh new file mode 100755 index 0000000..72699fd --- /dev/null +++ b/scripts/ci-release.sh @@ -0,0 +1,5 @@ +npm install --ci +dotnet restore +dotnet build +npm install --ci +npx semantic-release diff --git a/scripts/ci-test.sh b/scripts/ci-test.sh new file mode 100755 index 0000000..cc073a6 --- /dev/null +++ b/scripts/ci-test.sh @@ -0,0 +1,9 @@ +npm install --ci +npx commitlint-gitlab-ci -x @commitlint/config-conventional +dotnet restore +dotnet build +dotnet test --test-adapter-path:. --logger:"junit;LogFilePath=../artifacts/{assembly}-test-result.xml;MethodFormat=Default;FailureBodyFormat=Verbose" --collect:"XPlat Code Coverage" +dotnet new tool-manifest +dotnet tool install dotnet-reportgenerator-globaltool +dotnet tool run reportgenerator -reports:src/*/TestResults/*/coverage.cobertura.xml -targetdir:./coverage "-reporttypes:Cobertura;TextSummary" +grep "Line coverage" coverage/Summary.txt