2
0

release.yml 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444
  1. name: "Release"
  2. # @see https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#onpushpull_requestbranchestags
  3. on:
  4. push:
  5. tags:
  6. - v5*
  7. jobs:
  8. envs:
  9. name: envs
  10. steps:
  11. ##################################################################################################################
  12. # Git checkout
  13. - name: Checkout repository
  14. uses: actions/checkout@v3
  15. # The github.ref is, for example, refs/tags/v5.0.145 or refs/tags/v5.0-r8
  16. # Generate variables like:
  17. # SRS_TAG=v5.0-r8
  18. # SRS_TAG=v5.0.145
  19. # SRS_VERSION=5.0.145
  20. # SRS_VERSION=5.0-r8
  21. # SRS_MAJOR=5
  22. # SRS_XYZ=5.0.157
  23. # @see https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-environment-variable
  24. - name: Generate varaiables
  25. run: |
  26. SRS_TAG=$(echo ${{ github.ref }}| awk -F '/' '{print $3}')
  27. echo "SRS_TAG=$SRS_TAG" >> $GITHUB_ENV
  28. SRS_VERSION=$(echo ${SRS_TAG}| sed 's/^v//g')
  29. echo "SRS_VERSION=$SRS_VERSION" >> $GITHUB_ENV
  30. SRS_MAJOR=$(echo $SRS_TAG| cut -c 2)
  31. echo "SRS_MAJOR=$SRS_MAJOR" >> $GITHUB_ENV
  32. VFILE="trunk/src/core/srs_core_version5.hpp"
  33. SRS_X=$(cat $VFILE |grep VERSION_MAJOR |awk '{print $3}')
  34. SRS_Y=$(cat $VFILE |grep VERSION_MINOR |awk '{print $3}')
  35. SRS_Z=$(cat $VFILE |grep VERSION_REVISION |awk '{print $3}')
  36. SRS_XYZ=$SRS_X.$SRS_Y.$SRS_Z
  37. echo "SRS_XYZ=$SRS_XYZ" >> $GITHUB_ENV
  38. # Map a step output to a job output, see https://docs.github.com/en/actions/using-jobs/defining-outputs-for-jobs
  39. outputs:
  40. SRS_TAG: ${{ env.SRS_TAG }}
  41. SRS_VERSION: ${{ env.SRS_VERSION }}
  42. SRS_MAJOR: ${{ env.SRS_MAJOR }}
  43. SRS_XYZ: ${{ env.SRS_XYZ }}
  44. runs-on: ubuntu-20.04
  45. test:
  46. name: test
  47. needs:
  48. - envs
  49. steps:
  50. ##################################################################################################################
  51. - name: Covert output to env
  52. run: |
  53. echo "SRS_TAG=${{ needs.envs.outputs.SRS_TAG }}" >> $GITHUB_ENV
  54. echo "SRS_VERSION=${{ needs.envs.outputs.SRS_VERSION }}" >> $GITHUB_ENV
  55. echo "SRS_MAJOR=${{ needs.envs.outputs.SRS_MAJOR }}" >> $GITHUB_ENV
  56. ##################################################################################################################
  57. # Git checkout
  58. - name: Checkout repository
  59. uses: actions/checkout@v3
  60. ##################################################################################################################
  61. # Tests
  62. - name: Build test image
  63. run: docker build --tag srs:test -f trunk/Dockerfile.test .
  64. # For utest
  65. - name: Run SRS utest
  66. run: docker run --rm srs:test bash -c 'make utest && ./objs/srs_utest'
  67. # For regression-test
  68. - name: Run SRS regression-test
  69. run: |
  70. docker run --rm srs:test bash -c 'make && \
  71. ./objs/srs -c conf/regression-test.conf && \
  72. cd 3rdparty/srs-bench && make && ./objs/srs_test -test.v'
  73. runs-on: ubuntu-20.04
  74. draft:
  75. name: draft
  76. needs:
  77. - envs
  78. steps:
  79. - name: Create release draft
  80. id: create_draft
  81. uses: ncipollo/release-action@v1
  82. env:
  83. GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  84. with:
  85. allowUpdates: true
  86. tag: ${{ github.ref }}
  87. draft: true
  88. prerelease: false
  89. # Map a step output to a job output, see https://docs.github.com/en/actions/using-jobs/defining-outputs-for-jobs
  90. outputs:
  91. SRS_RELEASE_ID: ${{ steps.create_draft.outputs.id }}
  92. runs-on: ubuntu-20.04
  93. cygwin64:
  94. name: cygwin64
  95. needs:
  96. - envs
  97. - draft
  98. steps:
  99. # See https://github.com/cygwin/cygwin-install-action#parameters
  100. # Note that https://github.com/egor-tensin/setup-cygwin fails to install packages.
  101. - name: Setup Cygwin
  102. uses: cygwin/cygwin-install-action@master
  103. with:
  104. platform: x86_64
  105. packages: bash make gcc-g++ cmake automake patch pkg-config tcl unzip
  106. install-dir: C:\cygwin64
  107. ##################################################################################################################
  108. - name: Checkout repository
  109. uses: actions/checkout@v3
  110. ##################################################################################################################
  111. - name: Covert output to env
  112. env:
  113. SHELLOPTS: igncr
  114. shell: C:\cygwin64\bin\bash.exe --login '{0}'
  115. run: |
  116. echo "SRS_TAG=${{ needs.envs.outputs.SRS_TAG }}" >> $GITHUB_ENV
  117. echo "SRS_VERSION=${{ needs.envs.outputs.SRS_VERSION }}" >> $GITHUB_ENV
  118. echo "SRS_MAJOR=${{ needs.envs.outputs.SRS_MAJOR }}" >> $GITHUB_ENV
  119. echo "SRS_RELEASE_ID=${{ needs.draft.outputs.SRS_RELEASE_ID }}" >> $GITHUB_ENV
  120. ##################################################################################################################
  121. - name: Build SRS
  122. env:
  123. SHELLOPTS: igncr
  124. SRS_WORKSPACE: ${{ github.workspace }}
  125. shell: C:\cygwin64\bin\bash.exe --login '{0}'
  126. run: |
  127. export PATH=/usr/bin:/usr/local/bin &&
  128. which make gcc g++ patch cmake pkg-config uname grep sed &&
  129. (make --version; gcc --version; patch --version; cmake --version; pkg-config --version) &&
  130. (aclocal --version; autoconf --version; automake --version; uname -a) &&
  131. cd $(cygpath -u $SRS_WORKSPACE)/trunk && ./configure --gb28181=on && make
  132. ##################################################################################################################
  133. - name: Package SRS
  134. env:
  135. SHELLOPTS: igncr
  136. SRS_WORKSPACE: ${{ github.workspace }}
  137. shell: C:\cygwin64\bin\bash.exe --login '{0}'
  138. run: |
  139. cd $(cygpath -u $SRS_WORKSPACE) &&
  140. if [[ $(echo $SRS_TAG |grep -qE '^v' && echo YES) != YES ]]; then
  141. SRS_VERSION=$(./trunk/objs/srs -v 2>&1); echo "Change version to ${SRS_VERSION}";
  142. fi &&
  143. "/cygdrive/c/Program Files (x86)/NSIS/makensis.exe" /DSRS_VERSION=${SRS_VERSION} \
  144. /DCYGWIN_DIR="C:\cygwin64" trunk/packaging/nsis/srs.nsi &&
  145. mv trunk/packaging/nsis/SRS-Windows-x86_64-${SRS_VERSION}-setup.exe . && ls -lh *.exe &&
  146. echo "SRS_CYGWIN_TAR=SRS-Windows-x86_64-${SRS_VERSION}-setup.exe" >> $GITHUB_ENV &&
  147. echo "SRS_CYGWIN_MD5=$(md5sum SRS-Windows-x86_64-${SRS_VERSION}-setup.exe| awk '{print $1}')" >> $GITHUB_ENV
  148. ##################################################################################################################
  149. - name: Upload Release Assets Cygwin
  150. id: upload-release-assets-cygwin
  151. uses: dwenegar/upload-release-assets@v1
  152. env:
  153. GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  154. with:
  155. release_id: ${{ env.SRS_RELEASE_ID }}
  156. assets_path: ${{ env.SRS_CYGWIN_TAR }}
  157. # Map a step output to a job output, see https://docs.github.com/en/actions/using-jobs/defining-outputs-for-jobs
  158. outputs:
  159. SRS_CYGWIN_TAR: ${{ env.SRS_CYGWIN_TAR }}
  160. SRS_CYGWIN_MD5: ${{ env.SRS_CYGWIN_MD5 }}
  161. runs-on: windows-latest
  162. linux:
  163. name: linux
  164. needs:
  165. - envs
  166. - draft
  167. steps:
  168. ##################################################################################################################
  169. - name: Covert output to env
  170. run: |
  171. echo "SRS_TAG=${{ needs.envs.outputs.SRS_TAG }}" >> $GITHUB_ENV
  172. echo "SRS_VERSION=${{ needs.envs.outputs.SRS_VERSION }}" >> $GITHUB_ENV
  173. echo "SRS_MAJOR=${{ needs.envs.outputs.SRS_MAJOR }}" >> $GITHUB_ENV
  174. echo "SRS_RELEASE_ID=${{ needs.draft.outputs.SRS_RELEASE_ID }}" >> $GITHUB_ENV
  175. ##################################################################################################################
  176. # Git checkout
  177. - name: Checkout repository
  178. uses: actions/checkout@v3
  179. ##################################################################################################################
  180. # Create source tar for release. Note that it's for OpenWRT package srs-server, so the filename MUST be
  181. # srs-server-xxx.tar.gz, because the package is named srs-server.
  182. # Generate variables like:
  183. # SRS_SOURCE_TAR=srs-server-5.0.145.tar.gz
  184. # SRS_SOURCE_MD5=83e38700a80a26e30b2df054e69956e5
  185. - name: Create source tar.gz
  186. run: |
  187. DEST_DIR=srs-server-$SRS_VERSION && mkdir -p $DEST_DIR &&
  188. cp README.md $DEST_DIR && cp LICENSE $DEST_DIR && cp -R trunk $DEST_DIR/trunk &&
  189. (cd $DEST_DIR/trunk/3rdparty && rm -rf *.zip openssl-*.gz srs-bench) &&
  190. tar zcf ${DEST_DIR}.tar.gz ${DEST_DIR} && du -sh ${DEST_DIR}* && rm -rf ${DEST_DIR} &&
  191. echo "SRS_SOURCE_TAR=${DEST_DIR}.tar.gz" >> $GITHUB_ENV &&
  192. echo "SRS_SOURCE_MD5=$(md5sum ${DEST_DIR}.tar.gz| awk '{print $1}')" >> $GITHUB_ENV
  193. # Create package tar for release
  194. # Generate variables like:
  195. # SRS_PACKAGE_ZIP=SRS-CentOS7-x86_64-5.0.145.zip
  196. # SRS_PACKAGE_MD5=3880a26e30b283edf05700a4e69956e5
  197. - name: Create package zip
  198. env:
  199. PACKAGER: ${{ secrets.SRS_PACKAGER_BINARY }}
  200. run: |
  201. docker build --tag srs:pkg --build-arg version=$SRS_VERSION --build-arg SRS_AUTO_PACKAGER=$PACKAGER -f trunk/Dockerfile.pkg . &&
  202. SRS_PACKAGE_ZIP=SRS-CentOS7-x86_64-$SRS_VERSION.zip &&
  203. docker run --rm -v $(pwd):/output srs:pkg cp objs/$SRS_PACKAGE_ZIP /output/ &&
  204. du -sh $SRS_PACKAGE_ZIP &&
  205. echo "SRS_PACKAGE_ZIP=$SRS_PACKAGE_ZIP" >> $GITHUB_ENV &&
  206. echo "SRS_PACKAGE_MD5=$(md5sum $SRS_PACKAGE_ZIP| awk '{print $1}')" >> $GITHUB_ENV
  207. ##################################################################################################################
  208. - name: Upload Release Assets Packager
  209. id: upload-release-assets-packager
  210. uses: dwenegar/upload-release-assets@v1
  211. env:
  212. GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  213. with:
  214. release_id: ${{ env.SRS_RELEASE_ID }}
  215. assets_path: ${{ env.SRS_PACKAGE_ZIP }}
  216. - name: Upload Release Assets Source
  217. id: upload-release-assets-source
  218. uses: dwenegar/upload-release-assets@v1
  219. env:
  220. GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  221. with:
  222. release_id: ${{ env.SRS_RELEASE_ID }}
  223. assets_path: ${{ env.SRS_SOURCE_TAR }}
  224. # Map a step output to a job output, see https://docs.github.com/en/actions/using-jobs/defining-outputs-for-jobs
  225. outputs:
  226. SRS_PACKAGE_ZIP: ${{ env.SRS_PACKAGE_ZIP }}
  227. SRS_PACKAGE_MD5: ${{ env.SRS_PACKAGE_MD5 }}
  228. SRS_SOURCE_TAR: ${{ env.SRS_SOURCE_TAR }}
  229. SRS_SOURCE_MD5: ${{ env.SRS_SOURCE_MD5 }}
  230. runs-on: ubuntu-20.04
  231. docker-srs:
  232. name: docker-srs
  233. needs:
  234. - envs
  235. steps:
  236. ##################################################################################################################
  237. - name: Covert output to env
  238. run: |
  239. echo "SRS_TAG=${{ needs.envs.outputs.SRS_TAG }}" >> $GITHUB_ENV
  240. echo "SRS_VERSION=${{ needs.envs.outputs.SRS_VERSION }}" >> $GITHUB_ENV
  241. echo "SRS_MAJOR=${{ needs.envs.outputs.SRS_MAJOR }}" >> $GITHUB_ENV
  242. echo "SRS_XYZ=${{ needs.envs.outputs.SRS_XYZ }}" >> $GITHUB_ENV
  243. ##################################################################################################################
  244. # Git checkout
  245. - name: Checkout repository
  246. uses: actions/checkout@v3
  247. # See https://github.com/crazy-max/ghaction-docker-buildx#moved-to-docker-organization
  248. # https://github.com/docker/setup-qemu-action
  249. - name: Set up QEMU
  250. uses: docker/setup-qemu-action@v2
  251. # https://github.com/docker/setup-buildx-action
  252. - name: Set up Docker Buildx
  253. uses: docker/setup-buildx-action@v2
  254. ##################################################################################################################
  255. # Create main images for Docker
  256. - name: Login to docker hub
  257. uses: docker/login-action@v2
  258. with:
  259. username: "${{ secrets.DOCKER_USERNAME }}"
  260. password: "${{ secrets.DOCKER_PASSWORD }}"
  261. - name: Build and push images to Docker hub
  262. env:
  263. PACKAGER: ${{ secrets.SRS_PACKAGER_DOCKER }}
  264. run: |
  265. echo "Release ossrs/srs:$SRS_TAG"
  266. docker buildx build --platform linux/arm/v7,linux/arm64/v8,linux/amd64 \
  267. --output "type=image,push=true" \
  268. -t ossrs/srs:$SRS_TAG --build-arg SRS_AUTO_PACKAGER=$PACKAGER -f Dockerfile .
  269. # Docker alias images
  270. # TODO: FIXME: If stable, please set the latest from 4.0 to 5.0
  271. - name: Docker alias images for ossrs/srs
  272. uses: akhilerm/tag-push-action@v2.1.0
  273. with:
  274. src: ossrs/srs:${{ env.SRS_TAG }}
  275. dst: |
  276. ossrs/srs:${{ env.SRS_VERSION }}
  277. ossrs/srs:${{ env.SRS_MAJOR }}
  278. ossrs/srs:v${{ env.SRS_MAJOR }}
  279. ossrs/srs:${{ env.SRS_XYZ }}
  280. ossrs/srs:v${{ env.SRS_XYZ }}
  281. runs-on: ubuntu-20.04
  282. aliyun-srs:
  283. name: aliyun-srs
  284. needs:
  285. - envs
  286. - docker-srs
  287. - test
  288. steps:
  289. ##################################################################################################################
  290. - name: Covert output to env
  291. run: |
  292. echo "SRS_TAG=${{ needs.envs.outputs.SRS_TAG }}" >> $GITHUB_ENV
  293. echo "SRS_VERSION=${{ needs.envs.outputs.SRS_VERSION }}" >> $GITHUB_ENV
  294. echo "SRS_MAJOR=${{ needs.envs.outputs.SRS_MAJOR }}" >> $GITHUB_ENV
  295. echo "SRS_XYZ=${{ needs.envs.outputs.SRS_XYZ }}" >> $GITHUB_ENV
  296. # Aliyun ACR
  297. # TODO: FIXME: If stable, please set the latest from 4.0 to 5.0
  298. - name: Login aliyun hub
  299. uses: docker/login-action@v2
  300. with:
  301. registry: registry.cn-hangzhou.aliyuncs.com
  302. username: "${{ secrets.ACR_USERNAME }}"
  303. password: "${{ secrets.ACR_PASSWORD }}"
  304. - name: Push to Aliyun registry for ossrs/srs
  305. uses: akhilerm/tag-push-action@v2.1.0
  306. with:
  307. src: ossrs/srs:${{ env.SRS_TAG }}
  308. dst: |
  309. registry.cn-hangzhou.aliyuncs.com/ossrs/srs:${{ env.SRS_TAG }}
  310. registry.cn-hangzhou.aliyuncs.com/ossrs/srs:${{ env.SRS_VERSION }}
  311. registry.cn-hangzhou.aliyuncs.com/ossrs/srs:${{ env.SRS_MAJOR }}
  312. registry.cn-hangzhou.aliyuncs.com/ossrs/srs:v${{ env.SRS_MAJOR }}
  313. registry.cn-hangzhou.aliyuncs.com/ossrs/srs:${{ env.SRS_XYZ }}
  314. registry.cn-hangzhou.aliyuncs.com/ossrs/srs:v${{ env.SRS_XYZ }}
  315. runs-on: ubuntu-20.04
  316. update:
  317. name: update
  318. needs:
  319. - aliyun-srs
  320. - envs
  321. steps:
  322. ##################################################################################################################
  323. - name: Covert output to env
  324. run: |
  325. echo "SRS_TAG=${{ needs.envs.outputs.SRS_TAG }}" >> $GITHUB_ENV
  326. echo "SRS_VERSION=${{ needs.envs.outputs.SRS_VERSION }}" >> $GITHUB_ENV
  327. echo "SRS_MAJOR=${{ needs.envs.outputs.SRS_MAJOR }}" >> $GITHUB_ENV
  328. ##################################################################################################################
  329. # Git checkout
  330. - name: Checkout repository
  331. uses: actions/checkout@v3
  332. ##################################################################################################################
  333. # Generate variables like:
  334. # SRS_R_OSSRS_NET=1.2.3.4
  335. - name: Build variables for r.ossrs.net
  336. run: |
  337. SRS_R_OSSRS_NET=$(dig +short r.ossrs.net)
  338. echo "SRS_R_OSSRS_NET=$SRS_R_OSSRS_NET" >> $GITHUB_ENV
  339. - name: Release to r.ossrs.net
  340. uses: appleboy/ssh-action@master
  341. with:
  342. host: ${{ env.SRS_R_OSSRS_NET }}
  343. username: root
  344. key: ${{ secrets.DIGITALOCEAN_SSHKEY }}
  345. port: 22
  346. envs: SRS_MAJOR
  347. timeout: 60s
  348. command_timeout: 30m
  349. script: |
  350. echo "Update r.ossrs.net ok for SRS $SRS_MAJOR"
  351. runs-on: ubuntu-20.04
  352. release:
  353. name: release
  354. needs:
  355. - update
  356. - envs
  357. - draft
  358. - cygwin64
  359. - linux
  360. steps:
  361. ##################################################################################################################
  362. - name: Covert output to env
  363. run: |
  364. echo "SRS_TAG=${{ needs.envs.outputs.SRS_TAG }}" >> $GITHUB_ENV
  365. echo "SRS_VERSION=${{ needs.envs.outputs.SRS_VERSION }}" >> $GITHUB_ENV
  366. echo "SRS_MAJOR=${{ needs.envs.outputs.SRS_MAJOR }}" >> $GITHUB_ENV
  367. echo "SRS_XYZ=${{ needs.envs.outputs.SRS_XYZ }}" >> $GITHUB_ENV
  368. echo "SRS_RELEASE_ID=${{ needs.draft.outputs.SRS_RELEASE_ID }}" >> $GITHUB_ENV
  369. echo "SRS_PACKAGE_ZIP=${{ needs.linux.outputs.SRS_PACKAGE_ZIP }}" >> $GITHUB_ENV
  370. echo "SRS_PACKAGE_MD5=${{ needs.linux.outputs.SRS_PACKAGE_MD5 }}" >> $GITHUB_ENV
  371. echo "SRS_SOURCE_TAR=${{ needs.linux.outputs.SRS_SOURCE_TAR }}" >> $GITHUB_ENV
  372. echo "SRS_SOURCE_MD5=${{ needs.linux.outputs.SRS_SOURCE_MD5 }}" >> $GITHUB_ENV
  373. echo "SRS_CYGWIN_TAR=${{ needs.cygwin64.outputs.SRS_CYGWIN_TAR }}" >> $GITHUB_ENV
  374. echo "SRS_CYGWIN_MD5=${{ needs.cygwin64.outputs.SRS_CYGWIN_MD5 }}" >> $GITHUB_ENV
  375. ##################################################################################################################
  376. # Git checkout
  377. - name: Checkout repository
  378. uses: actions/checkout@v3
  379. # Create release.
  380. - name: Update release
  381. id: update_release
  382. uses: ncipollo/release-action@v1
  383. env:
  384. GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  385. with:
  386. allowUpdates: true
  387. tag: ${{ github.ref }}
  388. name: Release ${{ env.SRS_TAG }}
  389. body: |
  390. [${{ github.sha }}](https://github.com/ossrs/srs/commit/${{ github.sha }})
  391. ${{ github.event.head_commit.message }}
  392. ## Resource
  393. * Source: ${{ env.SRS_SOURCE_MD5 }} [${{ env.SRS_SOURCE_TAR }}](https://github.com/ossrs/srs/releases/download/${{ env.SRS_TAG }}/${{ env.SRS_SOURCE_TAR }})
  394. * Binary: ${{ env.SRS_PACKAGE_MD5 }} [${{ env.SRS_PACKAGE_ZIP }}](https://github.com/ossrs/srs/releases/download/${{ env.SRS_TAG }}/${{ env.SRS_PACKAGE_ZIP }})
  395. * Binary: ${{ env.SRS_CYGWIN_MD5 }} [${{ env.SRS_CYGWIN_TAR }}](https://github.com/ossrs/srs/releases/download/${{ env.SRS_TAG }}/${{ env.SRS_CYGWIN_TAR }})
  396. ## Resource Mirror: gitee.com
  397. * Source: ${{ env.SRS_SOURCE_MD5 }} [${{ env.SRS_SOURCE_TAR }}](https://gitee.com/ossrs/srs/releases/download/${{ env.SRS_TAG }}/${{ env.SRS_SOURCE_TAR }})
  398. * Binary: ${{ env.SRS_PACKAGE_MD5 }} [${{ env.SRS_PACKAGE_ZIP }}](https://gitee.com/ossrs/srs/releases/download/${{ env.SRS_TAG }}/${{ env.SRS_PACKAGE_ZIP }})
  399. * Binary: ${{ env.SRS_CYGWIN_MD5 }} [${{ env.SRS_CYGWIN_TAR }}](https://gitee.com/ossrs/srs/releases/download/${{ env.SRS_TAG }}/${{ env.SRS_CYGWIN_TAR }})
  400. ## Docker
  401. * [docker pull ossrs/srs:${{ env.SRS_MAJOR }}](https://ossrs.io/lts/en-us/docs/v5/doc/getting-started)
  402. * [docker pull ossrs/srs:${{ env.SRS_TAG }}](https://ossrs.io/lts/en-us/docs/v5/doc/getting-started)
  403. * [docker pull ossrs/srs:v${{ env.SRS_XYZ }}](https://ossrs.io/lts/en-us/docs/v5/doc/getting-started)
  404. ## Docker Mirror: aliyun.com
  405. * [docker pull registry.cn-hangzhou.aliyuncs.com/ossrs/srs:${{ env.SRS_MAJOR }}](https://ossrs.net/lts/zh-cn/docs/v5/doc/getting-started)
  406. * [docker pull registry.cn-hangzhou.aliyuncs.com/ossrs/srs:${{ env.SRS_TAG }}](https://ossrs.net/lts/zh-cn/docs/v5/doc/getting-started)
  407. * [docker pull registry.cn-hangzhou.aliyuncs.com/ossrs/srs:v${{ env.SRS_XYZ }}](https://ossrs.net/lts/zh-cn/docs/v5/doc/getting-started)
  408. ## Doc: ossrs.io
  409. * [Getting Started](https://ossrs.io/lts/en-us/docs/v5/doc/getting-started)
  410. * [Wiki home](https://ossrs.io/lts/en-us/docs/v5/doc/introduction)
  411. * [FAQ](https://ossrs.io/lts/en-us/faq), [Features](https://github.com/ossrs/srs/blob/${{ github.sha }}/trunk/doc/Features.md#features) or [ChangeLogs](https://github.com/ossrs/srs/blob/${{ github.sha }}/trunk/doc/CHANGELOG.md#changelog)
  412. ## Doc: ossrs.net
  413. * [快速入门](https://ossrs.net/lts/zh-cn/docs/v5/doc/getting-started)
  414. * [中文Wiki首页](https://ossrs.net/lts/zh-cn/docs/v5/doc/introduction)
  415. * [中文FAQ](https://ossrs.net/lts/zh-cn/faq), [功能列表](https://github.com/ossrs/srs/blob/${{ github.sha }}/trunk/doc/Features.md#features) 或 [修订历史](https://github.com/ossrs/srs/blob/${{ github.sha }}/trunk/doc/CHANGELOG.md#changelog)
  416. draft: false
  417. prerelease: false
  418. makeLatest: true
  419. runs-on: ubuntu-20.04
  420. done:
  421. name: done
  422. runs-on: ubuntu-20.04
  423. needs:
  424. - update
  425. - release
  426. steps:
  427. - run: echo 'All done'