From 86cc89c42dd26d7e30a7b6ce5a69ce1659c37d27 Mon Sep 17 00:00:00 2001 From: Philipp Heuer Date: Thu, 21 Nov 2024 21:48:53 +0100 Subject: [PATCH] feat: add initial support for appveyor and circleci --- README.md | 4 +- go.mod | 29 +++--- go.sum | 98 +++++++------------- pkg/normalizer/appveyor/common.go | 34 +++++++ pkg/normalizer/appveyor/denormalize.go | 9 ++ pkg/normalizer/appveyor/normalize.go | 69 ++++++++++++++ pkg/normalizer/appveyor/normalize_test.go | 105 ++++++++++++++++++++++ pkg/normalizer/circleci/common.go | 34 +++++++ pkg/normalizer/circleci/denormalize.go | 9 ++ pkg/normalizer/circleci/normalize.go | 67 ++++++++++++++ pkg/normalizer/circleci/normalize_test.go | 92 +++++++++++++++++++ pkg/normalizer/normalizeci.go | 4 + pkg/projectdetails/hoster_github.go | 25 +++--- 13 files changed, 484 insertions(+), 95 deletions(-) create mode 100644 pkg/normalizer/appveyor/common.go create mode 100644 pkg/normalizer/appveyor/denormalize.go create mode 100644 pkg/normalizer/appveyor/normalize.go create mode 100644 pkg/normalizer/appveyor/normalize_test.go create mode 100644 pkg/normalizer/circleci/common.go create mode 100644 pkg/normalizer/circleci/denormalize.go create mode 100644 pkg/normalizer/circleci/normalize.go create mode 100644 pkg/normalizer/circleci/normalize_test.go diff --git a/README.md b/README.md index eb8ce33..ef55223 100644 --- a/README.md +++ b/README.md @@ -102,7 +102,9 @@ var normalized = normalizeci.RunDefaultNormalization() | NAME | SLUG | |-----------------------|------------------| +| AppVeyor | `appveyor` | | Azure DevOps Pipeline | `azure-devops` | +| CircleCI | `circleci` | | GitLab CI/CD | `gitlab-ci` | | GitHub Actions | `github-actions` | | Local Git Repository | `local` | @@ -119,14 +121,12 @@ var normalized = normalizeci.RunDefaultNormalization() | NAME | SLUG | |---------------|-----------------| -| AppVeyor | `appveyor` | | AWS CodeBuild | `aws-codebuild` | | Bamboo | `bamboo` | | Bitbucket | `bitbucket` | | Bitrise | `bitrise` | | Buddy | `buddy` | | Buildkite | `buildkite` | -| CircleCI | `circleci` | | Cirrus CI | `cirrusci` | | Codefresh | `codefresh` | | Codeship | `codeship` | diff --git a/go.mod b/go.mod index f70d957..ac8a095 100644 --- a/go.mod +++ b/go.mod @@ -1,11 +1,14 @@ module github.com/cidverse/normalizeci -go 1.21 +go 1.22.0 + +toolchain go1.23.3 require ( github.com/bwmarrin/snowflake v0.3.0 github.com/cidverse/cidverseutils/zerologconfig v0.1.0 - github.com/cidverse/go-vcs v0.0.0-20240828182626-1889ca88882a + github.com/cidverse/go-ptr v0.0.0-20240331160646-489e694bebbf + github.com/cidverse/go-vcs v0.0.0-20241119223235-10216c2ea4c7 github.com/go-playground/validator/v10 v10.23.0 github.com/google/go-github/v66 v66.0.0 github.com/gosimple/slug v1.14.0 @@ -20,16 +23,16 @@ require ( require ( dario.cat/mergo v1.0.1 // indirect - github.com/Masterminds/semver/v3 v3.3.0 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/ProtonMail/go-crypto v1.0.0 // indirect - github.com/cloudflare/circl v1.4.0 // indirect - github.com/cyphar/filepath-securejoin v0.3.1 // indirect + github.com/ProtonMail/go-crypto v1.1.2 // indirect + github.com/cloudflare/circl v1.5.0 // indirect + github.com/cyphar/filepath-securejoin v0.3.4 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/emirpasic/gods v1.18.1 // indirect - github.com/gabriel-vasile/mimetype v1.4.5 // indirect + github.com/gabriel-vasile/mimetype v1.4.7 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-git/go-billy/v5 v5.5.0 // indirect + github.com/go-git/go-billy/v5 v5.6.0 // indirect github.com/go-git/go-git/v5 v5.12.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect @@ -51,11 +54,11 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect - golang.org/x/crypto v0.27.0 // indirect - golang.org/x/net v0.29.0 // indirect - golang.org/x/sys v0.25.0 // indirect - golang.org/x/text v0.18.0 // indirect - golang.org/x/time v0.6.0 // indirect + golang.org/x/crypto v0.29.0 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.20.0 // indirect + golang.org/x/time v0.8.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 9bc917e..be893fe 100644 --- a/go.sum +++ b/go.sum @@ -1,30 +1,30 @@ dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0= -github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= -github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/ProtonMail/go-crypto v1.1.2 h1:A7JbD57ThNqh7XjmHE+PXpQ3Dqt3BrSAC0AL0Go3KS0= +github.com/ProtonMail/go-crypto v1.1.2/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0= github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE= github.com/cidverse/cidverseutils/zerologconfig v0.1.0 h1:iUJ9ANUCHH6IsM8MoeOv5Q8QvCd+iDl4X8QL/nfAdVw= github.com/cidverse/cidverseutils/zerologconfig v0.1.0/go.mod h1:X3mGXDU1BtdGk818+a0UL6vzhU9lLb8/oEslSnVQzuA= -github.com/cidverse/go-vcs v0.0.0-20240828182626-1889ca88882a h1:T66A0yhr7glvfYugnwrLYZ1QoLdsiUqJu/mr6dZ5W6Q= -github.com/cidverse/go-vcs v0.0.0-20240828182626-1889ca88882a/go.mod h1:MDqLLQ+dS5ypNlEyYM9pnkT90wak2w1v0z5NL4JXndk= -github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= -github.com/cloudflare/circl v1.4.0 h1:BV7h5MgrktNzytKmWjpOtdYrf0lkkbF8YMlBGPhJQrY= -github.com/cloudflare/circl v1.4.0/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU= +github.com/cidverse/go-ptr v0.0.0-20240331160646-489e694bebbf h1:/DLETx+e0J8mWZyOOK8dAOMrdHUpJo8KQRuMt1IymtE= +github.com/cidverse/go-ptr v0.0.0-20240331160646-489e694bebbf/go.mod h1:nvQPqid2KB17xXiiFp/Fhd+dO5lusCSuBQtOXfsd+mk= +github.com/cidverse/go-vcs v0.0.0-20241119223235-10216c2ea4c7 h1:93OqJYGhRwt6XJAoY0BbLhwolsMzQ35l3gYZCRvC4Pk= +github.com/cidverse/go-vcs v0.0.0-20241119223235-10216c2ea4c7/go.mod h1:IpqiOdOYc29PIbUOxg8v6FVMwEZYYIUeT0ogA6lYWUI= +github.com/cloudflare/circl v1.5.0 h1:hxIWksrX6XN5a1L2TI/h53AGPhNHoUBo+TD1ms9+pys= +github.com/cloudflare/circl v1.5.0/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cyphar/filepath-securejoin v0.3.1 h1:1V7cHiaW+C+39wEfpH6XlLBQo3j/PciWFrgfCLS8XrE= -github.com/cyphar/filepath-securejoin v0.3.1/go.mod h1:F7i41x/9cBF7lzCrVsYs9fuzwRZm4NQsGTBdpp6mETc= +github.com/cyphar/filepath-securejoin v0.3.4 h1:VBWugsJh2ZxJmLFSM06/0qzQyiQX2Qs0ViKrUAcqdZ8= +github.com/cyphar/filepath-securejoin v0.3.4/go.mod h1:8s/MCNJREmFK0H02MF6Ihv1nakJe4L/w3WZLHNkvlYM= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -34,14 +34,14 @@ github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= -github.com/gabriel-vasile/mimetype v1.4.5 h1:J7wGKdGu33ocBOhGy0z653k/lFKLFDPJMG8Gql0kxn4= -github.com/gabriel-vasile/mimetype v1.4.5/go.mod h1:ibHel+/kbxn9x2407k1izTA1S81ku1z/DlgOW2QE0M4= +github.com/gabriel-vasile/mimetype v1.4.7 h1:SKFKl7kD0RiPdbht0s7hFtjl489WcQ1VyPW8ZzUMYCA= +github.com/gabriel-vasile/mimetype v1.4.7/go.mod h1:GDlAgAyIRT27BhFl53XNAFtfjzOkLaF35JdEG0P7LtU= github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE= github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= -github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= -github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= +github.com/go-git/go-billy/v5 v5.6.0 h1:w2hPNtoehvJIxR00Vb4xX94qHQi/ApZfX+nBE2Cjio8= +github.com/go-git/go-billy/v5 v5.6.0/go.mod h1:sFDq7xD3fn3E0GOwUSZqHo9lrkmx8xJhA0ZrfvjBRGM= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys= @@ -99,8 +99,8 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g= github.com/maxatome/go-testdeep v1.12.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM= -github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= -github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= +github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -136,70 +136,36 @@ github.com/xanzy/go-gitlab v0.114.0 h1:0wQr/KBckwrZPfEMjRqpUz0HmsKKON9UhCYv9KDy1 github.com/xanzy/go-gitlab v0.114.0/go.mod h1:wKNKh3GkYDMOsGmnfuX+ITCmDuSDWFO0G+C4AygL9RY= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= -golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ= +golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= +golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= +golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= -golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= -golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= -golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU= +golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= -golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= -golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= -golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= +golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= +golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/pkg/normalizer/appveyor/common.go b/pkg/normalizer/appveyor/common.go new file mode 100644 index 0000000..be10a38 --- /dev/null +++ b/pkg/normalizer/appveyor/common.go @@ -0,0 +1,34 @@ +package appveyor + +// Normalizer is the implementation of the normalizer +type Normalizer struct { + version string + name string + slug string +} + +// GetName returns the name of the normalizer +func (n Normalizer) GetName() string { + return n.name +} + +// GetSlug returns the slug of the normalizer +func (n Normalizer) GetSlug() string { + return n.slug +} + +// Check if this package can handle the current environment +func (n Normalizer) Check(env map[string]string) bool { + return env["CI_SERVICE_NAME"] == "appveyor" +} + +// NewNormalizer gets a instance of the normalizer +func NewNormalizer() Normalizer { + entity := Normalizer{ + version: "0.3.0", + name: "AppVeyor", + slug: "appveyor", + } + + return entity +} diff --git a/pkg/normalizer/appveyor/denormalize.go b/pkg/normalizer/appveyor/denormalize.go new file mode 100644 index 0000000..ff12944 --- /dev/null +++ b/pkg/normalizer/appveyor/denormalize.go @@ -0,0 +1,9 @@ +package appveyor + +import ( + v1 "github.com/cidverse/normalizeci/pkg/ncispec/v1" +) + +func (n Normalizer) Denormalize(spec v1.Spec) (map[string]string, error) { + return make(map[string]string), nil +} diff --git a/pkg/normalizer/appveyor/normalize.go b/pkg/normalizer/appveyor/normalize.go new file mode 100644 index 0000000..3b105bc --- /dev/null +++ b/pkg/normalizer/appveyor/normalize.go @@ -0,0 +1,69 @@ +package appveyor + +import ( + "fmt" + "runtime" + "time" + + "github.com/cidverse/go-vcs/vcsutil" + "github.com/cidverse/normalizeci/pkg/ncispec/common" + v1 "github.com/cidverse/normalizeci/pkg/ncispec/v1" + "github.com/cidverse/normalizeci/pkg/projectdetails" + "github.com/cidverse/normalizeci/pkg/vcsrepository" + "github.com/gosimple/slug" +) + +// Normalize normalizes the environment variables into the common format +func (n Normalizer) Normalize(env map[string]string) (v1.Spec, error) { + nci := v1.Create(n.name, n.slug) + + // worker + nci.Worker = v1.Worker{ + Id: "0", + Name: "unknown", + Type: "appveyor_hosted_vm", + OS: env["APPVEYOR_BUILD_WORKER_IMAGE"], + Version: "latest", + Arch: runtime.GOOS + "/" + runtime.GOARCH, + } + + // pipeline + nci.Pipeline.Id = env["APPVEYOR_BUILD_ID"] + nci.Pipeline.Trigger = common.PipelineTriggerPush + nci.Pipeline.StageId = env["APPVEYOR_BUILD_ID"] + nci.Pipeline.StageName = "default" + nci.Pipeline.StageSlug = slug.Make("default") + nci.Pipeline.JobId = env["APPVEYOR_JOB_ID"] + nci.Pipeline.JobName = env["APPVEYOR_JOB_NAME"] + nci.Pipeline.JobSlug = slug.Make(env["APPVEYOR_JOB_NAME"]) + nci.Pipeline.JobStartedAt = time.Now().Format(time.RFC3339) + nci.Pipeline.Attempt = env["APPVEYOR_JOB_NUMBER"] + nci.Pipeline.Url = fmt.Sprintf("%s/project/%s/%s/builds/%s", env["APPVEYOR_URL"], env["APPVEYOR_ACCOUNT_NAME"], env["APPVEYOR_PROJECT_SLUG"], env["APPVEYOR_BUILD_ID"]) + + // repository + projectDir, err := vcsutil.FindProjectDirectoryFromWorkDir() + if err != nil { + return nci, fmt.Errorf("failed to find project directory: %v", err) + } + vcsData, err := vcsrepository.GetVCSRepositoryInformation(projectDir) + if err != nil { + return nci, fmt.Errorf("failed to get repository details: %v", err) + } + nci.Repository = vcsData.Repository + nci.Commit = vcsData.Commit + nci.Commit.Hash = env["APPVEYOR_REPO_COMMIT"] + nci.Commit.HashShort = env["APPVEYOR_REPO_COMMIT"][:7] + + // project + projectData, err := projectdetails.GetProjectDetails(nci.Repository.Kind, nci.Repository.Remote, nci.Repository.HostType, nci.Repository.HostServer) + if err != nil { + return nci, fmt.Errorf("failed to get project details: %v", err) + } + nci.Project = projectData + nci.Project.Dir = projectDir + + // flags + nci.Flags.DeployFreeze = "false" + + return nci, nil +} diff --git a/pkg/normalizer/appveyor/normalize_test.go b/pkg/normalizer/appveyor/normalize_test.go new file mode 100644 index 0000000..f8e1a12 --- /dev/null +++ b/pkg/normalizer/appveyor/normalize_test.go @@ -0,0 +1,105 @@ +package appveyor + +import ( + "runtime" + "testing" + + "github.com/cidverse/normalizeci/pkg/nciutil" + "github.com/stretchr/testify/assert" +) + +var appveyorEnv = map[string]string{ + "APPVEYOR": "true", + "APPVEYOR_ACCOUNT_NAME": "PhilippHeuer", + "APPVEYOR_API_URL": "http://localhost:36401/", + "APPVEYOR_BUILD_FOLDER": "/home/appveyor/projects/cienvsamples", + "APPVEYOR_BUILD_ID": "51035157", + "APPVEYOR_BUILD_NUMBER": "19", + "APPVEYOR_BUILD_VERSION": "1.0.19", + "APPVEYOR_BUILD_WORKER_IMAGE": "Ubuntu2004", + "APPVEYOR_CONSOLE_DISABLE_PTY": "false", + "APPVEYOR_JOB_ID": "yyrrqc54e997xewx", + "APPVEYOR_JOB_NAME": "", + "APPVEYOR_JOB_NUMBER": "1", + "APPVEYOR_PROJECT_ID": "928594", + "APPVEYOR_PROJECT_NAME": "cienvsamples", + "APPVEYOR_PROJECT_SLUG": "cienvsamples", + "APPVEYOR_PULL_REQUEST_HEAD_COMMIT": "", + "APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH": "", + "APPVEYOR_PULL_REQUEST_HEAD_REPO_NAME": "", + "APPVEYOR_PULL_REQUEST_NUMBER": "", + "APPVEYOR_PULL_REQUEST_TITLE": "", + "APPVEYOR_REPO_BRANCH": "main", + "APPVEYOR_REPO_COMMIT": "790efd9b96e59d9b3c3f1899284c85fa91efbcbc", + "APPVEYOR_REPO_COMMIT_AUTHOR": "Philipp Heuer", + "APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL": "dummy@example.com", + "APPVEYOR_REPO_COMMIT_MESSAGE": "feat: add gitlab sync job", + "APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDED": "", + "APPVEYOR_REPO_COMMIT_TIMESTAMP": "2024-11-21T20:07:21.0000000Z", + "APPVEYOR_REPO_NAME": "cidverse/cienvsamples", + "APPVEYOR_REPO_PROVIDER": "gitHub", + "APPVEYOR_REPO_SCM": "git", + "APPVEYOR_REPO_TAG": "false", + "APPVEYOR_REPO_TAG_NAME": "", + "APPVEYOR_URL": "https://ci.appveyor.com", + "ASPNETCORE_ENVIRONMENT": "Production", + "CI": "true", + "CI_SERVICE_NAME": "appveyor", +} + +func TestNormalizer_Normalize_Common(t *testing.T) { + nciutil.MockVCSClient(t) + + var normalizer = NewNormalizer() + var normalized, err = normalizer.Normalize(appveyorEnv) + + assert.NoError(t, err) + assert.Equal(t, "true", normalized.Found) + assert.Equal(t, "1.0.0", normalized.Version) + assert.Equal(t, normalizer.name, normalized.ServiceName) + assert.Equal(t, normalizer.slug, normalized.ServiceSlug) +} + +func TestNormalizer_Normalize_Worker(t *testing.T) { + nciutil.MockVCSClient(t) + + var normalizer = NewNormalizer() + var normalized, err = normalizer.Normalize(appveyorEnv) + + assert.NoError(t, err) + assert.Equal(t, "0", normalized.Worker.Id) + assert.Equal(t, "unknown", normalized.Worker.Name) + assert.Equal(t, "appveyor_hosted_vm", normalized.Worker.Type) + assert.Equal(t, "Ubuntu2004", normalized.Worker.OS) + assert.Equal(t, "latest", normalized.Worker.Version) + assert.Equal(t, runtime.GOOS+"/"+runtime.GOARCH, normalized.Worker.Arch) +} + +func TestNormalizer_Normalize_Pipeline(t *testing.T) { + nciutil.MockVCSClient(t) + + var normalizer = NewNormalizer() + var normalized, err = normalizer.Normalize(appveyorEnv) + + assert.NoError(t, err) + assert.Equal(t, "51035157", normalized.Pipeline.Id) + assert.Equal(t, "push", normalized.Pipeline.Trigger) + assert.Equal(t, "51035157", normalized.Pipeline.StageId) + assert.Equal(t, "default", normalized.Pipeline.StageName) + assert.Equal(t, "default", normalized.Pipeline.StageSlug) + assert.Equal(t, "yyrrqc54e997xewx", normalized.Pipeline.JobId) + assert.Equal(t, "", normalized.Pipeline.JobName) + assert.Equal(t, "", normalized.Pipeline.JobSlug) + assert.NotNil(t, normalized.Pipeline.JobStartedAt) + assert.Equal(t, "1", normalized.Pipeline.Attempt) + assert.Equal(t, "https://ci.appveyor.com/project/PhilippHeuer/cienvsamples/builds/51035157", normalized.Pipeline.Url) +} + +func TestNormalizer_Normalize_Project(t *testing.T) { +} + +func TestNormalizer_Normalize_PullRequest(t *testing.T) { +} + +func TestNormalizer_Normalize_WorkflowAPI(t *testing.T) { +} diff --git a/pkg/normalizer/circleci/common.go b/pkg/normalizer/circleci/common.go new file mode 100644 index 0000000..453d5a0 --- /dev/null +++ b/pkg/normalizer/circleci/common.go @@ -0,0 +1,34 @@ +package circleci + +// Normalizer is the implementation of the normalizer +type Normalizer struct { + version string + name string + slug string +} + +// GetName returns the name of the normalizer +func (n Normalizer) GetName() string { + return n.name +} + +// GetSlug returns the slug of the normalizer +func (n Normalizer) GetSlug() string { + return n.slug +} + +// Check if this package can handle the current environment +func (n Normalizer) Check(env map[string]string) bool { + return env["CIRCLECI"] == "True" +} + +// NewNormalizer gets a instance of the normalizer +func NewNormalizer() Normalizer { + entity := Normalizer{ + version: "0.3.0", + name: "Circle CI", + slug: "circleci", + } + + return entity +} diff --git a/pkg/normalizer/circleci/denormalize.go b/pkg/normalizer/circleci/denormalize.go new file mode 100644 index 0000000..1f949db --- /dev/null +++ b/pkg/normalizer/circleci/denormalize.go @@ -0,0 +1,9 @@ +package circleci + +import ( + v1 "github.com/cidverse/normalizeci/pkg/ncispec/v1" +) + +func (n Normalizer) Denormalize(spec v1.Spec) (map[string]string, error) { + return make(map[string]string), nil +} diff --git a/pkg/normalizer/circleci/normalize.go b/pkg/normalizer/circleci/normalize.go new file mode 100644 index 0000000..b1b5e17 --- /dev/null +++ b/pkg/normalizer/circleci/normalize.go @@ -0,0 +1,67 @@ +package circleci + +import ( + "fmt" + "runtime" + "time" + + "github.com/cidverse/go-vcs/vcsutil" + "github.com/cidverse/normalizeci/pkg/ncispec/common" + v1 "github.com/cidverse/normalizeci/pkg/ncispec/v1" + "github.com/cidverse/normalizeci/pkg/projectdetails" + "github.com/cidverse/normalizeci/pkg/vcsrepository" + "github.com/gosimple/slug" +) + +// Normalize normalizes the environment variables into the common format +func (n Normalizer) Normalize(env map[string]string) (v1.Spec, error) { + nci := v1.Create(n.name, n.slug) + + // worker + nci.Worker = v1.Worker{ + Id: env["CIRCLE_NODE_INDEX"], + Name: env["CIRCLE_NODE_INDEX"], + Type: "circleci_hosted_vm", + OS: "unknown", + Version: "latest", + Arch: runtime.GOOS + "/" + runtime.GOARCH, + } + + // pipeline + nci.Pipeline.Id = env["CIRCLE_PIPELINE_ID"] + nci.Pipeline.Trigger = common.PipelineTriggerUnknown + nci.Pipeline.StageId = env["CIRCLE_WORKFLOW_ID"] + nci.Pipeline.StageName = "default" + nci.Pipeline.StageSlug = slug.Make("default") + nci.Pipeline.JobId = env["CIRCLE_WORKFLOW_JOB_ID"] + nci.Pipeline.JobName = env["CIRCLE_JOB"] + nci.Pipeline.JobSlug = slug.Make(env["CIRCLE_JOB"]) + nci.Pipeline.JobStartedAt = time.Now().Format(time.RFC3339) + nci.Pipeline.Attempt = "0" + nci.Pipeline.Url = env["CIRCLE_BUILD_URL"] + + // repository + projectDir, err := vcsutil.FindProjectDirectoryFromWorkDir() + if err != nil { + return nci, fmt.Errorf("failed to find project directory: %v", err) + } + vcsData, err := vcsrepository.GetVCSRepositoryInformation(projectDir) + if err != nil { + return nci, fmt.Errorf("failed to get repository details: %v", err) + } + nci.Repository = vcsData.Repository + nci.Commit = vcsData.Commit + + // project + projectData, err := projectdetails.GetProjectDetails(nci.Repository.Kind, nci.Repository.Remote, nci.Repository.HostType, nci.Repository.HostServer) + if err != nil { + return nci, fmt.Errorf("failed to get project details: %v", err) + } + nci.Project = projectData + nci.Project.Dir = projectDir + + // flags + nci.Flags.DeployFreeze = "false" + + return nci, nil +} diff --git a/pkg/normalizer/circleci/normalize_test.go b/pkg/normalizer/circleci/normalize_test.go new file mode 100644 index 0000000..4d466fa --- /dev/null +++ b/pkg/normalizer/circleci/normalize_test.go @@ -0,0 +1,92 @@ +package circleci + +import ( + "runtime" + "testing" + + "github.com/cidverse/normalizeci/pkg/nciutil" + "github.com/stretchr/testify/assert" +) + +var circleciEnv = map[string]string{ + "CIRCLE_BRANCH": "main", + "CIRCLE_BUILD_NUM": "9", + "CIRCLE_BUILD_URL": "https://app.circleci.com/jobs/circleci/0d12c8fa-cf92-415b-a14c-4787b20c52e2/aa4638b8-064e-4321-b1ee-794f3028b01f/9", + "CIRCLE_INTERNAL_SCRATCH": "/tmp/circleci-4169931879", + "CIRCLE_INTERNAL_TASK_DATA": "/tmp/.circleci-task-data-7564f453-074e-43cf-aef3-a393a9909474-0-build", + "CIRCLE_JOB": "publish-env", + "CIRCLE_NODE_INDEX": "0", + "CIRCLE_NODE_TOTAL": "1", + "CIRCLE_OIDC_TOKEN": "secret", + "CIRCLE_OIDC_TOKEN_V2": "secret", + "CIRCLE_ORGANIZATION_ID": "0d12c8fa-cf92-415b-a14c-4787b20c52e2", + "CIRCLE_PIPELINE_ID": "ec202ec0-b88f-47cf-9df0-f85979ea3426", + "CIRCLE_PROJECT_ID": "aa4638b8-064e-4321-b1ee-794f3028b01f", + "CIRCLE_PROJECT_REPONAME": "cienvsamples", + "CIRCLE_PROJECT_USERNAME": "CIDVerse", + "CIRCLE_REPOSITORY_URL": "", + "CIRCLE_SHA1": "790efd9b96e59d9b3c3f1899284c85fa91efbcbc", + "CIRCLE_SHELL_ENV": "/tmp/.bash_env-7564f453-074e-43cf-aef3-a393a9909474-0-build", + "CIRCLE_USERNAME": "dummy@example.com", + "CIRCLE_WORKFLOW_ID": "00adcc65-3be1-463b-b5f6-f2102329bb00", + "CIRCLE_WORKFLOW_JOB_ID": "7564f453-074e-43cf-aef3-a393a9909474", + "CIRCLE_WORKFLOW_WORKSPACE_ID": "00adcc65-3be1-463b-b5f6-f2102329bb00", + "CIRCLE_WORKING_DIRECTORY": "/root/project", +} + +func TestNormalizer_Normalize_Common(t *testing.T) { + nciutil.MockVCSClient(t) + + var normalizer = NewNormalizer() + var normalized, err = normalizer.Normalize(map[string]string{}) + + assert.NoError(t, err) + assert.Equal(t, "true", normalized.Found) + assert.Equal(t, "1.0.0", normalized.Version) + assert.Equal(t, normalizer.name, normalized.ServiceName) + assert.Equal(t, normalizer.slug, normalized.ServiceSlug) +} + +func TestNormalizer_Normalize_Worker(t *testing.T) { + nciutil.MockVCSClient(t) + + var normalizer = NewNormalizer() + var normalized, err = normalizer.Normalize(circleciEnv) + + assert.NoError(t, err) + assert.Equal(t, "0", normalized.Worker.Id) + assert.Equal(t, "0", normalized.Worker.Name) + assert.Equal(t, "circleci_hosted_vm", normalized.Worker.Type) + assert.Equal(t, "unknown", normalized.Worker.OS) + assert.Equal(t, "latest", normalized.Worker.Version) + assert.Equal(t, runtime.GOOS+"/"+runtime.GOARCH, normalized.Worker.Arch) +} + +func TestNormalizer_Normalize_Pipeline(t *testing.T) { + nciutil.MockVCSClient(t) + + var normalizer = NewNormalizer() + var normalized, err = normalizer.Normalize(circleciEnv) + + assert.NoError(t, err) + assert.Equal(t, "ec202ec0-b88f-47cf-9df0-f85979ea3426", normalized.Pipeline.Id) + assert.Equal(t, "unknown", normalized.Pipeline.Trigger) + assert.Equal(t, "00adcc65-3be1-463b-b5f6-f2102329bb00", normalized.Pipeline.StageId) + assert.Equal(t, "default", normalized.Pipeline.StageName) + assert.Equal(t, "default", normalized.Pipeline.StageSlug) + assert.Equal(t, "7564f453-074e-43cf-aef3-a393a9909474", normalized.Pipeline.JobId) + assert.Equal(t, "publish-env", normalized.Pipeline.JobName) + assert.Equal(t, "publish-env", normalized.Pipeline.JobSlug) + assert.NotNil(t, normalized.Pipeline.JobStartedAt) + assert.Equal(t, "0", normalized.Pipeline.Attempt) + assert.Equal(t, "https://app.circleci.com/jobs/circleci/0d12c8fa-cf92-415b-a14c-4787b20c52e2/aa4638b8-064e-4321-b1ee-794f3028b01f/9", normalized.Pipeline.Url) +} + +func TestNormalizer_Normalize_Project(t *testing.T) { +} + +func TestNormalizer_Normalize_PullRequest(t *testing.T) { +} + +func TestNormalizer_Normalize_WorkflowAPI(t *testing.T) { +} diff --git a/pkg/normalizer/normalizeci.go b/pkg/normalizer/normalizeci.go index 90bf4b5..c77c951 100644 --- a/pkg/normalizer/normalizeci.go +++ b/pkg/normalizer/normalizeci.go @@ -9,7 +9,9 @@ import ( v1 "github.com/cidverse/normalizeci/pkg/ncispec/v1" "github.com/cidverse/normalizeci/pkg/normalizer/api" + "github.com/cidverse/normalizeci/pkg/normalizer/appveyor" "github.com/cidverse/normalizeci/pkg/normalizer/azuredevops" + "github.com/cidverse/normalizeci/pkg/normalizer/circleci" "github.com/cidverse/normalizeci/pkg/normalizer/githubactions" "github.com/cidverse/normalizeci/pkg/normalizer/gitlabci" "github.com/cidverse/normalizeci/pkg/normalizer/localgit" @@ -20,7 +22,9 @@ import ( var normalizers []api.Normalizer func init() { + normalizers = append(normalizers, appveyor.NewNormalizer()) normalizers = append(normalizers, azuredevops.NewNormalizer()) + normalizers = append(normalizers, circleci.NewNormalizer()) normalizers = append(normalizers, githubactions.NewNormalizer()) normalizers = append(normalizers, gitlabci.NewNormalizer()) normalizers = append(normalizers, localgit.NewNormalizer()) diff --git a/pkg/projectdetails/hoster_github.go b/pkg/projectdetails/hoster_github.go index 4d3c7c8..7561e36 100644 --- a/pkg/projectdetails/hoster_github.go +++ b/pkg/projectdetails/hoster_github.go @@ -7,6 +7,7 @@ import ( "strconv" "strings" + "github.com/cidverse/go-ptr" v1 "github.com/cidverse/normalizeci/pkg/ncispec/v1" "github.com/cidverse/normalizeci/pkg/normalizer/api" "github.com/google/go-github/v66/github" @@ -49,21 +50,17 @@ func GetProjectDetailsGitHub(host string, repoRemote string) (v1.Project, error) return result, repoErr } - result.Id = strconv.FormatInt(*repo.ID, 10) - result.Name = *repo.Name - result.Path = *repo.FullName - result.Slug = slug.Make(*repo.FullName) - if repo.Description != nil { - result.Description = *repo.Description - } else { - result.Description = "" - } + result.Id = strconv.FormatInt(ptr.Value(repo.ID), 10) + result.Name = ptr.Value(repo.Name) + result.Path = ptr.Value(repo.FullName) + result.Slug = slug.Make(ptr.Value(repo.FullName)) + result.Description = ptr.Value(repo.Description) result.Topics = strings.Join(repo.Topics, ",") - result.IssueUrl = strings.Replace(*repo.IssuesURL, "{/number}", "/{ID}", 1) - result.Stargazers = strconv.Itoa(*repo.StargazersCount) - result.Forks = strconv.Itoa(*repo.ForksCount) - result.DefaultBranch = *repo.DefaultBranch - result.Url = strings.TrimSuffix(*repo.CloneURL, ".git") + result.IssueUrl = strings.Replace(ptr.Value(repo.IssuesURL), "{/number}", "/{ID}", 1) + result.Stargazers = strconv.Itoa(ptr.Value(repo.StargazersCount)) + result.Forks = strconv.Itoa(ptr.Value(repo.ForksCount)) + result.DefaultBranch = ptr.Value(repo.DefaultBranch) + result.Url = strings.TrimSuffix(ptr.Value(repo.CloneURL), ".git") return result, nil }