| package ci |
| |
| import ( |
| "github.com/SchemaStore/schemastore/src/schemas/json" |
| encjson "encoding/json" |
| ) |
| |
| workflowsDir: *"./" | string @tag(workflowsDir) |
| |
| workflows: [...{file: string, schema: json.#Workflow}] |
| workflows: [ |
| { |
| file: "test.yml" |
| schema: test |
| }, |
| { |
| file: "test_dispatch.yml" |
| schema: test_dispatch |
| }, |
| { |
| file: "release.yml" |
| schema: release |
| }, |
| { |
| file: "rebuild_tip_cuelang_org.yml" |
| schema: rebuild_tip_cuelang_org |
| }, |
| ] |
| |
| // TODO: drop when cuelang.org/issue/390 is fixed. |
| // Declare definitions for sub-schemas |
| #job: (json.#Workflow.jobs & {x: _}).x |
| #step: ((#job & {steps: _}).steps & [_])[0] |
| |
| #latestGo: "1.14.3" |
| |
| #testStrategy: { |
| "fail-fast": false |
| matrix: { |
| // Use a stable version of 1.14.x for go generate |
| "go-version": ["1.12.x", "1.13.x", #latestGo] |
| os: ["ubuntu-latest", "macos-latest", "windows-latest"] |
| } |
| } |
| |
| #installGo: #step & { |
| name: "Install Go" |
| uses: "actions/setup-go@v2" |
| with: "go-version": "${{ matrix.go-version }}" |
| } |
| |
| #checkoutCode: #step & { |
| name: "Checkout code" |
| uses: "actions/checkout@v2" |
| } |
| |
| #cacheGoModules: #step & { |
| name: "Cache Go modules" |
| uses: "actions/cache@v1" |
| with: { |
| path: "~/go/pkg/mod" |
| key: "${{ runner.os }}-${{ matrix.go-version }}-go-${{ hashFiles('**/go.sum') }}" |
| "restore-keys": """ |
| ${{ runner.os }}-${{ matrix.go-version }}-go- |
| """ |
| } |
| |
| } |
| |
| #goGenerate: #step & { |
| name: "Generate" |
| run: "go generate ./..." |
| // The Go version corresponds to the precise 1.14.x version specified in |
| // the matrix. Skip windows for now until we work out why re-gen is flaky |
| if: "matrix.go-version == '\(#latestGo)' && matrix.os != 'windows-latest'" |
| } |
| |
| #goTest: #step & { |
| name: "Test" |
| run: "go test ./..." |
| } |
| |
| #goTestRace: #step & { |
| name: "Test with -race" |
| run: "go test -race ./..." |
| } |
| |
| #goReleaseCheck: #step & { |
| name: "gorelease check" |
| run: "go run golang.org/x/exp/cmd/gorelease" |
| // Only run on 1.13.x and latest Go for now. Bug with Go 1.12.x means |
| // this check fails |
| if: "matrix.go-version == '\(#latestGo)' || matrix.go-version == '1.13.x'" |
| } |
| |
| #checkGitClean: #step & { |
| name: "Check that git is clean post generate and tests" |
| run: "test -z \"$(git status --porcelain)\" || (git status; git diff; false)" |
| } |
| |
| #pullThroughProxy: #step & { |
| name: "Pull this commit through the proxy on master" |
| run: """ |
| v=$(git rev-parse HEAD) |
| cd $(mktemp -d) |
| go mod init mod.com |
| GOPROXY=https://proxy.golang.org go get -d cuelang.org/go@$v |
| """ |
| if: "github.ref == 'refs/heads/master'" |
| } |
| |
| test: json.#Workflow & { |
| name: "Test" |
| on: { |
| push: { |
| branches: ["*"] |
| "tags-ignore": ["v*"] |
| } |
| } |
| defaults: run: shell: "bash" |
| jobs: test: { |
| strategy: #testStrategy |
| "runs-on": "${{ matrix.os }}" |
| steps: [ |
| #installGo, |
| #checkoutCode, |
| #cacheGoModules, |
| #goGenerate, |
| #goTest, |
| #goTestRace, |
| #goReleaseCheck, |
| #checkGitClean, |
| #pullThroughProxy, |
| ] |
| } |
| } |
| |
| test_dispatch: json.#Workflow & { |
| #checkoutRef: #step & { |
| name: "Checkout ref" |
| run: """ |
| git fetch https://cue-review.googlesource.com/cue ${{ github.event.client_payload.ref }} |
| git checkout FETCH_HEAD |
| """ |
| } |
| #writeCookiesFile: #step & { |
| name: "Write the gitcookies file" |
| run: "echo \"$GERRIT_COOKIE\" > ~/.gitcookies" |
| } |
| #gerrit: { |
| #setCodeReview: { |
| #args: { |
| message: string |
| labels?: { |
| "Code-Review": int |
| } |
| } |
| res: #""" |
| curl -f -s -H "Content-Type: application/json" --request POST --data '\#(encjson.Marshal(#args))' -b ~/.gitcookies https://cue-review.googlesource.com/a/changes/${{ github.event.client_payload.changeID }}/revisions/${{ github.event.client_payload.commit }}/review |
| """# |
| } |
| } |
| |
| name: "Test" |
| env: GERRIT_COOKIE: "${{ secrets.gerritCookie }}" |
| on: ["repository_dispatch"] |
| defaults: run: shell: "bash" |
| jobs: { |
| start: { |
| "runs-on": "ubuntu-latest" |
| steps: [ |
| #writeCookiesFile, |
| #step & { |
| name: "Update Gerrit CL message with starting message" |
| run: (#gerrit.#setCodeReview & { |
| #args: message: "Started the build... see progress at ${{ github.event.repository.html_url }}/actions/runs/${{ github.run_id }}" |
| }).res |
| }, |
| ] |
| } |
| test: { |
| "runs-on": "${{ matrix.os }}" |
| steps: [ |
| #writeCookiesFile, |
| #installGo, |
| #checkoutCode, |
| #checkoutRef, |
| #cacheGoModules, |
| #goGenerate, |
| #goTest, |
| #goTestRace, |
| #goReleaseCheck, |
| #checkGitClean, |
| #step & { |
| if: "${{ failure() }}" |
| name: "Post any failures for this matrix entry" |
| run: (#gerrit.#setCodeReview & { |
| #args: { |
| message: "Build failed for ${{ runner.os }}-${{ matrix.go-version }}; see ${{ github.event.repository.html_url }}/actions/runs/${{ github.run_id }} for more details" |
| labels: { |
| "Code-Review": -1 |
| } |
| } |
| }).res |
| }, |
| ] |
| needs: "start" |
| strategy: #testStrategy |
| } |
| end: { |
| "runs-on": "ubuntu-latest" |
| steps: [ |
| #writeCookiesFile, |
| #step & { |
| name: "Update Gerrit CL message with success message" |
| run: (#gerrit.#setCodeReview & { |
| #args: { |
| message: "Build succeeded for ${{ github.event.repository.html_url }}/actions/runs/${{ github.run_id }}" |
| labels: { |
| "Code-Review": 1 |
| } |
| } |
| }).res |
| }, |
| ] |
| needs: "test" |
| } |
| } |
| } |
| release: { |
| name: "Release" |
| on: push: tags: ["v*"] |
| jobs: { |
| goreleaser: { |
| "runs-on": "ubuntu-latest" |
| steps: [{ |
| name: "Checkout code" |
| uses: "actions/checkout@v2" |
| }, { |
| name: "Unshallow" // required for the changelog to work correctly. |
| run: "git fetch --prune --unshallow" |
| }, { |
| name: "Run GoReleaser" |
| env: GITHUB_TOKEN: "${{ secrets.ACTIONS_GITHUB_TOKEN }}" |
| uses: "docker://goreleaser/goreleaser:latest" |
| with: args: "release --rm-dist" |
| }] |
| } |
| docker: { |
| name: "docker" |
| "runs-on": "ubuntu-latest" |
| steps: [{ |
| name: "Check out the repo" |
| uses: "actions/checkout@v2" |
| }, { |
| name: "Set version environment" |
| run: """ |
| CUE_VERSION=$(echo ${GITHUB_REF##refs/tags/v}) |
| echo \"CUE_VERSION=$CUE_VERSION\" |
| echo \"::set-env name=CUE_VERSION::$(echo $CUE_VERSION)\" |
| """ |
| }, { |
| name: "Push to Docker Hub" |
| env: { |
| DOCKER_BUILDKIT: 1 |
| GOLANG_VERSION: 1.14 |
| CUE_VERSION: "${{ env.CUE_VERSION }}" |
| } |
| uses: "docker/build-push-action@v1" |
| with: { |
| tags: "${{ env.CUE_VERSION }},latest" |
| repository: "cuelang/cue" |
| username: "${{ secrets.DOCKER_USERNAME }}" |
| password: "${{ secrets.DOCKER_PASSWORD }}" |
| tag_with_ref: false |
| tag_with_sha: false |
| target: "cue" |
| always_pull: true |
| build_args: "GOLANG_VERSION=${{ env.GOLANG_VERSION }},CUE_VERSION=v${{ env.CUE_VERSION }}" |
| add_git_labels: true |
| } |
| }] |
| } |
| } |
| } |
| |
| rebuild_tip_cuelang_org: json.#Workflow & { |
| name: "Push to tip" |
| on: push: branches: ["master"] |
| jobs: push: { |
| "runs-on": "ubuntu-latest" |
| steps: [{ |
| name: "Rebuild tip.cuelang.org" |
| run: "curl -f -X POST -d {} https://api.netlify.com/build_hooks/${{ secrets.CuelangOrgTipRebuildHook }}" |
| }] |
| } |
| } |