├── .editorconfig ├── .envrc ├── .gitattributes ├── .github ├── CODEOWNERS ├── lock.yml └── workflows │ ├── ci.yml │ └── stale.yml ├── .gitignore ├── .markdownlint-cli2.yaml ├── .mdlrc ├── .overcommit.yml ├── .vscode └── extensions.json ├── .yamllint ├── Berksfile ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Dangerfile ├── LICENSE ├── README.md ├── TESTING.md ├── attributes └── default.rb ├── chefignore ├── documentation ├── .gitkeep └── resources │ └── golang.md ├── kitchen.dokken.yml ├── kitchen.exec.yml ├── kitchen.global.yml ├── kitchen.yml ├── metadata.rb ├── recipes └── default.rb ├── renovate.json ├── resources ├── default.rb └── package.rb ├── spec ├── spec_helper.rb └── unit │ └── recipes │ └── default_spec.rb ├── templates └── golang.sh.erb └── test └── integration ├── cookbooks └── test │ ├── README.md │ ├── files │ └── default │ │ └── helloWorld │ │ ├── go.mod │ │ ├── go.sum │ │ ├── helloworld.go │ │ └── helloworld_test.go │ ├── metadata.rb │ └── recipes │ └── default.rb ├── default └── default_test.rb ├── install-dir └── default_test.rb └── source └── default_test.rb /.editorconfig: -------------------------------------------------------------------------------- 1 | # https://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root=true 5 | 6 | # Unix-style newlines with a newline ending every file 7 | [*] 8 | end_of_line = lf 9 | insert_final_newline = true 10 | 11 | # 2 space indentation 12 | indent_style = space 13 | indent_size = 2 14 | 15 | # Avoid issues parsing cookbook files later 16 | charset = utf-8 17 | 18 | # Avoid cookstyle warnings 19 | trim_trailing_whitespace = true 20 | -------------------------------------------------------------------------------- /.envrc: -------------------------------------------------------------------------------- 1 | use chefworkstation 2 | export KITCHEN_GLOBAL_YAML=kitchen.global.yml 3 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @sous-chefs/maintainers 2 | -------------------------------------------------------------------------------- /.github/lock.yml: -------------------------------------------------------------------------------- 1 | --- 2 | daysUntilLock: 365 3 | exemptLabels: [] 4 | lockLabel: false 5 | lockComment: > 6 | This thread has been automatically locked since there has not been 7 | any recent activity after it was closed. Please open a new issue for 8 | related bugs. 9 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: ci 3 | 4 | "on": 5 | pull_request: 6 | push: 7 | branches: [main] 8 | 9 | jobs: 10 | lint-unit: 11 | uses: sous-chefs/.github/.github/workflows/lint-unit.yml@3.1.1 12 | 13 | integration: 14 | needs: lint-unit 15 | runs-on: ubuntu-latest 16 | strategy: 17 | matrix: 18 | os: 19 | - almalinux-8 20 | - amazonlinux-2 21 | - debian-10 22 | - debian-11 23 | - centos-7 24 | - centos-stream-8 25 | - fedora-latest 26 | - ubuntu-1804 27 | - ubuntu-2004 28 | - rockylinux-8 29 | - opensuse-leap-15 30 | suite: 31 | - default 32 | - source 33 | - install-dir 34 | exclude: 35 | - os: fedora-latest 36 | suite: source 37 | - os: fedora-latest 38 | suite: install-dir 39 | fail-fast: false 40 | 41 | steps: 42 | - name: Check out code 43 | uses: actions/checkout@v4 # v4 44 | - name: Install Chef 45 | uses: actionshub/chef-install@3.0.0 46 | - name: Dokken 47 | uses: actionshub/test-kitchen@3.0.0 48 | env: 49 | CHEF_LICENSE: accept-no-persist 50 | KITCHEN_LOCAL_YAML: kitchen.dokken.yml 51 | with: 52 | suite: ${{ matrix.suite }} 53 | os: ${{ matrix.os }} 54 | - name: Print debug output on failure 55 | if: failure() 56 | run: | 57 | set -x 58 | sudo journalctl -l --since today 59 | KITCHEN_LOCAL_YAML=kitchen.dokken.yml /usr/bin/kitchen exec ${{ matrix.suite }}-${{ matrix.os }} -c "journalctl -l" 60 | -------------------------------------------------------------------------------- /.github/workflows/stale.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Mark stale issues and pull requests 3 | 4 | "on": 5 | schedule: [cron: "0 0 * * *"] 6 | 7 | jobs: 8 | stale: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/stale@v9 12 | with: 13 | repo-token: ${{ secrets.GITHUB_TOKEN }} 14 | close-issue-message: > 15 | Closing due to inactivity. 16 | If this is still an issue please reopen or open another issue. 17 | Alternatively drop by the #sous-chefs channel on the [Chef Community Slack](http://community-slack.chef.io/) and we'll be happy to help! 18 | Thanks, Sous-Chefs. 19 | days-before-close: 7 20 | days-before-stale: 365 21 | stale-issue-message: > 22 | Marking stale due to inactivity. 23 | Remove stale label or comment or this will be closed in 7 days. 24 | Alternatively drop by the #sous-chefs channel on the [Chef Community Slack](http://community-slack.chef.io/) and we'll be happy to help! 25 | Thanks, Sous-Chefs. 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.rbc 2 | .config 3 | InstalledFiles 4 | pkg 5 | test/tmp 6 | test/version_tmp 7 | tmp 8 | _Store 9 | *~ 10 | *# 11 | .#* 12 | \#*# 13 | *.un~ 14 | *.tmp 15 | *.bk 16 | *.bkup 17 | 18 | # editor files 19 | .idea 20 | .*.sw[a-z] 21 | 22 | # ruby/bundler/rspec files 23 | .ruby-version 24 | .ruby-gemset 25 | .rvmrc 26 | Gemfile.lock 27 | .bundle 28 | *.gem 29 | coverage 30 | spec/reports 31 | 32 | # YARD / rdoc artifacts 33 | .yardoc 34 | _yardoc 35 | doc/ 36 | rdoc 37 | 38 | # chef infra stuff 39 | Berksfile.lock 40 | .kitchen 41 | kitchen.local.yml 42 | vendor/ 43 | .coverage/ 44 | .zero-knife.rb 45 | Policyfile.lock.json 46 | 47 | # vagrant stuff 48 | .vagrant/ 49 | .vagrant.d/ 50 | -------------------------------------------------------------------------------- /.markdownlint-cli2.yaml: -------------------------------------------------------------------------------- 1 | config: 2 | ul-indent: false # MD007 3 | line-length: false # MD013 4 | no-duplicate-heading: false # MD024 5 | reference-links-images: false # MD052 6 | ignores: 7 | - .github/copilot-instructions.md 8 | -------------------------------------------------------------------------------- /.mdlrc: -------------------------------------------------------------------------------- 1 | rules "~MD013", "~MD024" 2 | -------------------------------------------------------------------------------- /.overcommit.yml: -------------------------------------------------------------------------------- 1 | --- 2 | PreCommit: 3 | TrailingWhitespace: 4 | enabled: true 5 | YamlLint: 6 | enabled: true 7 | required_executable: "yamllint" 8 | ChefSpec: 9 | enabled: true 10 | required_executable: "chef" 11 | command: ["chef", "exec", "rspec"] 12 | Cookstyle: 13 | enabled: true 14 | required_executable: "cookstyle" 15 | command: ["cookstyle"] 16 | MarkdownLint: 17 | enabled: false 18 | required_executable: "npx" 19 | command: ["npx", "markdownlint-cli2", "'**/*.md'"] 20 | include: ["**/*.md"] 21 | 22 | CommitMsg: 23 | HardTabs: 24 | enabled: true 25 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "chef-software.chef", 4 | "rebornix.ruby", 5 | "editorconfig.editorconfig", 6 | "DavidAnson.vscode-markdownlint" 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /.yamllint: -------------------------------------------------------------------------------- 1 | --- 2 | extends: default 3 | rules: 4 | line-length: 5 | max: 256 6 | level: warning 7 | document-start: disable 8 | braces: 9 | forbid: false 10 | min-spaces-inside: 0 11 | max-spaces-inside: 1 12 | min-spaces-inside-empty: -1 13 | max-spaces-inside-empty: -1 14 | comments: 15 | min-spaces-from-content: 1 16 | -------------------------------------------------------------------------------- /Berksfile: -------------------------------------------------------------------------------- 1 | source 'https://supermarket.chef.io' 2 | 3 | metadata 4 | 5 | group :integration do 6 | cookbook 'test', path: 'test/integration/cookbooks/test' 7 | end 8 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # CHANGELOG for golang 2 | 3 | This file is used to list changes made in each version of golang. 4 | 5 | ## Unreleased 6 | 7 | ## 5.4.21 - *2024-11-18* 8 | 9 | Standardise files with files in sous-chefs/repo-management 10 | 11 | Standardise files with files in sous-chefs/repo-management 12 | 13 | ## 5.4.20 - *2024-07-15* 14 | 15 | Standardise files with files in sous-chefs/repo-management 16 | 17 | ## 5.4.19 - *2024-05-23* 18 | 19 | Standardise files with files in sous-chefs/repo-management 20 | 21 | Standardise files with files in sous-chefs/repo-management 22 | 23 | ## 5.4.18 - *2024-05-03* 24 | 25 | ## 5.4.17 - *2024-05-03* 26 | 27 | ## 5.4.16 - *2023-12-21* 28 | 29 | ## 5.4.15 - *2023-09-28* 30 | 31 | ## 5.4.14 - *2023-09-04* 32 | 33 | ## 5.4.13 - *2023-05-17* 34 | 35 | ## 5.4.12 - *2023-04-17* 36 | 37 | ## 5.4.11 - *2023-04-07* 38 | 39 | Standardise files with files in sous-chefs/repo-management 40 | 41 | ## 5.4.10 - *2023-04-01* 42 | 43 | ## 5.4.9 - *2023-04-01* 44 | 45 | ## 5.4.8 - *2023-04-01* 46 | 47 | Standardise files with files in sous-chefs/repo-management 48 | 49 | ## 5.4.7 - *2023-03-20* 50 | 51 | Standardise files with files in sous-chefs/repo-management 52 | 53 | ## 5.4.6 - *2023-03-15* 54 | 55 | Standardise files with files in sous-chefs/repo-management 56 | 57 | ## 5.4.5 - *2023-03-02* 58 | 59 | ## 5.4.4 - *2023-02-23* 60 | 61 | Standardise files with files in sous-chefs/repo-management 62 | 63 | ## 5.4.3 - *2023-02-15* 64 | 65 | ## 5.4.2 - *2023-02-15* 66 | 67 | Standardise files with files in sous-chefs/repo-management 68 | 69 | ## 5.4.1 - *2022-12-15* 70 | 71 | Standardise files with files in sous-chefs/repo-management 72 | 73 | ## 5.4.0 - *2022-08-08* 74 | 75 | - Use `node['golang']['install_dir']` attribute in default recipe. 76 | - Fix source installation issues 77 | 78 | ## 5.3.3 - *2022-08-07* 79 | 80 | Standardise files with files in sous-chefs/repo-management 81 | 82 | ## 5.3.2 - *2022-02-09* 83 | 84 | - Remove delivery and move to calling RSpec directly via a reusable workflow 85 | - Update tested platforms 86 | - Standardise files with files in sous-chefs/repo-management 87 | 88 | ## 5.3.1 - *2021-08-30* 89 | 90 | - Standardise files with files in sous-chefs/repo-management 91 | 92 | ## 5.3.0 - *2021-07-15* 93 | 94 | - Fix `unified_mode` declaration 95 | - Bump `ark` dependency to one with `unified_mode` set 96 | 97 | ## 5.2.0 - *2021-06-04* 98 | 99 | - Update example package to adhere with modern Go standards 100 | 101 | ## 5.1.0 - *2021-06-03* 102 | 103 | - Fix resource to use the correct path in GOPATH profile.d template 104 | 105 | ## 5.0.1 - *2021-06-01* 106 | 107 | - Standardise files with files in sous-chefs/repo-management 108 | 109 | ## 5.0.0 - *2021-05-21* 110 | 111 | - Require chef 15.3 or greater 112 | - Use unified_mode for chef 17 support 113 | 114 | ## 4.1.1 - *2021-02-03* 115 | 116 | - Use `node['golang']['scm']` and `node['golang']['scm_packages']` attributes in default recipe. 117 | 118 | ## 4.1.0 119 | 120 | - Create a custom resource to install Go from source or by downloading a package 121 | 122 | ## 4.0.0 123 | 124 | - Update testing setup: 125 | - Use Chef Workstation instead of Rubygems 126 | - Includes dropping `foodcritic` in favor of current `cookstyle` 127 | - Add more recent & current distro versions 128 | - Add very basic unit tests 129 | - Use GitHub Actions instead of Travis CI 130 | - Refactor minitest to Inspec 131 | - Refactor to use current style of Chef Custom Resource 132 | - Update default version to Go v1.14.4 133 | - Use `build_essential` when building from source 134 | - Requires Chef >= 14.0.0 135 | - Omit attempting to install `bzr` on CentOS 8, they do not have that package available 136 | - Utilize default Chef order-of-operations instead of `notifies` 137 | - Use `ark` resource to simplify download & installation of binary & source 138 | - Clean up unnecessary env vars from source build 139 | - Build from source per [official Go docs](https://golang.org/doc/install/source) 140 | - Use native resources instead of shell commands when building from source 141 | - Set `$PATH` in `golang.sh` so that the existing values are last, per general practice 142 | - Tighten up `golang_package` so it does not perform actions at compile time, it uses `execute` in favor of `bash` resources, and in general is more Chef-y 143 | - Update tests to validate that non-root users can install Go and Go packages 144 | - Refactor attributes to add ability to install a version from source that differs from the packaged version (which is needed to build from source) 145 | 146 | ## 3.0.0 147 | 148 | - rename to `chef-golang` so that metadata name matches repositoriy name 149 | 150 | ## 2.0.0 151 | 152 | - change attribute namespace to `node['golang']` 153 | 154 | ## 1.7.2 155 | 156 | - Better chef12,13 support 157 | - Ruby 2.3 158 | - Update gems, lint 159 | 160 | ## 1.7.1 161 | 162 | - Create a temporary directory 163 | 164 | ## 1.7.0 165 | 166 | - Golang 1.5 167 | 168 | ## 1.6.2 169 | 170 | - Ability to install from source 171 | 172 | ## 1.6.0 173 | 174 | - Removed support for Ruby 1.9.3 175 | 176 | ## 1.5.1 177 | 178 | - Fix testing with Vagrant, Test-Kitchen 179 | - Golang 1.4 180 | 181 | ## 1.5.0 182 | 183 | - Golang 1.3 184 | 185 | ## 1.4.0 186 | 187 | - Add build action to LWRP 188 | - Update default go version to 1.2.2 189 | - Add autodetection the platform architecture 190 | - Change package location to `http://golang.org/dl/` 191 | 192 | ## 1.3.0 193 | 194 | ## 1.2.0 195 | 196 | ## 1.1.0 197 | 198 | - Added package LWRP 199 | - Configurable `gopath` & `gobin` 200 | 201 | ## 1.0.2 202 | 203 | - Lets users easily specify another install dir 204 | 205 | ## 1.0.1 206 | 207 | - Avoid extra unpacked copy of Go 208 | 209 | ## 1.0.0 210 | 211 | - Initial release of golang 212 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Community Guidelines 2 | 3 | This project follows the Chef Community Guidelines 4 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | Please refer to 4 | [https://github.com/chef-cookbooks/community_cookbook_documentation/blob/main/CONTRIBUTING.MD](https://github.com/chef-cookbooks/community_cookbook_documentation/blob/main/CONTRIBUTING.MD) 5 | -------------------------------------------------------------------------------- /Dangerfile: -------------------------------------------------------------------------------- 1 | # Reference: http://danger.systems/reference.html 2 | 3 | # A pull request summary is required. Add a description of the pull request purpose. 4 | # Changelog must be updated for each pull request that changes code. 5 | # Warnings will be issued for: 6 | # Pull request with more than 400 lines of code changed 7 | # Pull reqest that change more than 5 lines without test changes 8 | # Failures will be issued for: 9 | # Pull request without summary 10 | # Pull requests with code changes without changelog entry 11 | 12 | def code_changes? 13 | code = %w(libraries attributes recipes resources files templates) 14 | code.each do |location| 15 | return true unless git.modified_files.grep(/#{location}/).empty? 16 | end 17 | false 18 | end 19 | 20 | def test_changes? 21 | tests = %w(spec test kitchen.yml kitchen.dokken.yml) 22 | tests.each do |location| 23 | return true unless git.modified_files.grep(/#{location}/).empty? 24 | end 25 | false 26 | end 27 | 28 | failure 'Please provide a summary of your Pull Request.' if github.pr_body.length < 10 29 | 30 | warn 'This is a big Pull Request.' if git.lines_of_code > 400 31 | 32 | warn 'This is a Table Flip.' if git.lines_of_code > 2000 33 | 34 | # Require a CHANGELOG entry for non-test changes. 35 | if !git.modified_files.include?('CHANGELOG.md') && code_changes? 36 | failure 'Please include a CHANGELOG entry.' 37 | end 38 | 39 | # Require Major Minor Patch version labels 40 | unless github.pr_labels.grep /minor|major|patch/i 41 | warn 'Please add a release label to this pull request' 42 | end 43 | 44 | # A sanity check for tests. 45 | if git.lines_of_code > 5 && code_changes? && !test_changes? 46 | warn 'This Pull Request is probably missing tests.' 47 | end 48 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Golang (Go) Cookbook 2 | 3 | [![Cookbook Version](https://img.shields.io/cookbook/v/golang.svg?style=flat)](https://supermarket.chef.io/cookbooks/golang) 4 | [![CI State](https://github.com/sous-chefs/golang/workflows/ci/badge.svg)](https://github.com/sous-chefs/golang/actions?query=workflow%3Aci) 5 | [![OpenCollective](https://opencollective.com/sous-chefs/backers/badge.svg)](#backers) 6 | [![OpenCollective](https://opencollective.com/sous-chefs/sponsors/badge.svg)](#sponsors) 7 | [![License](https://img.shields.io/badge/License-Apache%202.0-green.svg)](https://opensource.org/licenses/Apache-2.0) 8 | 9 | ## Description 10 | 11 | Chef cookbook for the [Go programming language](http://golang.org/). 12 | 13 | ## Requirements 14 | 15 | ### Platform 16 | 17 | * Ubuntu >= 18.04 18 | * Debian >= 8 19 | * CentOS >= 7 20 | 21 | ## Usage 22 | 23 | ### golang::default 24 | 25 | Include `golang` in your node's `run_list`: 26 | 27 | ```json 28 | { 29 | "name":"my_node", 30 | "run_list": [ 31 | "recipe[golang]" 32 | ] 33 | } 34 | ``` 35 | 36 | ### golang::packages 37 | 38 | To install Go packages using node attributes add the packages to the `['golang']['packages']` attribute: 39 | 40 | ```json 41 | { 42 | "name":"my_node", 43 | "golang": { 44 | "packages": [ 45 | "github.com/go-check/check" 46 | ] 47 | }, 48 | "run_list": [ 49 | "recipe[golang]" 50 | ] 51 | } 52 | ``` 53 | 54 | ## Contributors 55 | 56 | This project exists thanks to all the people who [contribute.](https://opencollective.com/sous-chefs/contributors.svg?width=890&button=false) 57 | 58 | ### Backers 59 | 60 | Thank you to all our backers! 61 | 62 | ![https://opencollective.com/sous-chefs#backers](https://opencollective.com/sous-chefs/backers.svg?width=600&avatarHeight=40) 63 | 64 | ### Sponsors 65 | 66 | Support this project by becoming a sponsor. Your logo will show up here with a link to your website. 67 | 68 | ![https://opencollective.com/sous-chefs/sponsor/0/website](https://opencollective.com/sous-chefs/sponsor/0/avatar.svg?avatarHeight=100) 69 | ![https://opencollective.com/sous-chefs/sponsor/1/website](https://opencollective.com/sous-chefs/sponsor/1/avatar.svg?avatarHeight=100) 70 | ![https://opencollective.com/sous-chefs/sponsor/2/website](https://opencollective.com/sous-chefs/sponsor/2/avatar.svg?avatarHeight=100) 71 | ![https://opencollective.com/sous-chefs/sponsor/3/website](https://opencollective.com/sous-chefs/sponsor/3/avatar.svg?avatarHeight=100) 72 | ![https://opencollective.com/sous-chefs/sponsor/4/website](https://opencollective.com/sous-chefs/sponsor/4/avatar.svg?avatarHeight=100) 73 | ![https://opencollective.com/sous-chefs/sponsor/5/website](https://opencollective.com/sous-chefs/sponsor/5/avatar.svg?avatarHeight=100) 74 | ![https://opencollective.com/sous-chefs/sponsor/6/website](https://opencollective.com/sous-chefs/sponsor/6/avatar.svg?avatarHeight=100) 75 | ![https://opencollective.com/sous-chefs/sponsor/7/website](https://opencollective.com/sous-chefs/sponsor/7/avatar.svg?avatarHeight=100) 76 | ![https://opencollective.com/sous-chefs/sponsor/8/website](https://opencollective.com/sous-chefs/sponsor/8/avatar.svg?avatarHeight=100) 77 | ![https://opencollective.com/sous-chefs/sponsor/9/website](https://opencollective.com/sous-chefs/sponsor/9/avatar.svg?avatarHeight=100) 78 | -------------------------------------------------------------------------------- /TESTING.md: -------------------------------------------------------------------------------- 1 | # Testing 2 | 3 | Please refer to [the community cookbook documentation on testing](https://github.com/chef-cookbooks/community_cookbook_documentation/blob/main/TESTING.MD). 4 | -------------------------------------------------------------------------------- /attributes/default.rb: -------------------------------------------------------------------------------- 1 | # 2 | # Cookbook:: golang 3 | # Attribute:: default 4 | # 5 | 6 | default['golang']['scm'] = true 7 | default['golang']['scm_packages'] = %w(git) 8 | default['golang']['install_dir'] = '/usr/local' 9 | default['golang']['gopath'] = '/opt/go' 10 | default['golang']['gobin'] = '/opt/go/bin' 11 | default['golang']['packages'] = [] 12 | -------------------------------------------------------------------------------- /chefignore: -------------------------------------------------------------------------------- 1 | # Put files/directories that should be ignored in this file when uploading 2 | # to a Chef Infra Server or Supermarket. 3 | # Lines that start with '# ' are comments. 4 | 5 | # OS generated files # 6 | ###################### 7 | .DS_Store 8 | ehthumbs.db 9 | Icon? 10 | nohup.out 11 | Thumbs.db 12 | .envrc 13 | 14 | # EDITORS # 15 | ########### 16 | .#* 17 | .project 18 | .settings 19 | *_flymake 20 | *_flymake.* 21 | *.bak 22 | *.sw[a-z] 23 | *.tmproj 24 | *~ 25 | \#* 26 | REVISION 27 | TAGS* 28 | tmtags 29 | .vscode 30 | .editorconfig 31 | 32 | ## COMPILED ## 33 | ############## 34 | *.class 35 | *.com 36 | *.dll 37 | *.exe 38 | *.o 39 | *.pyc 40 | *.so 41 | */rdoc/ 42 | a.out 43 | mkmf.log 44 | 45 | # Testing # 46 | ########### 47 | .circleci/* 48 | .codeclimate.yml 49 | .delivery/* 50 | .foodcritic 51 | .kitchen* 52 | .mdlrc 53 | .overcommit.yml 54 | .rspec 55 | .rubocop.yml 56 | .travis.yml 57 | .watchr 58 | .yamllint 59 | azure-pipelines.yml 60 | Dangerfile 61 | examples/* 62 | features/* 63 | Guardfile 64 | kitchen*.yml 65 | mlc_config.json 66 | Procfile 67 | Rakefile 68 | spec/* 69 | test/* 70 | 71 | # SCM # 72 | ####### 73 | .git 74 | .gitattributes 75 | .gitconfig 76 | .github/* 77 | .gitignore 78 | .gitkeep 79 | .gitmodules 80 | .svn 81 | */.bzr/* 82 | */.git 83 | */.hg/* 84 | */.svn/* 85 | 86 | # Berkshelf # 87 | ############# 88 | Berksfile 89 | Berksfile.lock 90 | cookbooks/* 91 | tmp 92 | 93 | # Bundler # 94 | ########### 95 | vendor/* 96 | Gemfile 97 | Gemfile.lock 98 | 99 | # Policyfile # 100 | ############## 101 | Policyfile.rb 102 | Policyfile.lock.json 103 | 104 | # Documentation # 105 | ############# 106 | CODE_OF_CONDUCT* 107 | CONTRIBUTING* 108 | documentation/* 109 | TESTING* 110 | UPGRADING* 111 | 112 | # Vagrant # 113 | ########### 114 | .vagrant 115 | Vagrantfile 116 | -------------------------------------------------------------------------------- /documentation/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sous-chefs/golang/7d69c4e9daac802daa37fc018b46ff1a17d3c757/documentation/.gitkeep -------------------------------------------------------------------------------- /documentation/resources/golang.md: -------------------------------------------------------------------------------- 1 | # Resource: golang 2 | 3 | ## Actions 4 | 5 | | Action | Description | 6 | | ------ | -------------------------- | 7 | | install | Install golang from binary or source | 8 | 9 | ## Properties 10 | 11 | | Properties | Description | Type | Values and Default | 12 | | -------------- | --------------------------------------- | ------------------------ | ---------------------------------- | 13 | | install_dir | Base directory for go product | String | Default /usr/local | 14 | | gopath | User level go directory | String | Default /opt/go | 15 | | gogin | User level go bin directory | String | Default /opt/go/bin | 16 | | owner | Owner of the user directories | String | Default root | 17 | | group | Group of the user directories | String | Default root | 18 | | directory_mode | mode for user directories | String | Default 0755 | 19 | | version | Version of go to install | String | Default 1.14.4 | 20 | | source_version | Version of go to compile from source | String | Default 1.14.4 | 21 | | url | Location of the golang binary package for the target version | String | Default and computed from the OS and version | 22 | | from_source | Install and compile golang from source | True, False | Default false | 23 | | source_url | Location of the golang source url for the source version | String | Default and computed from the version | 24 | | source_method | Compile script in the golang source package | String | Default all.bash | 25 | | scm | Install SCM packages, git and mercurial | True, False | Default True | 26 | | scm_packages | Source control packages to install | String, Array | Default [git mercurial] | 27 | 28 | ```ruby 29 | golang "Install binary" do 30 | url 'https://dl.google.com/go/go1.14.4.linux-amd64.tar.gz' 31 | end 32 | ``` 33 | 34 | ```ruby 35 | golang "Install from source" do 36 | url 'https://dl.google.com/go/go1.14.4.linux-amd64.tar.gz' 37 | source_url 'https://dl.google.com/go/go1.14.4.src.tar.gz 38 | end 39 | ````` 40 | 41 | ## Notes 42 | 43 | Go compile is bootstrapped using go. So a binary install is required before compiling the source. 44 | -------------------------------------------------------------------------------- /kitchen.dokken.yml: -------------------------------------------------------------------------------- 1 | driver: 2 | name: dokken 3 | privileged: true 4 | chef_version: <%= ENV['CHEF_VERSION'] || 'current' %> 5 | 6 | transport: { name: dokken } 7 | provisioner: { name: dokken } 8 | 9 | platforms: 10 | - name: almalinux-8 11 | driver: 12 | image: dokken/almalinux-8 13 | pid_one_command: /usr/lib/systemd/systemd 14 | 15 | - name: almalinux-9 16 | driver: 17 | image: dokken/almalinux-9 18 | pid_one_command: /usr/lib/systemd/systemd 19 | 20 | - name: almalinux-10 21 | driver: 22 | image: dokken/almalinux-10 23 | pid_one_command: /usr/lib/systemd/systemd 24 | 25 | - name: amazonlinux-2023 26 | driver: 27 | image: dokken/amazonlinux-2023 28 | pid_one_command: /usr/lib/systemd/systemd 29 | 30 | - name: centos-stream-9 31 | driver: 32 | image: dokken/centos-stream-9 33 | pid_one_command: /usr/lib/systemd/systemd 34 | 35 | - name: centos-stream-10 36 | driver: 37 | image: dokken/centos-stream-10 38 | pid_one_command: /usr/lib/systemd/systemd 39 | 40 | - name: debian-11 41 | driver: 42 | image: dokken/debian-11 43 | pid_one_command: /bin/systemd 44 | 45 | - name: debian-12 46 | driver: 47 | image: dokken/debian-12 48 | pid_one_command: /bin/systemd 49 | 50 | - name: fedora-latest 51 | driver: 52 | image: dokken/fedora-latest 53 | pid_one_command: /usr/lib/systemd/systemd 54 | 55 | - name: opensuse-leap-15 56 | driver: 57 | image: dokken/opensuse-leap-15 58 | pid_one_command: /usr/lib/systemd/systemd 59 | 60 | - name: oraclelinux-8 61 | driver: 62 | image: dokken/oraclelinux-8 63 | pid_one_command: /usr/lib/systemd/systemd 64 | 65 | - name: oraclelinux-9 66 | driver: 67 | image: dokken/oraclelinux-9 68 | pid_one_command: /usr/lib/systemd/systemd 69 | 70 | - name: rockylinux-8 71 | driver: 72 | image: dokken/rockylinux-8 73 | pid_one_command: /usr/lib/systemd/systemd 74 | 75 | - name: rockylinux-9 76 | driver: 77 | image: dokken/rockylinux-9 78 | pid_one_command: /usr/lib/systemd/systemd 79 | 80 | - name: ubuntu-20.04 81 | driver: 82 | image: dokken/ubuntu-20.04 83 | pid_one_command: /bin/systemd 84 | 85 | - name: ubuntu-22.04 86 | driver: 87 | image: dokken/ubuntu-22.04 88 | pid_one_command: /bin/systemd 89 | 90 | - name: ubuntu-24.04 91 | driver: 92 | image: dokken/ubuntu-24.04 93 | pid_one_command: /bin/systemd 94 | -------------------------------------------------------------------------------- /kitchen.exec.yml: -------------------------------------------------------------------------------- 1 | --- 2 | driver: { name: exec } 3 | transport: { name: exec } 4 | 5 | platforms: 6 | - name: macos-latest 7 | - name: windows-latest 8 | -------------------------------------------------------------------------------- /kitchen.global.yml: -------------------------------------------------------------------------------- 1 | --- 2 | provisioner: 3 | name: chef_infra 4 | product_name: chef 5 | product_version: <%= ENV['CHEF_VERSION'] || 'latest' %> 6 | channel: stable 7 | install_strategy: once 8 | chef_license: accept 9 | enforce_idempotency: <%= ENV['ENFORCE_IDEMPOTENCY'] || true %> 10 | multiple_converge: <%= ENV['MULTIPLE_CONVERGE'] || 2 %> 11 | deprecations_as_errors: true 12 | log_level: <%= ENV['CHEF_LOG_LEVEL'] || 'auto' %> 13 | 14 | verifier: 15 | name: inspec 16 | 17 | platforms: 18 | - name: almalinux-8 19 | - name: almalinux-9 20 | - name: amazonlinux-2023 21 | - name: centos-stream-9 22 | - name: debian-11 23 | - name: debian-12 24 | - name: fedora-latest 25 | - name: opensuse-leap-15 26 | - name: oraclelinux-8 27 | - name: oraclelinux-9 28 | - name: rockylinux-8 29 | - name: rockylinux-9 30 | - name: ubuntu-20.04 31 | - name: ubuntu-22.04 32 | - name: ubuntu-24.04 33 | -------------------------------------------------------------------------------- /kitchen.yml: -------------------------------------------------------------------------------- 1 | --- 2 | driver: 3 | name: dokken 4 | chef_version: latest 5 | privileged: true 6 | 7 | transport: 8 | name: dokken 9 | 10 | provisioner: 11 | name: dokken 12 | 13 | verifier: 14 | name: inspec 15 | 16 | platforms: 17 | - name: almalinux-8 18 | - name: amazonlinux-2 19 | - name: centos-7 20 | - name: centos-stream-8 21 | - name: debian-10 22 | - name: debian-11 23 | - name: fedora-latest 24 | - name: opensuse-leap-15 25 | - name: rockylinux-8 26 | - name: ubuntu-18.04 27 | - name: ubuntu-20.04 28 | 29 | suites: 30 | - name: default 31 | run_list: 32 | - recipe[test::default] 33 | attributes: 34 | golang: 35 | owner: golang 36 | group: golang 37 | 38 | - name: source 39 | run_list: 40 | - recipe[test::default] 41 | attributes: 42 | golang: 43 | from_source: true 44 | source_version: 1.13.12 45 | owner: golang 46 | group: golang 47 | 48 | - name: install-dir 49 | run_list: 50 | - recipe[test::default] 51 | attributes: 52 | golang: 53 | from_source: true 54 | source_version: 1.13.12 55 | owner: golang 56 | group: golang 57 | install_dir: /srv 58 | -------------------------------------------------------------------------------- /metadata.rb: -------------------------------------------------------------------------------- 1 | name 'golang' 2 | maintainer 'Sous Chefs' 3 | maintainer_email 'help@sous-chefs.org' 4 | license 'Apache-2.0' 5 | description 'Installs go programming language' 6 | source_url 'https://github.com/sous-chefs/golang' 7 | issues_url 'https://github.com/sous-chefs/golang/issues' 8 | chef_version '>= 15.3' 9 | version '5.4.21' 10 | 11 | supports 'debian' 12 | supports 'ubuntu' 13 | supports 'redhat' 14 | supports 'centos' 15 | supports 'fedora' 16 | supports 'amazon' 17 | supports 'scientific' 18 | supports 'oracle' 19 | 20 | depends 'ark', '>= 6.0' 21 | -------------------------------------------------------------------------------- /recipes/default.rb: -------------------------------------------------------------------------------- 1 | # 2 | # Cookbook:: golang 3 | # Recipe:: default 4 | # 5 | # Copyright:: 2013-2021, Alexander Rozhnov 6 | # 7 | # Licensed under the Apache License, Version 2.0 (the "License"); you may not 8 | # use this file except in compliance with the License. You may obtain a copy 9 | # of the License at 10 | # 11 | # http://www.apache.org/licenses/LICENSE-2.0 12 | # 13 | # Unless required by applicable law or agreed to in writing, software 14 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 15 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 16 | # License for the specific language governing permissions and limitations 17 | # under the License. 18 | # 19 | 20 | golang 'Install go' do 21 | from_source node['golang']['from_source'] 22 | version node['golang']['version'] if node['golang']['version'] # go version 23 | install_dir node['golang']['install_dir'] if node['golang']['install_dir'] # go install_dir - e.g. /opt or /usr/local 24 | source_version node['golang']['source_version'] if node['golang']['source_version'] # go version from source 25 | scm node['golang']['scm'] 26 | scm_packages node['golang']['scm_packages'] 27 | owner node['golang']['owner'] if node['golang']['owner'] 28 | group node['golang']['group'] if node['golang']['group'] 29 | end 30 | 31 | node['golang']['packages'].each do |package| 32 | golang_package package 33 | end 34 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": ["config:base"], 4 | "packageRules": [ 5 | { 6 | "groupName": "Actions", 7 | "matchUpdateTypes": ["minor", "patch", "pin"], 8 | "automerge": true, 9 | "addLabels": ["Release: Patch", "Skip: Announcements"] 10 | }, 11 | { 12 | "groupName": "Actions", 13 | "matchUpdateTypes": ["major"], 14 | "automerge": false, 15 | "addLabels": ["Release: Patch", "Skip: Announcements"] 16 | } 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /resources/default.rb: -------------------------------------------------------------------------------- 1 | # 2 | # Cookbook:: golang 3 | # Resource:: default 4 | # 5 | # Copyright:: 2020-2021, Sous-chefs 6 | # 7 | # Licensed under the Apache License, Version 2.0 (the "License"); you may not 8 | # use this file except in compliance with the License. You may obtain a copy 9 | # of the License at 10 | # 11 | # http://www.apache.org/licenses/LICENSE-2.0 12 | # 13 | # Unless required by applicable law or agreed to in writing, software 14 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 15 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 16 | # License for the specific language governing permissions and limitations 17 | # under the License. 18 | # 19 | 20 | unified_mode true 21 | 22 | # Install golang by compiling from source 23 | property :from_source, [true, false], default: false 24 | 25 | # Base directory for go 26 | property :install_dir, String, default: '/usr/local' 27 | property :gopath, String, default: '/opt/go' 28 | property :gobin, String, default: '/opt/go/bin' 29 | 30 | # Directory and file attributes 31 | property :owner, String, default: 'root' 32 | property :group, String, default: 'root' 33 | property :directory_mode, String, default: '0755' 34 | 35 | # version to install 36 | # ark input binaries and stuff download 37 | # e.g. https://dl.google.com/go/go1.14.4.linux-amd64.tar.gz 38 | # https://dl.google.com/go/go1.14.4/linux-amd64.tar.gz 39 | # https://golang.org/dl/go1.14.6.darwin-amd64.tar.gz 40 | # https://golang.org/dl/go1.14.6.linux-amd64.tar.gz 41 | property :url, String, default: 'https://golang.org/dl/goVERSION.OS-PLATFORM.tar.gz' 42 | property :version, String, default: '1.14.4' 43 | 44 | # ark input source 45 | # e.g. https://dl.google.com/go/go1.14.4.src.tar.gz 46 | property :source_url, String, default: 'https://golang.org/dl/goVERSION.src.tar.gz' 47 | property :source_version, String, default: '1.14.4' 48 | 49 | # installation script from the source repository 50 | property :source_method, String, default: 'all.bash' 51 | 52 | # install SCM packages 53 | property :scm, [true, false], default: true 54 | property :scm_packages, [String, Array], default: %w(git mercurial) 55 | 56 | action_class do 57 | def bin_url 58 | return new_resource.url if property_is_set?(:url) 59 | new_resource.url.sub(/PLATFORM/, platform).sub(/OS/, os).sub(/VERSION/, new_resource.version) 60 | end 61 | 62 | def source_url 63 | return new_resource.source_url if property_is_set?(:source_url) 64 | new_resource.source_url.sub(/VERSION/, new_resource.source_version) 65 | end 66 | 67 | def os 68 | node['os'] 69 | end 70 | 71 | def platform 72 | node['kernel']['machine'] =~ /i.86/ ? '386' : 'amd64' 73 | end 74 | end 75 | 76 | action :install do 77 | directory new_resource.gopath do 78 | recursive true 79 | owner new_resource.owner 80 | group new_resource.group 81 | mode new_resource.directory_mode 82 | end 83 | 84 | directory new_resource.gobin do 85 | recursive true 86 | owner new_resource.owner 87 | group new_resource.group 88 | mode new_resource.directory_mode 89 | end 90 | 91 | directory new_resource.install_dir do 92 | recursive true 93 | mode new_resource.directory_mode 94 | end 95 | 96 | directory ::File.join(Chef::Config[:file_cache_path], 'go') do 97 | recursive true 98 | end 99 | 100 | template '/etc/profile.d/golang.sh' do 101 | source 'golang.sh.erb' 102 | mode new_resource.directory_mode 103 | variables gobin: new_resource.gobin, 104 | gopath: new_resource.gopath, 105 | install_dir: new_resource.install_dir 106 | end 107 | 108 | if new_resource.scm 109 | apt_update do 110 | only_if { platform_family? 'debian' } 111 | end 112 | package new_resource.scm_packages 113 | end 114 | 115 | # pkg to install go binaries, doc, base packages 116 | # ark is not idempotent by itself. Check to see if the go binary is the correct version 117 | url = bin_url 118 | ark 'go' do 119 | url url 120 | version new_resource.version 121 | not_if "/usr/local/go-#{new_resource.version}/bin/go version | grep #{new_resource.version}" 122 | not_if { new_resource.from_source } 123 | end 124 | 125 | ##### SOURCE BUILD 126 | 127 | if new_resource.from_source 128 | bootstrap_go = ::File.join(Chef::Config[:file_cache_path], 'go-bootstrap') 129 | ark 'go' do 130 | url url 131 | version new_resource.version 132 | prefix_root bootstrap_go 133 | not_if "test -x #{::File.join(new_resource.install_dir, 'go', 'bin', 'go')} && #{::File.join(new_resource.install_dir, 'go', 'bin', 'go')} version | grep #{new_resource.source_version}" 134 | end 135 | 136 | directory ::File.join(new_resource.install_dir, 'go', 'bin') do 137 | recursive true 138 | mode new_resource.directory_mode 139 | end 140 | 141 | build_essential 142 | 143 | file "#{new_resource.install_dir}/go" do 144 | manage_symlink_source true 145 | action :delete 146 | only_if do 147 | # Create idempotency by not deleting symlink if it points to source build 148 | ::File.exist?("#{new_resource.install_dir}/go") && 149 | ::File.ftype("#{new_resource.install_dir}/go") == 'link' && 150 | ::File.readlink("#{new_resource.install_dir}/go") != "#{new_resource.install_dir}/go-source" 151 | end 152 | end 153 | 154 | url = source_url 155 | ark 'go' do # resource with the same name, that's an issue. Source install 156 | path new_resource.install_dir 157 | url url 158 | version 'source' 159 | release_file '/tmp/ark_release_file' 160 | not_if "test -x #{::File.join(new_resource.install_dir, 'go', 'bin', 'go')} && #{::File.join(new_resource.install_dir, 'go', 'bin', 'go')} version | grep #{new_resource.source_version}" 161 | action :put 162 | end 163 | 164 | # see if build already done 165 | # converge_by if not done 166 | execute 'build-golang' do 167 | cwd "#{new_resource.install_dir}/go/src" 168 | command "./#{new_resource.source_method}" 169 | environment({ 170 | # Use the package-installed Go as the bootstrap version b/c Go is built with Go 171 | GOROOT_BOOTSTRAP: "#{bootstrap_go}/go-#{new_resource.version}", 172 | GOROOT: "#{new_resource.install_dir}/go", 173 | GOBIN: "#{new_resource.install_dir}/go/bin", 174 | }) 175 | not_if "test -x #{::File.join(new_resource.install_dir, 'go', 'bin', 'go')} && #{::File.join(new_resource.install_dir, 'go', 'bin', 'go')} version | grep #{new_resource.source_version}" 176 | end 177 | 178 | # Cleanup bootstrap go if everything was installed properly 179 | directory bootstrap_go do 180 | recursive true 181 | action :delete 182 | only_if "test -x #{::File.join(new_resource.install_dir, 'go', 'bin', 'go')} && #{::File.join(new_resource.install_dir, 'go', 'bin', 'go')} version | grep #{new_resource.source_version}" 183 | end 184 | end 185 | end 186 | -------------------------------------------------------------------------------- /resources/package.rb: -------------------------------------------------------------------------------- 1 | # 2 | # Cookbook:: golang 3 | # Resource:: default 4 | # 5 | # Copyright:: 2020-2021, Sous-chefs 6 | # 7 | # Licensed under the Apache License, Version 2.0 (the "License"); you may not 8 | # use this file except in compliance with the License. You may obtain a copy 9 | # of the License at 10 | # 11 | # http://www.apache.org/licenses/LICENSE-2.0 12 | # 13 | # Unless required by applicable law or agreed to in writing, software 14 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 15 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 16 | # License for the specific language governing permissions and limitations 17 | # under the License. 18 | # 19 | 20 | unified_mode true 21 | 22 | default_action :install 23 | 24 | gocache = '/tmp/go' 25 | 26 | action :install do 27 | execute "go get #{new_resource.name}" do 28 | user node['golang']['owner'] 29 | group node['golang']['group'] 30 | environment({ 31 | PATH: "#{node['golang']['install_dir']}/go/bin:#{node['golang']['gobin']}:" \ 32 | '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin', 33 | GOPATH: node['golang']['gopath'], 34 | GOBIN: node['golang']['gobin'], 35 | GOCACHE: gocache, 36 | }) 37 | end 38 | end 39 | 40 | action :update do 41 | execute "go get -u #{new_resource.name}" do 42 | user node['golang']['owner'] 43 | group node['golang']['group'] 44 | environment({ 45 | PATH: "#{node['golang']['install_dir']}/go/bin:#{node['golang']['gobin']}:" \ 46 | '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin', 47 | GOPATH: node['golang']['gopath'], 48 | GOBIN: node['golang']['gobin'], 49 | GOCACHE: gocache, 50 | }) 51 | end 52 | end 53 | 54 | action :build do 55 | execute "go build -work -x #{new_resource.name}" do 56 | user node['golang']['owner'] 57 | group node['golang']['group'] 58 | cwd gocache 59 | environment({ 60 | PATH: "#{node['golang']['install_dir']}/go/bin:#{node['golang']['gobin']}:" \ 61 | '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin', 62 | HOME: "/home/#{node['golang']['owner']}", 63 | GOPATH: node['golang']['gopath'], 64 | GOBIN: node['golang']['gobin'], 65 | GOCACHE: gocache, 66 | }) 67 | end 68 | end 69 | -------------------------------------------------------------------------------- /spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | require 'chefspec' 2 | require 'chefspec/berkshelf' 3 | 4 | RSpec.configure do |config| 5 | config.color = true 6 | config.formatter = :documentation 7 | end 8 | -------------------------------------------------------------------------------- /spec/unit/recipes/default_spec.rb: -------------------------------------------------------------------------------- 1 | # 2 | # Cookbook:: golang 3 | # Spec:: default 4 | # 5 | # Copyright:: 2020-2021, Jeff Byrnes 6 | # 7 | # Licensed under the Apache License, Version 2.0 (the "License"); you may not 8 | # use this file except in compliance with the License. You may obtain a copy 9 | # of the License at 10 | # 11 | # http://www.apache.org/licenses/LICENSE-2.0 12 | # 13 | # Unless required by applicable law or agreed to in writing, software 14 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 15 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 16 | # License for the specific language governing permissions and limitations 17 | # under the License. 18 | # 19 | 20 | require 'spec_helper' 21 | 22 | describe 'golang::default' do 23 | context 'When all attributes are default, on Ubuntu 20.04' do 24 | platform 'ubuntu', '20.04' 25 | 26 | before do 27 | stub_command('/usr/local/go/bin/go version | grep "go1.14.4 "').and_return false 28 | end 29 | 30 | it 'converges successfully' do 31 | expect { chef_run }.to_not raise_error 32 | end 33 | end 34 | end 35 | -------------------------------------------------------------------------------- /templates/golang.sh.erb: -------------------------------------------------------------------------------- 1 | export PATH="<%= ::File.join(@install_dir, 'go', 'bin') %>:<%= @gobin %>:$PATH" 2 | export GOPATH=<%= @gopath %> 3 | export GOBIN=<%= @gobin %> 4 | -------------------------------------------------------------------------------- /test/integration/cookbooks/test/README.md: -------------------------------------------------------------------------------- 1 | # test Cookbook 2 | 3 | Testing cookbook for `golang`. 4 | -------------------------------------------------------------------------------- /test/integration/cookbooks/test/files/default/helloWorld/go.mod: -------------------------------------------------------------------------------- 1 | module github.com/sous-chefs/golang 2 | 3 | go 1.16 4 | 5 | require github.com/stretchr/testify v1.7.0 // indirect 6 | -------------------------------------------------------------------------------- /test/integration/cookbooks/test/files/default/helloWorld/go.sum: -------------------------------------------------------------------------------- 1 | github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= 2 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 3 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 4 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 5 | github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= 6 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 7 | github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= 8 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 9 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 10 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= 11 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 12 | -------------------------------------------------------------------------------- /test/integration/cookbooks/test/files/default/helloWorld/helloworld.go: -------------------------------------------------------------------------------- 1 | package helloworld 2 | 3 | func HelloWorld() string { 4 | return "Hello, World!" 5 | } 6 | -------------------------------------------------------------------------------- /test/integration/cookbooks/test/files/default/helloWorld/helloworld_test.go: -------------------------------------------------------------------------------- 1 | package helloworld 2 | 3 | import ( 4 | "testing" 5 | 6 | "github.com/stretchr/testify/assert" 7 | ) 8 | 9 | func TestHelloWorld(t *testing.T) { 10 | t.Run("func HelloWorld returns 'Hello, World!'", func(t *testing.T) { 11 | expected := "Hello, World!" 12 | 13 | output := HelloWorld() 14 | 15 | assert.Equal(t, output, expected) 16 | }) 17 | } 18 | -------------------------------------------------------------------------------- /test/integration/cookbooks/test/metadata.rb: -------------------------------------------------------------------------------- 1 | name 'test' 2 | maintainer 'Sous Chefs' 3 | maintainer_email 'help@sous-chefs.org' 4 | license 'Apache-2.0' 5 | description 'Test' 6 | version '0.1.0' 7 | 8 | depends 'golang' 9 | -------------------------------------------------------------------------------- /test/integration/cookbooks/test/recipes/default.rb: -------------------------------------------------------------------------------- 1 | # 2 | # Cookbook:: test 3 | # Recipe:: default 4 | # 5 | # Copyright:: 2020-2022, Sous Chefs 6 | # 7 | # Licensed under the Apache License, Version 2.0 (the "License"); you may not 8 | # use this file except in compliance with the License. You may obtain a copy 9 | # of the License at 10 | # 11 | # http://www.apache.org/licenses/LICENSE-2.0 12 | # 13 | # Unless required by applicable law or agreed to in writing, software 14 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 15 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 16 | # License for the specific language governing permissions and limitations 17 | # under the License. 18 | # 19 | 20 | user 'golang' do 21 | manage_home true 22 | end 23 | 24 | group 'golang' do 25 | members 'golang' 26 | end 27 | 28 | include_recipe 'golang' 29 | 30 | package 'gcc' # required for the "go test" in the inspec tests 31 | 32 | remote_directory '/tmp/helloWorld' 33 | 34 | golang_package 'github.com/golang/example/hello' do 35 | action %i(install build) 36 | end 37 | -------------------------------------------------------------------------------- /test/integration/default/default_test.rb: -------------------------------------------------------------------------------- 1 | describe command '/usr/local/go/bin/go version' do 2 | its('stdout') { should include '1.14.4' } 3 | end 4 | 5 | describe command 'export GOPATH=/opt/go; cd /tmp/helloWorld && /usr/local/go/bin/go test' do 6 | its('exit_status') { should cmp 0 } 7 | end 8 | 9 | describe directory '/opt/go' do 10 | its('owner') { should eq 'golang' } 11 | its('group') { should eq 'golang' } 12 | end 13 | 14 | describe command '/opt/go/bin/hello' do 15 | its('stdout') { should include 'Hello, Go examples!' } 16 | end 17 | -------------------------------------------------------------------------------- /test/integration/install-dir/default_test.rb: -------------------------------------------------------------------------------- 1 | describe command '/srv/go/bin/go version' do 2 | its('stdout') { should include '1.13.12' } 3 | end 4 | 5 | describe command 'export GOPATH=/opt/go; cd /tmp/helloWorld && /srv/go/bin/go test' do 6 | its('exit_status') { should cmp 0 } 7 | end 8 | 9 | describe directory '/opt/go' do 10 | its('owner') { should eq 'golang' } 11 | its('group') { should eq 'golang' } 12 | end 13 | 14 | describe command '/opt/go/bin/hello' do 15 | its('stdout') { should include 'Hello, Go examples!' } 16 | end 17 | 18 | describe directory '/opt/kitchen/cache/go-bootstrap' do 19 | it { should_not exist } 20 | end 21 | -------------------------------------------------------------------------------- /test/integration/source/default_test.rb: -------------------------------------------------------------------------------- 1 | describe command '/usr/local/go/bin/go version' do 2 | its('stdout') { should include '1.13.12' } 3 | end 4 | 5 | describe command 'export GOPATH=/opt/go; cd /tmp/helloWorld && /usr/local/go/bin/go test' do 6 | its('exit_status') { should cmp 0 } 7 | end 8 | 9 | describe directory '/opt/go' do 10 | its('owner') { should eq 'golang' } 11 | its('group') { should eq 'golang' } 12 | end 13 | 14 | describe command '/opt/go/bin/hello' do 15 | its('stdout') { should include 'Hello, Go examples!' } 16 | end 17 | 18 | describe directory '/opt/kitchen/cache/go-bootstrap' do 19 | it { should_not exist } 20 | end 21 | --------------------------------------------------------------------------------