go-task / task

A task runner / simpler Make alternative written in Go
https://taskfile.dev
MIT License
11.35k stars 612 forks source link

Task throwing runtime error, 'invalid memory address' #961

Closed tjf-ARUS closed 1 year ago

tjf-ARUS commented 1 year ago

I'm doing a fresh go development environment and installed task with 'go install' and 'choco install'. In both cases I get the following.

PS C:\Users\xxx\workspace\semaphore> task --version
Task version: v3.19.0 (h1:jS1s2fHoSgYySw+kHEtbSxS6emE620unBsDDcNqdRbc=)
PS C:\Users\xxx\workspace\semaphore> task deps
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x21 pc=0x932dda]

goroutine 1 [running]:
github.com/go-task/task/v3/taskfile.Merge(0xc000138000, 0xc000138240, 0x0, {0x0, 0x0, 0x0})
        github.com/go-task/task/v3@v3.19.0/taskfile/merge.go:48 +0x41a
github.com/go-task/task/v3/taskfile/read.Taskfile(0xc0000f4d20)
        github.com/go-task/task/v3@v3.19.0/taskfile/read/taskfile.go:178 +0x2a5
github.com/go-task/task/v3.(*Executor).readTaskfile(0xc0000fc5a0)
        github.com/go-task/task/v3@v3.19.0/setup.go:83 +0x85
github.com/go-task/task/v3.(*Executor).Setup(0xc0000fc5a0)
        github.com/go-task/task/v3@v3.19.0/setup.go:29 +0x49
main.main()
        github.com/go-task/task/v3@v3.19.0/cmd/task/task.go:170 +0xb6a

OS Info...

Edition Windows 10 Pro Version 22H2 Installed on ‎12/‎5/‎2022 OS build 19045.2364 Experience Windows Feature Experience Pack 120.2212.4190.0

andreynering commented 1 year ago

Hi @tjf-ARUS,

This problem is probably related to your Taskfile. Do you mind sharing a snippet that reproduces this problem?

tjf-ARUS commented 1 year ago

Below is my task file. It's the Apache Semaphore project. I've also set up go/task in WSL (Windows subsystem for Linux) and task works ok.

# Semaphore Tasks
# These tasks should be used to build and develop Semaphore
#
# Tasks without a `desc:` field are intended mainly to be called
# internally by other tasks and therefore are not listed when running `task` or `task -l`
version: '2'

vars:
  docker_namespace: semaphoreui
  docker_image: semaphore

tasks:
  all:
    desc: Install, Compile, Test and Build Semaphore for local architecture
    cmds:
      - task: deps
      - task: compile
      - task: test
      - task: build:local
        vars:
          GOOS: ''
          GOARCH: ''

  deps:
    desc: Install all dependencies (except dredd requirements)
    cmds:
      - task: deps:tools
      - task: deps:be
      - task: deps:fe2

  deps:be:
    desc: Vendor application dependencies
    cmds:
      - go mod vendor

  deps:fe2:
    desc: Installs npm requirements for front end from package.json
    dir: web
    cmds:
      - npm install
      # - npm audit fix

  deps:integration:
    desc: Installs requirements for integration testing with dredd
    dir: web
    cmds:
      - npm install dredd@13.1.2
      # - npm audit fix

  deps:tools:
    desc: Installs tools needed
    dir: web
    vars:
      GORELEASER_VERSION: "0.183.0"
      GOLINTER_VERSION: "1.46.2"
    cmds:
      - go install github.com/gobuffalo/packr/...@v1.10.4
      - go install github.com/snikch/goodman/cmd/goodman@latest
      - go install github.com/go-swagger/go-swagger/cmd/swagger@v0.29.0
      - '{{ if ne OS "windows" }} sh -c "curl -L https://github.com/goreleaser/goreleaser/releases/download/v{{ .GORELEASER_VERSION }}/goreleaser_$(uname -s)_$(uname -m).tar.gz | tar -xz -C $(go env GOPATH)/bin goreleaser"{{ else }} {{ end }}'
      - '{{ if ne OS "windows" }} chmod +x $(go env GOPATH)/bin/goreleaser{{ else }} {{ end }}'
      - '{{ if eq OS "windows" }} echo "NOTICE: You must download goreleaser manually to build this application https://github.com/goreleaser/goreleaser/releases "{{ else }}:{{ end }}'
      - '{{ if ne OS "windows" }} sh -c "curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v{{ .GOLINTER_VERSION }}"{{ else }}{{ end }}'
      - '{{ if eq OS "windows" }} echo "NOTICE: You need to install golangci-lint manually to build this application https://github.com/golangci/golangci-lint#install"{{ else }}{{ end }}'

  compile:
    desc: Generates compiled frontend and backend resources (must be in this order)
    cmds:
      - task: compile:fe2
      - task: compile:be

  compile:fe2:
    desc: Build vue.js project
    dir: web
    sources:
      - src/*.*
      - src/**/*.*
      - public/index.html
      - public/favicon.ico
      - package.json
      - package-lock.json
      - babel.config.js
      - vue.config.js
    generates:
      - dist/css/*.css
      - dist/js/*.js
      - dist/index.html
      - dist/favicon.ico
    cmds:
      - npm run build

  compile:be:
    desc: Runs Packr for static assets
    sources:
      - web/dist/*
      - db/migrations/*
    generates:
      - db/db-packr.go
      - api/api-packr.go
    cmds:
      - mkdir -p web/dist
      - go run util/version_gen/generator.go {{ if .TAG }}{{ .TAG }}{{ else }}{{ if .SEMAPHORE_VERSION }}{{ .SEMAPHORE_VERSION }}{{ else }}{{ .BRANCH }}-{{ .SHA }}-{{ .TIMESTAMP }}{{ if .DIRTY }}-dirty{{ end }}{{ end }}{{end}}
      - packr
    vars:
      TAG:
        sh: git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null | sed -n 's/^\([^^~]\{1,\}\)\(\^0\)\{0,1\}$/\1/p'
      BRANCH:
        sh: git rev-parse --abbrev-ref HEAD
      DIRTY:
        # We must exclude the package-lock file as npm install can change it!
        sh: git diff --exit-code --stat -- . ':(exclude)web/package-lock.json' ':(exclude)web/package.json' || true
      SHA:
        sh: git log --pretty=format:'%h' -n 1
      TIMESTAMP:
        sh: date +%s

  compile:api:hooks:
    dir: ./.dredd/hooks
    cmds:
      - go build -o ../compiled_hooks{{ if eq OS "windows" }}.exe{{ end }}

  build:
    desc: Build a full set of release binaries and packages
    cmds:
      - task: release

  build:local:
    desc: Build a binary for the current architecture
    dir: cli
    cmds:
      - env GOOS={{ .GOOS }} GOARCH={{ .GOARCH }} go build -o ../bin/semaphore{{ if eq OS "windows" }}.exe{{ end }}

  release:
    desc: creates a release without performing validations or publishing artifacts
    cmds:
      - goreleaser --snapshot --rm-dist

  release:prod:
    cmds:
      - goreleaser

  lint:
    cmds:
      - task: lint:be

  lint:be:
    # --errors
    cmds:
      - golangci-lint run --skip-files "\w*(-packr.go)" --disable goconst --timeout 240s ./...

  test:
    cmds:
      - task: test:be

  test:be:
    desc: Run go code tests
    cmds:
      - go vet ./...
      - swagger validate ./api-docs.yml
      - go test -v -coverprofile=coverage.out ./...

  test:api:
    desc: test the api with dredd
    cmds:
      - ./web/node_modules/.bin/dredd --config .dredd/dredd.yml

  ci:artifacts:
    cmds:
      - rsync -a bin/ $CIRCLE_ARTIFACTS/

  # docker(-compose) commands
  dc:dev:
    desc: build and start a development stack using docker-compose
    cmds:
      - task: docker
        vars:
          context: dev
          args: build semaphore_dev
          compose: true
      - task: dc:up
        vars:
          context: dev

  # convenience function to build and start a production like stack
  dc:prod:
    desc: build and start a production like stack using docker-compose
    cmds:
      - task: docker
        vars:
          context: prod
          args: build semaphore
          compose: true
      - task: dc:up
        vars:
          context: prod

  dc:up:
    desc: start a docker-compose instance, requires context
    cmds:
      - task: docker
        vars:
          compose: true
          args: up --abort-on-container-exit
          prefix: "{{ .prefix }}"
          context: "{{ .context }}"

  dc:build:
    desc: build a set of docker-compose containers, requires context
    cmds:
      - task: docker
        vars:
          compose: true
          args: build
          context: "{{ .context }}"

  dc:down:
    desc: down a docker-compose instance, requires context
    cmds:
      - task: docker
        vars:
          compose: true
          args: down
          context: "{{ .context }}"

  dc:stop:
    desc: stop a docker-compose instance, requires context
    cmds:
      - task: docker
        vars:
          compose: true
          args: stop
          context: "{{ .context }}"

  docker:build:
    desc: Build an image for Semaphore, requires context
    vars:
      tag: "{{ if .tag }}{{ .tag }}{{ else }}latest{{ end }}"
    cmds:
      - task: docker
        vars:
          context: "{{ .context }}"
          action: build
          tag: "{{ .tag }}"
          args: -t "{{ .docker_namespace }}/{{ .docker_image }}:{{ .tag }}" .

  deps:docker:
    desc: Install docker testing dependencies. These must be installed explicitly and are not included in the general deps task.
    status:
      - test -f /usr/local/bin/goss
      - test -f /usr/local/bin/dgoss
      - test -f /usr/local/bin/hadolint
    cmds:
      - sudo curl -L https://github.com/aelsabbahy/goss/releases/download/v0.3.5/goss-linux-amd64 -o /usr/local/bin/goss
      - sudo chmod +rx /usr/local/bin/goss
      - sudo curl -L https://raw.githubusercontent.com/aelsabbahy/goss/v0.3.5/extras/dgoss/dgoss -o /usr/local/bin/dgoss
      - sudo chmod +rx /usr/local/bin/dgoss
      - sudo curl -L https://github.com/hadolint/hadolint/releases/download/v2.10.0/hadolint-Linux-x86_64 -o /usr/local/bin/hadolint
      - sudo chmod +rx /usr/local/bin/hadolint

  docker:test:
    desc: Test docker containers by building them, running tests and deleting
    deps: ['deps:docker']
    cmds:
      - task: docker:lint
        vars:
          context: "{{ .context }}"
      - task: docker:build
        vars:
          tag: "{{ .context }}-test"
      - task: docker:goss
      - docker rmi "{{ .docker_namespace }}/{{ .docker_image }}:{{ .context }}-test"

  docker:goss:
    dir: "deployment/docker/{{ .context}}"
    deps: ['deps:docker']
    cmds:
      - GOSS_FILES_STRATEGY='cp' dgoss run -it "{{ .docker_namespace }}/{{ .docker_image }}:{{ .context }}-test"

  docker:lint:
    desc: hadolint a dockerfile. Ignores version pinning warning
    dir: "deployment/docker/{{ .context}}"
    cmds:
      - hadolint Dockerfile --ignore DL3018

  docker:push:
    desc: push a docker image to a repo. Defaults to the official docker hub
    cmds:
      - docker push {{ .docker_namespace }}/{{ .docker_image }}:{{ .tag }}

  # templated command to reduce code duplication
  docker:
    vars:
      docker_root: deployment/docker/
    cmds:
      - docker{{ if .compose }}-compose{{ end }} {{ if .action }}{{ .action }}{{ end }} -f {{ .docker_root }}{{ .context }}/{{ if .compose }}docker-compose{{ if .prefix }}{{ .prefix }}{{ end }}.yml{{ else }}Dockerfile{{ if .prefix }}{{ .prefix }}{{ end }}{{ end }} {{if .args }}{{ .args }}{{ end }}
pd93 commented 1 year ago

@tjf-ARUS took me a little while to repro this. I'm guessing you also have a Taskfile_windows.yml file in your project? If so, #971 should fix your issue.

Your issue should also be resolved by upgrading your Taskfile to schema version: '3' if you don't want to wait for the next release. (Note: You'll have to manually include the OS-specific Taskfile)

tjf-ARUS commented 1 year ago

Upgrading taskfile schema to '3' fixed it for me. Thanks