ci.yml 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. name: ci
  2. concurrency:
  3. group: ${{ github.workflow }}-${{ github.ref }}
  4. cancel-in-progress: true
  5. on:
  6. push:
  7. branches:
  8. - 'main'
  9. tags:
  10. - 'v*'
  11. pull_request:
  12. workflow_dispatch:
  13. inputs:
  14. debug_enabled:
  15. description: 'To run with tmate enter "debug_enabled"'
  16. required: false
  17. default: "false"
  18. permissions:
  19. contents: read # to fetch code (actions/checkout)
  20. jobs:
  21. prepare:
  22. runs-on: ubuntu-latest
  23. outputs:
  24. matrix: ${{ steps.platforms.outputs.matrix }}
  25. steps:
  26. -
  27. name: Checkout
  28. uses: actions/checkout@v3
  29. -
  30. name: Create matrix
  31. id: platforms
  32. run: |
  33. echo matrix=$(docker buildx bake binary-cross --print | jq -cr '.target."binary-cross".platforms') >> $GITHUB_OUTPUT
  34. -
  35. name: Show matrix
  36. run: |
  37. echo ${{ steps.platforms.outputs.matrix }}
  38. validate:
  39. runs-on: ubuntu-latest
  40. strategy:
  41. fail-fast: false
  42. matrix:
  43. target:
  44. - lint
  45. - validate-go-mod
  46. - validate-headers
  47. - validate-docs
  48. steps:
  49. -
  50. name: Checkout
  51. uses: actions/checkout@v3
  52. -
  53. name: Set up Docker Buildx
  54. uses: docker/setup-buildx-action@v2
  55. -
  56. name: Run
  57. run: |
  58. make ${{ matrix.target }}
  59. binary:
  60. runs-on: ubuntu-latest
  61. needs:
  62. - prepare
  63. strategy:
  64. fail-fast: false
  65. matrix:
  66. platform: ${{ fromJson(needs.prepare.outputs.matrix) }}
  67. steps:
  68. -
  69. name: Prepare
  70. run: |
  71. platform=${{ matrix.platform }}
  72. echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
  73. -
  74. name: Checkout
  75. uses: actions/checkout@v3
  76. -
  77. name: Set up QEMU
  78. uses: docker/setup-qemu-action@v2
  79. -
  80. name: Set up Docker Buildx
  81. uses: docker/setup-buildx-action@v2
  82. -
  83. name: Build
  84. uses: docker/bake-action@v2
  85. with:
  86. targets: release
  87. set: |
  88. *.platform=${{ matrix.platform }}
  89. *.cache-from=type=gha,scope=binary-${{ env.PLATFORM_PAIR }}
  90. *.cache-to=type=gha,scope=binary-${{ env.PLATFORM_PAIR }},mode=max
  91. -
  92. name: Upload artifacts
  93. uses: actions/upload-artifact@v3
  94. with:
  95. name: compose
  96. path: ./bin/release/*
  97. if-no-files-found: error
  98. test:
  99. runs-on: ubuntu-latest
  100. steps:
  101. -
  102. name: Checkout
  103. uses: actions/checkout@v3
  104. -
  105. name: Set up Docker Buildx
  106. uses: docker/setup-buildx-action@v2
  107. -
  108. name: Test
  109. uses: docker/bake-action@v2
  110. with:
  111. targets: test
  112. set: |
  113. *.cache-from=type=gha,scope=test
  114. *.cache-to=type=gha,scope=test
  115. -
  116. name: Gather coverage data
  117. uses: actions/upload-artifact@v3
  118. with:
  119. name: coverage-data-unit
  120. path: bin/coverage/unit/
  121. if-no-files-found: error
  122. -
  123. name: Unit Test Summary
  124. uses: test-summary/action@v2
  125. with:
  126. paths: bin/coverage/unit/report.xml
  127. if: always()
  128. e2e:
  129. runs-on: ubuntu-latest
  130. strategy:
  131. fail-fast: false
  132. matrix:
  133. mode:
  134. - plugin
  135. - standalone
  136. engine:
  137. - 24.0.9
  138. - 25.0.4
  139. - 26.0.0
  140. steps:
  141. -
  142. name: Checkout
  143. uses: actions/checkout@v3
  144. - name: Install Docker ${{ matrix.engine }}
  145. run: |
  146. sudo apt-get install curl
  147. curl -fsSL https://get.docker.com -o get-docker.sh
  148. sudo sh ./get-docker.sh --version ${{ matrix.engine }}
  149. - name: Check Docker Version
  150. run: docker --version
  151. -
  152. name: Set up Docker Buildx
  153. uses: docker/setup-buildx-action@v2
  154. -
  155. name: Set up Go
  156. uses: actions/setup-go@v3
  157. with:
  158. go-version-file: 'go.mod'
  159. check-latest: true
  160. cache: true
  161. -
  162. name: Build
  163. uses: docker/bake-action@v2
  164. with:
  165. targets: binary-with-coverage
  166. set: |
  167. *.cache-from=type=gha,scope=binary-linux-amd64
  168. *.cache-from=type=gha,scope=binary-e2e-${{ matrix.mode }}
  169. *.cache-to=type=gha,scope=binary-e2e-${{ matrix.mode }},mode=max
  170. env:
  171. BUILD_TAGS: e2e
  172. -
  173. name: Setup tmate session
  174. if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled }}
  175. uses: mxschmitt/action-tmate@8b4e4ac71822ed7e0ad5fb3d1c33483e9e8fb270 # v3.11
  176. with:
  177. limit-access-to-actor: true
  178. github-token: ${{ secrets.GITHUB_TOKEN }}
  179. -
  180. name: Test plugin mode
  181. if: ${{ matrix.mode == 'plugin' }}
  182. run: |
  183. rm -rf ./bin/coverage/e2e
  184. mkdir -p ./bin/coverage/e2e
  185. make e2e-compose GOCOVERDIR=bin/coverage/e2e TEST_FLAGS="-v"
  186. -
  187. name: Gather coverage data
  188. if: ${{ matrix.mode == 'plugin' }}
  189. uses: actions/upload-artifact@v3
  190. with:
  191. name: coverage-data-e2e
  192. path: bin/coverage/e2e/
  193. if-no-files-found: error
  194. -
  195. name: Test standalone mode
  196. if: ${{ matrix.mode == 'standalone' }}
  197. run: |
  198. rm -f /usr/local/bin/docker-compose
  199. cp bin/build/docker-compose /usr/local/bin
  200. make e2e-compose-standalone
  201. -
  202. name: e2e Test Summary
  203. uses: test-summary/action@v2
  204. with:
  205. paths: /tmp/report/report.xml
  206. if: always()
  207. coverage:
  208. runs-on: ubuntu-22.04
  209. needs:
  210. - test
  211. - e2e
  212. steps:
  213. # codecov won't process the report without the source code available
  214. - name: Checkout
  215. uses: actions/checkout@v3
  216. - name: Set up Go
  217. uses: actions/setup-go@v4
  218. with:
  219. go-version-file: 'go.mod'
  220. check-latest: true
  221. - name: Download unit test coverage
  222. uses: actions/download-artifact@v3
  223. with:
  224. name: coverage-data-unit
  225. path: coverage/unit
  226. - name: Download E2E test coverage
  227. uses: actions/download-artifact@v3
  228. with:
  229. name: coverage-data-e2e
  230. path: coverage/e2e
  231. - name: Merge coverage reports
  232. run: |
  233. go tool covdata textfmt -i=./coverage/unit,./coverage/e2e -o ./coverage.txt
  234. - name: Store coverage report in GitHub Actions
  235. uses: actions/upload-artifact@v3
  236. with:
  237. name: go-covdata-txt
  238. path: ./coverage.txt
  239. if-no-files-found: error
  240. - name: Upload coverage to Codecov
  241. uses: codecov/codecov-action@v3
  242. with:
  243. files: ./coverage.txt
  244. release:
  245. permissions:
  246. contents: write # to create a release (ncipollo/release-action)
  247. runs-on: ubuntu-latest
  248. needs:
  249. - binary
  250. steps:
  251. -
  252. name: Checkout
  253. uses: actions/checkout@v3
  254. -
  255. name: Download artifacts
  256. uses: actions/download-artifact@v3
  257. with:
  258. name: compose
  259. path: bin/release
  260. -
  261. name: Create checksums
  262. working-directory: bin/release
  263. run: |
  264. find . -type f -print0 | sort -z | xargs -r0 shasum -a 256 -b | sed 's# \*\./# *#' > $RUNNER_TEMP/checksums.txt
  265. shasum -a 256 -U -c $RUNNER_TEMP/checksums.txt
  266. mv $RUNNER_TEMP/checksums.txt .
  267. cat checksums.txt | while read sum file; do echo "$sum $file" > ${file#\*}.sha256; done
  268. -
  269. name: License
  270. run: cp packaging/* bin/release/
  271. -
  272. name: List artifacts
  273. run: |
  274. tree -nh bin/release
  275. -
  276. name: Check artifacts
  277. run: |
  278. find bin/release -type f -exec file -e ascii -- {} +
  279. -
  280. name: GitHub Release
  281. if: startsWith(github.ref, 'refs/tags/v')
  282. uses: ncipollo/release-action@58ae73b360456532aafd58ee170c045abbeaee37 # v1.10.0
  283. with:
  284. artifacts: bin/release/*
  285. generateReleaseNotes: true
  286. draft: true
  287. token: ${{ secrets.GITHUB_TOKEN }}