2
0

continuous-integration-workflow.yml 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. name: CI
  2. on:
  3. push:
  4. schedule:
  5. - cron: '0 10 * * *' # Once per day at 10am UTC
  6. workflow_dispatch: # Manual trigger
  7. env:
  8. SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
  9. GRADLE_ENTERPRISE_CACHE_USER: ${{ secrets.GRADLE_ENTERPRISE_CACHE_USER }}
  10. GRADLE_ENTERPRISE_CACHE_PASSWORD: ${{ secrets.GRADLE_ENTERPRISE_CACHE_PASSWORD }}
  11. GRADLE_ENTERPRISE_SECRET_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_SECRET_ACCESS_KEY }}
  12. COMMIT_OWNER: ${{ github.event.pusher.name }}
  13. COMMIT_SHA: ${{ github.sha }}
  14. ARTIFACTORY_USERNAME: ${{ secrets.ARTIFACTORY_USERNAME }}
  15. ARTIFACTORY_PASSWORD: ${{ secrets.ARTIFACTORY_PASSWORD }}
  16. RUN_JOBS: ${{ github.repository == 'spring-projects/spring-security' }}
  17. jobs:
  18. prerequisites:
  19. name: Pre-requisites for building
  20. runs-on: ubuntu-latest
  21. outputs:
  22. runjobs: ${{ steps.continue.outputs.runjobs }}
  23. steps:
  24. - uses: actions/checkout@v2
  25. - name: Initiate error tracking
  26. uses: spring-projects/track-build-errors-action@v1
  27. with:
  28. job-name: "prerequisites"
  29. - name: Export errors file
  30. uses: actions/upload-artifact@v2
  31. with:
  32. name: errors
  33. path: job-prerequisites.txt
  34. - id: continue
  35. name: Determine if should continue
  36. if: env.RUN_JOBS == 'true'
  37. run: echo "::set-output name=runjobs::true"
  38. build_jdk_11:
  39. name: Build JDK 11
  40. needs: [prerequisites]
  41. runs-on: ubuntu-latest
  42. if: needs.prerequisites.outputs.runjobs
  43. steps:
  44. - uses: actions/checkout@v2
  45. - name: Set up JDK 11
  46. uses: actions/setup-java@v1
  47. with:
  48. java-version: '11'
  49. - name: Setup gradle user name
  50. run: |
  51. mkdir -p ~/.gradle
  52. echo 'systemProp.user.name=spring-builds' >> ~/.gradle/gradle.properties
  53. - name: Cache Gradle packages
  54. uses: actions/cache@v2
  55. with:
  56. path: ~/.gradle/caches
  57. key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
  58. - name: Build with Gradle
  59. run: |
  60. export GRADLE_ENTERPRISE_CACHE_USERNAME="$GRADLE_ENTERPRISE_CACHE_USER"
  61. export GRADLE_ENTERPRISE_CACHE_PASSWORD="$GRADLE_ENTERPRISE_CACHE_PASSWORD"
  62. export GRADLE_ENTERPRISE_ACCESS_KEY="$GRADLE_ENTERPRISE_SECRET_ACCESS_KEY"
  63. ./gradlew clean build --continue -PartifactoryUsername="$ARTIFACTORY_USERNAME" -PartifactoryPassword="$ARTIFACTORY_PASSWORD"
  64. - name: Track error step
  65. uses: spring-projects/track-build-errors-action@v1
  66. if: ${{ failure() }}
  67. with:
  68. job-name: ${{ github.job }}
  69. - name: Export errors file
  70. uses: actions/upload-artifact@v2
  71. if: ${{ failure() }}
  72. with:
  73. name: errors
  74. path: job-${{ github.job }}.txt
  75. build_windows:
  76. name: Build Windows
  77. needs: [prerequisites]
  78. runs-on: windows-latest
  79. if: needs.prerequisites.outputs.runjobs
  80. steps:
  81. - uses: actions/checkout@v2
  82. - name: Set up JDK 11
  83. uses: actions/setup-java@v1
  84. with:
  85. java-version: '11'
  86. - name: Setup gradle user name
  87. run: |
  88. mkdir -p ~/.gradle
  89. echo 'systemProp.user.name=spring-builds' >> ~/.gradle/gradle.properties
  90. - name: Cache Gradle packages
  91. uses: actions/cache@v2
  92. with:
  93. path: ~/.gradle/caches
  94. key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
  95. - name: Build with Gradle
  96. env:
  97. GRADLE_ENTERPRISE_CACHE_USERNAME: ${{ secrets.GRADLE_ENTERPRISE_CACHE_USER }}
  98. GRADLE_ENTERPRISE_CACHE_PASSWORD: ${{ secrets.GRADLE_ENTERPRISE_CACHE_PASSWORD }}
  99. GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_SECRET_ACCESS_KEY }}
  100. run: ./gradlew clean build --continue -PartifactoryUsername="$ARTIFACTORY_USERNAME" -PartifactoryPassword="$ARTIFACTORY_PASSWORD"
  101. - name: Track error step
  102. uses: spring-projects/track-build-errors-action@v1
  103. if: ${{ failure() }}
  104. with:
  105. job-name: ${{ github.job }}
  106. - name: Export errors file
  107. uses: actions/upload-artifact@v2
  108. if: ${{ failure() }}
  109. with:
  110. name: errors
  111. path: job-${{ github.job }}.txt
  112. snapshot_tests:
  113. name: Test against snapshots
  114. needs: [prerequisites]
  115. runs-on: ubuntu-latest
  116. if: needs.prerequisites.outputs.runjobs
  117. steps:
  118. - uses: actions/checkout@v2
  119. - name: Set up JDK
  120. uses: actions/setup-java@v1
  121. with:
  122. java-version: '11'
  123. - name: Setup gradle user name
  124. run: |
  125. mkdir -p ~/.gradle
  126. echo 'systemProp.user.name=spring-builds' >> ~/.gradle/gradle.properties
  127. - name: Snapshot Tests
  128. run: |
  129. export GRADLE_ENTERPRISE_CACHE_USERNAME="$GRADLE_ENTERPRISE_CACHE_USER"
  130. export GRADLE_ENTERPRISE_CACHE_PASSWORD="$GRADLE_ENTERPRISE_CACHE_PASSWORD"
  131. export GRADLE_ENTERPRISE_ACCESS_KEY="$GRADLE_ENTERPRISE_SECRET_ACCESS_KEY"
  132. ./gradlew test --refresh-dependencies -PartifactoryUsername="$ARTIFACTORY_USERNAME" -PartifactoryPassword="$ARTIFACTORY_PASSWORD" -PforceMavenRepositories=snapshot -PspringVersion='5.+' -PreactorVersion='20+' -PspringDataVersion='Neumann-BUILD-SNAPSHOT' -PrsocketVersion=1.1.0-SNAPSHOT -PspringBootVersion=2.4.0-SNAPSHOT -PlocksDisabled --stacktrace
  133. - name: Track error step
  134. uses: spring-projects/track-build-errors-action@v1
  135. if: ${{ failure() }}
  136. with:
  137. job-name: ${{ github.job }}
  138. - name: Export errors file
  139. uses: actions/upload-artifact@v2
  140. if: ${{ failure() }}
  141. with:
  142. name: errors
  143. path: job-${{ github.job }}.txt
  144. sonar_analysis:
  145. name: Static Code Analysis
  146. needs: [prerequisites]
  147. runs-on: ubuntu-latest
  148. if: needs.prerequisites.outputs.runjobs
  149. env:
  150. SONAR_URL: ${{ secrets.SONAR_URL }}
  151. SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
  152. steps:
  153. - uses: actions/checkout@v2
  154. - name: Set up JDK
  155. uses: actions/setup-java@v1
  156. with:
  157. java-version: '11'
  158. - name: Setup gradle user name
  159. run: |
  160. mkdir -p ~/.gradle
  161. echo 'systemProp.user.name=spring-builds' >> ~/.gradle/gradle.properties
  162. - name: Run Sonar on given (non-main) branch
  163. if: ${{ github.ref != 'refs/heads/main' }}
  164. run: |
  165. export BRANCH=${GITHUB_REF#refs/heads/}
  166. export GRADLE_ENTERPRISE_CACHE_USERNAME="$GRADLE_ENTERPRISE_CACHE_USER"
  167. export GRADLE_ENTERPRISE_CACHE_PASSWORD="$GRADLE_ENTERPRISE_CACHE_PASSWORD"
  168. export GRADLE_ENTERPRISE_ACCESS_KEY="$GRADLE_ENTERPRISE_SECRET_ACCESS_KEY"
  169. ./gradlew sonarqube -PartifactoryUsername="$ARTIFACTORY_USERNAME" -PartifactoryPassword="$ARTIFACTORY_PASSWORD" -PexcludeProjects='**/samples/**' -Dsonar.projectKey="spring-security-${GITHUB_REF#refs/heads/}" -Dsonar.projectName="spring-security-${GITHUB_REF#refs/heads/}" -Dsonar.host.url="$SONAR_URL" -Dsonar.login="$SONAR_TOKEN" --stacktrace
  170. - name: Run Sonar on main
  171. if: ${{ github.ref == 'refs/heads/main' }}
  172. run: |
  173. export GRADLE_ENTERPRISE_CACHE_USERNAME="$GRADLE_ENTERPRISE_CACHE_USER"
  174. export GRADLE_ENTERPRISE_CACHE_PASSWORD="$GRADLE_ENTERPRISE_CACHE_PASSWORD"
  175. export GRADLE_ENTERPRISE_ACCESS_KEY="$GRADLE_ENTERPRISE_SECRET_ACCESS_KEY"
  176. ./gradlew sonarqube -PartifactoryUsername="$ARTIFACTORY_USERNAME" -PartifactoryPassword="$ARTIFACTORY_PASSWORD" -PexcludeProjects='**/samples/**' -Dsonar.host.url="$SONAR_URL" -Dsonar.login="$SONAR_TOKEN" --stacktrace
  177. - name: Track error step
  178. uses: spring-projects/track-build-errors-action@v1
  179. if: ${{ failure() }}
  180. with:
  181. job-name: ${{ github.job }}
  182. - name: Export errors file
  183. uses: actions/upload-artifact@v2
  184. if: ${{ failure() }}
  185. with:
  186. name: errors
  187. path: job-${{ github.job }}.txt
  188. deploy_artifacts:
  189. name: Deploy Artifacts
  190. needs: [build_jdk_11, build_windows, snapshot_tests, sonar_analysis]
  191. runs-on: ubuntu-latest
  192. steps:
  193. - uses: actions/checkout@v2
  194. - name: Set up JDK
  195. uses: actions/setup-java@v1
  196. with:
  197. java-version: '11'
  198. - name: Setup gradle user name
  199. run: |
  200. mkdir -p ~/.gradle
  201. echo 'systemProp.user.name=spring-builds' >> ~/.gradle/gradle.properties
  202. - name: Deploy artifacts
  203. run: |
  204. export GRADLE_ENTERPRISE_CACHE_USERNAME="$GRADLE_ENTERPRISE_CACHE_USER"
  205. export GRADLE_ENTERPRISE_CACHE_PASSWORD="$GRADLE_ENTERPRISE_CACHE_PASSWORD"
  206. export GRADLE_ENTERPRISE_ACCESS_KEY="$GRADLE_ENTERPRISE_SECRET_ACCESS_KEY"
  207. ./gradlew publishArtifacts finalizeDeployArtifacts -PossrhUsername="$OSSRH_TOKEN_USERNAME" -PossrhPassword="$OSSRH_TOKEN_PASSWORD" -PartifactoryUsername="$ARTIFACTORY_USERNAME" -PartifactoryPassword="$ARTIFACTORY_PASSWORD" --stacktrace
  208. env:
  209. ORG_GRADLE_PROJECT_signingKey: ${{ secrets.GPG_PRIVATE_KEY }}
  210. ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.GPG_PASSPHRASE }}
  211. OSSRH_TOKEN_USERNAME: ${{ secrets.OSSRH_S01_TOKEN_USERNAME }}
  212. OSSRH_TOKEN_PASSWORD: ${{ secrets.OSSRH_S01_TOKEN_PASSWORD }}
  213. ARTIFACTORY_USERNAME: ${{ secrets.ARTIFACTORY_USERNAME }}
  214. ARTIFACTORY_PASSWORD: ${{ secrets.ARTIFACTORY_PASSWORD }}
  215. - name: Track error step
  216. uses: spring-projects/track-build-errors-action@v1
  217. if: ${{ failure() }}
  218. with:
  219. job-name: ${{ github.job }}
  220. - name: Export errors file
  221. uses: actions/upload-artifact@v2
  222. if: ${{ failure() }}
  223. with:
  224. name: errors
  225. path: job-${{ github.job }}.txt
  226. deploy_docs:
  227. name: Deploy Docs
  228. needs: [build_jdk_11, build_windows, snapshot_tests, sonar_analysis]
  229. runs-on: ubuntu-latest
  230. steps:
  231. - uses: actions/checkout@v2
  232. - name: Set up JDK
  233. uses: actions/setup-java@v1
  234. with:
  235. java-version: '11'
  236. - name: Setup gradle user name
  237. run: |
  238. mkdir -p ~/.gradle
  239. echo 'systemProp.user.name=spring-builds' >> ~/.gradle/gradle.properties
  240. - name: Deploy Docs
  241. run: |
  242. export GRADLE_ENTERPRISE_CACHE_USERNAME="$GRADLE_ENTERPRISE_CACHE_USER"
  243. export GRADLE_ENTERPRISE_CACHE_PASSWORD="$GRADLE_ENTERPRISE_CACHE_PASSWORD"
  244. export GRADLE_ENTERPRISE_ACCESS_KEY="$GRADLE_ENTERPRISE_SECRET_ACCESS_KEY"
  245. ./gradlew deployDocs -PdeployDocsSshKey="$DOCS_SSH_KEY" -PdeployDocsSshUsername="$DOCS_USERNAME" -PdeployDocsHost="$DOCS_HOST" --stacktrace
  246. env:
  247. DOCS_USERNAME: ${{ secrets.DOCS_USERNAME }}
  248. DOCS_SSH_KEY: ${{ secrets.DOCS_SSH_KEY }}
  249. DOCS_HOST: ${{ secrets.DOCS_HOST }}
  250. - name: Track error step
  251. uses: spring-projects/track-build-errors-action@v1
  252. if: ${{ failure() }}
  253. with:
  254. job-name: ${{ github.job }}
  255. - name: Export errors file
  256. uses: actions/upload-artifact@v2
  257. if: ${{ failure() }}
  258. with:
  259. name: errors
  260. path: job-${{ github.job }}.txt
  261. deploy_schema:
  262. name: Deploy Schema
  263. needs: [build_jdk_11, build_windows, snapshot_tests, sonar_analysis]
  264. runs-on: ubuntu-latest
  265. steps:
  266. - uses: actions/checkout@v2
  267. - name: Set up JDK
  268. uses: actions/setup-java@v1
  269. with:
  270. java-version: '11'
  271. - name: Setup gradle user name
  272. run: |
  273. mkdir -p ~/.gradle
  274. echo 'systemProp.user.name=spring-builds' >> ~/.gradle/gradle.properties
  275. - name: Deploy Schema
  276. run: |
  277. export GRADLE_ENTERPRISE_CACHE_USERNAME="$GRADLE_ENTERPRISE_CACHE_USER"
  278. export GRADLE_ENTERPRISE_CACHE_PASSWORD="$GRADLE_ENTERPRISE_CACHE_PASSWORD"
  279. export GRADLE_ENTERPRISE_ACCESS_KEY="$GRADLE_ENTERPRISE_SECRET_ACCESS_KEY"
  280. ./gradlew deploySchema -PdeployDocsSshKey="$DOCS_SSH_KEY" -PdeployDocsSshUsername="$DOCS_USERNAME" -PdeployDocsHost="$DOCS_HOST" --stacktrace --info
  281. env:
  282. DOCS_USERNAME: ${{ secrets.DOCS_USERNAME }}
  283. DOCS_SSH_KEY: ${{ secrets.DOCS_SSH_KEY }}
  284. DOCS_HOST: ${{ secrets.DOCS_HOST }}
  285. - name: Track error step
  286. uses: spring-projects/track-build-errors-action@v1
  287. if: ${{ failure() }}
  288. with:
  289. job-name: ${{ github.job }}
  290. - name: Export errors file
  291. uses: actions/upload-artifact@v2
  292. if: ${{ failure() }}
  293. with:
  294. name: errors
  295. path: job-${{ github.job }}.txt
  296. notify_result:
  297. name: Check for failures
  298. needs: [build_jdk_11, build_windows, snapshot_tests, sonar_analysis, deploy_artifacts, deploy_docs, deploy_schema]
  299. if: always()
  300. runs-on: ubuntu-latest
  301. steps:
  302. - uses: actions/checkout@v2
  303. - name: Download errors folder
  304. uses: actions/download-artifact@v2
  305. with:
  306. name: errors
  307. - name: Send Slack message
  308. uses: spring-projects/notify-slack-errors-action@v1
  309. with:
  310. slack-webhook-url: ${{ secrets.SLACK_WEBHOOK_URL }}
  311. branch-name: ${{ github.ref }}
  312. commit-sha: ${{ github.sha }}
  313. commit-owner: ${{ github.actor }}
  314. repo-name: ${{ github.repository }}
  315. run-id: ${{ github.run_id }}