continuous-integration-workflow.yml 13 KB

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