From 4357044646dd4e16389eeccd53dc572f1083babb Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Tue, 13 Feb 2024 17:05:45 +0100 Subject: [PATCH] First try at managed templates --- managed-templates/golang/Taskfile.yml | 44 ++++ managed-templates/golang/assets/.golangci.yml | 7 + .../golang/assets/Taskfile-golang.yml | 27 +++ .../golang/assets/check-go-task.yml | 207 ++++++++++++++++++ managed-templates/golang/setup-golang.yml | 19 ++ 5 files changed, 304 insertions(+) create mode 100644 managed-templates/golang/Taskfile.yml create mode 100644 managed-templates/golang/assets/.golangci.yml create mode 100644 managed-templates/golang/assets/Taskfile-golang.yml create mode 100644 managed-templates/golang/assets/check-go-task.yml create mode 100644 managed-templates/golang/setup-golang.yml diff --git a/managed-templates/golang/Taskfile.yml b/managed-templates/golang/Taskfile.yml new file mode 100644 index 00000000..1463d2e5 --- /dev/null +++ b/managed-templates/golang/Taskfile.yml @@ -0,0 +1,44 @@ +version: '3' + +includes: + project: + taskfile: project.yml + internal: true + optional: true + +tasks: + setup: + preconditions: + - sh: test -d .git + msg: "Please run this task from the root of your project" + dir: '{{.USER_WORKING_DIR}}' + cmds: + - task: write-preamble + - task: project:setup + - task: write-footer + + bootstrap: + preconditions: + - sh: test -d .git + msg: "Please run this task from the root of your project" + dir: '{{.USER_WORKING_DIR}}' + cmds: + - task: wrtie-preamble + - task: write-footer + + write-preamble: + internal: true + dir: '{{.USER_WORKING_DIR}}' + cmds: + - "echo 'version: \"3\"'> Taskfile.yml" + - "echo '' >> Taskfile.yml" + - "echo 'includes:' >> Taskfile.yml" + - "echo ' project: .project/Taskfile.yml' >> Taskfile.yml" + + write-footer: + internal: true + dir: '{{.USER_WORKING_DIR}}' + cmds: + - "echo ' # end of generated includes' >> Taskfile.yml" + - "echo '' >> Taskfile.yml" + - "echo '# end of generated tasks' >> Taskfile.yml" diff --git a/managed-templates/golang/assets/.golangci.yml b/managed-templates/golang/assets/.golangci.yml new file mode 100644 index 00000000..e51fc523 --- /dev/null +++ b/managed-templates/golang/assets/.golangci.yml @@ -0,0 +1,7 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/go/.golangci.yml +# See: https://golangci-lint.run/usage/configuration/ +issues: + exclude-use-default: false +linters: + enable: + - revive diff --git a/managed-templates/golang/assets/Taskfile-golang.yml b/managed-templates/golang/assets/Taskfile-golang.yml new file mode 100644 index 00000000..e1faa74d --- /dev/null +++ b/managed-templates/golang/assets/Taskfile-golang.yml @@ -0,0 +1,27 @@ +# See: https://taskfile.dev/#/usage +version: "3" + +tasks: + fix: + desc: Modernize usages of outdated APIs + dir: "{{default .DEFAULT_GO_MODULE_PATH .GO_MODULE_PATH}}" + cmds: + - go fix {{default .DEFAULT_GO_PACKAGES .GO_PACKAGES}} + + format: + desc: Format Go code + dir: "{{default .DEFAULT_GO_MODULE_PATH .GO_MODULE_PATH}}" + cmds: + - go fmt {{default .DEFAULT_GO_PACKAGES .GO_PACKAGES}} + + lint: + desc: Lint Go code + dir: "{{default .DEFAULT_GO_MODULE_PATH .GO_MODULE_PATH}}" + cmds: + - | + if ! which golangci-lint &>/dev/null; then + echo "golangci-lint not installed or not in PATH." + echo "Please install: https://golangci-lint.run/usage/install/#local-installation" + exit 1 + fi + - golangci-lint run diff --git a/managed-templates/golang/assets/check-go-task.yml b/managed-templates/golang/assets/check-go-task.yml new file mode 100644 index 00000000..3d14ba93 --- /dev/null +++ b/managed-templates/golang/assets/check-go-task.yml @@ -0,0 +1,207 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-go-task.md +name: Check Go + +env: + # See: https://github.com/actions/setup-go/tree/main#supported-version-syntax + GO_VERSION: "%%GO_VERSION%%" + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + create: + push: + paths: + - ".github/workflows/check-go-task.ya?ml" + - "Taskfile.ya?ml" + - ".golangci.ya?ml" + - "**/go.mod" + - "**/go.sum" + - "**.go" + pull_request: + paths: + - ".github/workflows/check-go-task.ya?ml" + - "Taskfile.ya?ml" + - ".golangci.ya?ml" + - "**/go.mod" + - "**/go.sum" + - "**.go" + schedule: + # Run periodically to catch breakage caused by external changes. + - cron: "0 7 * * WED" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + permissions: {} + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="refs/heads/[0-9]+.[0-9]+.x" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + check-outdated: + name: check-outdated (${{ matrix.module.path }}) + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + strategy: + fail-fast: false + + matrix: + module: + # TODO: add paths of all Go modules here + - path: ./ + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Go + uses: actions/setup-go@v5 + with: + go-version: ${{ env.GO_VERSION }} + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Modernize usages of outdated APIs + env: + GO_MODULE_PATH: ${{ matrix.module.path }} + run: task go:fix + + - name: Check if any fixes were needed + run: git diff --color --exit-code + + check-style: + name: check-style (${{ matrix.module.path }}) + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + strategy: + fail-fast: false + + matrix: + module: + # TODO: add paths of all Go modules here + - path: ./ + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Go + uses: actions/setup-go@v5 + with: + go-version: ${{ env.GO_VERSION }} + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Install golangci-lint + uses: golangci/golangci-lint-action@v3 + with: + version: v1.54 + + - name: Check style + env: + GO_MODULE_PATH: ${{ matrix.module.path }} + run: task --silent go:lint + + check-formatting: + name: check-formatting (${{ matrix.module.path }}) + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + strategy: + fail-fast: false + + matrix: + module: + # TODO: add paths of all Go modules here + - path: ./ + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Go + uses: actions/setup-go@v5 + with: + go-version: ${{ env.GO_VERSION }} + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Format code + env: + GO_MODULE_PATH: ${{ matrix.module.path }} + run: task go:format + + - name: Check formatting + run: git diff --color --exit-code + + check-config: + name: check-config (${{ matrix.module.path }}) + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + strategy: + fail-fast: false + + matrix: + module: + # TODO: add paths of all Go modules here + - path: ./ + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Go + uses: actions/setup-go@v5 + with: + go-version: ${{ env.GO_VERSION }} + + - name: Run go mod tidy + working-directory: ${{ matrix.module.path }} + run: go mod tidy + + - name: Check whether any tidying was needed + run: git diff --color --exit-code diff --git a/managed-templates/golang/setup-golang.yml b/managed-templates/golang/setup-golang.yml new file mode 100644 index 00000000..4527ba5a --- /dev/null +++ b/managed-templates/golang/setup-golang.yml @@ -0,0 +1,19 @@ +version: '3' + +vars: + SOURCE_BRANCH: 'managed-templates' + +tasks: + setup: + internal: true + dir: '{{.USER_WORKING_DIR}}' + requires: + vars: + - GO_VERSION + cmds: + - mkdir -p .github/workflows + - wget https://raw.githubusercontent.com/arduino/tooling-project-assets/{{.SOURCE_BRANCH}}/managed-templates/golang/assets/check-go-task.yml -O .github/workflows/check-go-task.yml + - sed -i "s/%%GO_VERSION%%/{{.GO_VERSION}}/g" .github/workflows/check-go-task.yml + - wget https://raw.githubusercontent.com/arduino/tooling-project-assets/{{.SOURCE_BRANCH}}/managed-templates/golang/assets/Taskfile-golang.yml -O Taskfile-golang.yml + - wget https://raw.githubusercontent.com/arduino/tooling-project-assets/{{.SOURCE_BRANCH}}/managed-templates/golang/assets/.golangci.yml -O .golangci.yml + - "echo ' go: Taskfile-golang.yml' >> Taskfile.yml" \ No newline at end of file