build_packages.yaml 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. name: Cross build packages
  2. on:
  3. schedule:
  4. - cron: '0 */6 * * *'
  5. push:
  6. tags:
  7. - v*
  8. release:
  9. types:
  10. - published
  11. jobs:
  12. windows:
  13. runs-on: windows-2019
  14. steps:
  15. - uses: actions/checkout@v1
  16. - uses: ilammy/msvc-dev-cmd@v1
  17. - uses: gleam-lang/setup-erlang@v1.1.0
  18. id: install_erlang
  19. with:
  20. otp-version: 23.2
  21. - name: build
  22. run: |
  23. # set-executionpolicy remotesigned -s cu
  24. # iex (new-object net.webclient).downloadstring('https://get.scoop.sh')
  25. # # $env:path + ";" + $env:USERPROFILE + "\scoop\shims" + ';C:\Program Files\erl10.4\bin'
  26. # [environment]::SetEnvironmentvariable("Path", ";" + $env:USERPROFILE + "\scoop\shims")
  27. # [environment]::SetEnvironmentvariable("Path", ';C:\Program Files\erl10.4\bin')
  28. # scoop bucket add extras https://github.com/lukesampson/scoop-extras.git
  29. # scoop update
  30. # scoop install sudo curl vcredist2013
  31. $env:PATH = "${{ steps.install_erlang.outputs.erlpath }}\bin;$env:PATH"
  32. $version = $( "${{ github.ref }}" -replace "^(.*)/(.*)/" )
  33. if ($version -match "^v[0-9]+\.[0-9]+(\.[0-9]+)?") {
  34. $regex = "[0-9]+\.[0-9]+(-alpha|-beta|-rc)?\.[0-9]"
  35. $pkg_name = "emqx-windows-$([regex]::matches($version, $regex).value).zip"
  36. }
  37. else {
  38. $pkg_name = "emqx-windows-$($version -replace '/').zip"
  39. }
  40. make deps-emqx || cat rebar3.crashdump
  41. $rebar3 = $env:USERPROFILE + "\rebar3"
  42. (New-Object System.Net.WebClient).DownloadFile('https://s3.amazonaws.com/rebar3/rebar3', $rebar3)
  43. cd _build/emqx/lib/jiffy/
  44. escript $rebar3 compile
  45. cd ../../../../
  46. make emqx
  47. mkdir -p _packages/emqx
  48. Compress-Archive -Path _build/emqx/rel/emqx -DestinationPath _build/emqx/rel/$pkg_name
  49. mv _build/emqx/rel/$pkg_name _packages/emqx
  50. Get-FileHash -Path "_packages/emqx/$pkg_name" | Format-List | grep 'Hash' | awk '{print $3}' > _packages/emqx/$pkg_name.sha256
  51. - name: run emqx
  52. run: |
  53. ./_build/emqx/rel/emqx/bin/emqx start
  54. ./_build/emqx/rel/emqx/bin/emqx stop
  55. ./_build/emqx/rel/emqx/bin/emqx install
  56. ./_build/emqx/rel/emqx/bin/emqx uninstall
  57. - uses: actions/upload-artifact@v1
  58. with:
  59. name: emqx
  60. path: ./_packages/emqx/.
  61. mac:
  62. runs-on: macos-10.15
  63. steps:
  64. - uses: actions/checkout@v1
  65. - name: prepare
  66. run: |
  67. brew install curl zip unzip gnu-sed kerl unixodbc freetds
  68. echo "/usr/local/bin" >> $GITHUB_PATH
  69. git config --global credential.helper store
  70. - name: build erlang
  71. timeout-minutes: 60
  72. run: |
  73. kerl build 23.2.2
  74. kerl install 23.2.2 $HOME/.kerl/23.2.2
  75. - name: build
  76. run: |
  77. . $HOME/.kerl/23.2.2/activate
  78. make emqx-pkg
  79. - name: test
  80. run: |
  81. pkg_name=$(basename _packages/emqx/emqx-macos-*.zip)
  82. unzip _packages/emqx/$pkg_name
  83. gsed -i '/emqx_telemetry/d' ./emqx/data/loaded_plugins
  84. ./emqx/bin/emqx start || cat emqx/log/erlang.log.1
  85. ready='no'
  86. for i in {1..10}; do
  87. if curl -fs 127.0.0.1:18083 > /dev/null; then
  88. ready='yes'
  89. break
  90. fi
  91. sleep 1
  92. done
  93. if [ "$ready" != "yes" ]; then
  94. echo "Timed out waiting for emqx to be ready"
  95. cat emqx/log/erlang.log.1
  96. exit 1
  97. fi
  98. ./emqx/bin/emqx_ctl status
  99. ./emqx/bin/emqx stop
  100. rm -rf emqx
  101. openssl dgst -sha256 ./_packages/emqx/$pkg_name | awk '{print $2}' > ./_packages/emqx/$pkg_name.sha256
  102. - uses: actions/upload-artifact@v1
  103. with:
  104. name: emqx
  105. path: ./_packages/emqx/.
  106. linux:
  107. runs-on: ubuntu-20.04
  108. strategy:
  109. matrix:
  110. arch:
  111. - amd64
  112. - arm64
  113. emqx:
  114. - emqx
  115. - emqx-edge
  116. os:
  117. - ubuntu20.04
  118. - ubuntu18.04
  119. - ubuntu16.04
  120. - debian10
  121. - debian9
  122. - opensuse
  123. - centos8
  124. - centos7
  125. - centos6
  126. - raspbian10
  127. - raspbian9
  128. exclude:
  129. - os: raspbian9
  130. arch: amd64
  131. - os: raspbian9
  132. emqx: emqx
  133. - os: raspbian10
  134. arch: amd64
  135. - os: raspbian10
  136. emqx: emqx
  137. - os: centos6
  138. arch: arm64
  139. defaults:
  140. run:
  141. shell: bash
  142. steps:
  143. - name: prepare docker
  144. run: |
  145. mkdir -p $HOME/.docker
  146. echo '{ "experimental": "enabled" }' | tee $HOME/.docker/config.json
  147. echo '{ "experimental": true, "storage-driver": "overlay2", "max-concurrent-downloads": 50, "max-concurrent-uploads": 50}' | sudo tee /etc/docker/daemon.json
  148. sudo systemctl restart docker
  149. docker info
  150. docker buildx create --use --name mybuild
  151. docker run --rm --privileged tonistiigi/binfmt --install all
  152. - uses: actions/checkout@v1
  153. - name: get deps
  154. env:
  155. ERL_OTP: erl23.2.2
  156. run: |
  157. docker run -i --rm \
  158. -e GITHUB_RUN_ID=$GITHUB_RUN_ID \
  159. -e GITHUB_REF=$GITHUB_REF \
  160. -v $(pwd):/emqx \
  161. -w /emqx \
  162. emqx/build-env:${ERL_OTP}-debian10 \
  163. bash -c "make deps-all"
  164. - name: downloads emqx zip packages
  165. env:
  166. EMQX: ${{ matrix.emqx }}
  167. ARCH: ${{ matrix.arch }}
  168. SYSTEM: ${{ matrix.os }}
  169. run: |
  170. set -e -u -x
  171. if [ $EMQX = "emqx-edge" ];then broker="emqx-edge"; else broker="emqx-ce"; fi
  172. if [ $ARCH = "arm64" ];then arch="aarch64"; else arch="x86_64"; fi
  173. vsn="$(grep -oE '\{vsn, (.*)\}' src/emqx.app.src | sed -r 's/\{vsn, (.*)\}/\1/g' | sed 's/\"//g')"
  174. pre_vsn="$(echo $vsn | grep -oE '^[0-9]+.[0-9]')"
  175. old_vsns=($(git tag -l "$pre_vsn.[0-9]" | sed "s/$vsn//"))
  176. mkdir -p tmp/relup_packages/$EMQX
  177. cd tmp/relup_packages/$EMQX
  178. for tag in ${old_vsns[@]};do
  179. if [ ! -z "$(echo $(curl -I -m 10 -o /dev/null -s -w %{http_code} https://s3-us-west-2.amazonaws.com/packages.emqx/$broker/v${tag#[e|v]}/$EMQX-$SYSTEM-${tag#[e|v]}-$arch.zip) | grep -oE "^[23]+")" ];then
  180. wget https://s3-us-west-2.amazonaws.com/packages.emqx/$broker/v${tag#[e|v]}/$EMQX-$SYSTEM-${tag#[e|v]}-$arch.zip
  181. wget https://s3-us-west-2.amazonaws.com/packages.emqx/$broker/v${tag#[e|v]}/$EMQX-$SYSTEM-${tag#[e|v]}-$arch.zip.sha256
  182. echo "$(cat $EMQX-$SYSTEM-${tag#[e|v]}-$arch.zip.sha256) $EMQX-$SYSTEM-${tag#[e|v]}-$arch.zip" | sha256sum -c || exit 1
  183. fi
  184. done
  185. cd -
  186. - name: build emqx packages
  187. env:
  188. ERL_OTP: erl23.2.2
  189. EMQX: ${{ matrix.emqx }}
  190. ARCH: ${{ matrix.arch }}
  191. SYSTEM: ${{ matrix.os }}
  192. run: |
  193. set -e -u -x
  194. docker buildx build --no-cache \
  195. --platform=linux/$ARCH \
  196. -t cross_build_emqx_for_$SYSTEM \
  197. -f .ci/build_packages/Dockerfile \
  198. --build-arg BUILD_FROM=emqx/build-env:$ERL_OTP-$SYSTEM \
  199. --build-arg EMQX_NAME=$EMQX \
  200. --output type=tar,dest=/tmp/cross-build-$EMQX-for-$SYSTEM.tar .
  201. mkdir -p /tmp/packages/$EMQX
  202. tar -xvf /tmp/cross-build-$EMQX-for-$SYSTEM.tar --wildcards emqx/_packages/$EMQX/*
  203. mv emqx/_packages/$EMQX/* /tmp/packages/$EMQX/
  204. rm -rf /tmp/cross-build-$EMQX-for-$SYSTEM.tar
  205. docker rm -f $(docker ps -a -q)
  206. docker volume prune -f
  207. - name: create sha256
  208. env:
  209. EMQX: ${{ matrix.emqx }}
  210. run: |
  211. if [ -d /tmp/packages/$EMQX ]; then
  212. cd /tmp/packages/$EMQX
  213. for var in $(ls emqx-* ); do
  214. bash -c "echo $(sha256sum $var | awk '{print $1}') > $var.sha256"
  215. done
  216. cd -
  217. fi
  218. - uses: actions/upload-artifact@v1
  219. if: startsWith(github.ref, 'refs/tags/')
  220. with:
  221. name: ${{ matrix.emqx }}
  222. path: /tmp/packages/${{ matrix.emqx }}/.
  223. docker:
  224. runs-on: ubuntu-20.04
  225. strategy:
  226. matrix:
  227. arch:
  228. - [amd64, x86_64]
  229. - [arm64v8, aarch64]
  230. - [arm32v7, arm]
  231. - [i386, i386]
  232. - [s390x, s390x]
  233. steps:
  234. - uses: actions/checkout@v1
  235. - name: build emqx docker image
  236. env:
  237. ARCH: ${{ matrix.arch[0] }}
  238. QEMU_ARCH: ${{ matrix.arch[1] }}
  239. run: |
  240. sudo docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
  241. sudo TARGET=emqx/emqx ARCH=$ARCH QEMU_ARCH=$QEMU_ARCH make docker
  242. cd _packages/emqx && for var in $(ls emqx-docker-* ); do sudo bash -c "echo $(sha256sum $var | awk '{print $1}') > $var.sha256"; done && cd -
  243. sudo TARGET=emqx/emqx-edge ARCH=$ARCH QEMU_ARCH=$QEMU_ARCH make docker
  244. cd _packages/emqx-edge && for var in $(ls emqx-edge-docker-* ); do sudo bash -c "echo $(sha256sum $var | awk '{print $1}') > $var.sha256"; done && cd -
  245. - uses: actions/upload-artifact@v1
  246. with:
  247. name: emqx
  248. path: ./_packages/emqx/.
  249. - uses: actions/upload-artifact@v1
  250. with:
  251. name: emqx-edge
  252. path: ./_packages/emqx-edge/.
  253. upload:
  254. runs-on: ubuntu-20.04
  255. needs: [windows, mac, linux, docker]
  256. if: startsWith(github.ref, 'refs/tags/')
  257. steps:
  258. - name: get_version
  259. run: |
  260. echo 'version<<EOF' >> $GITHUB_ENV
  261. echo ${{ github.ref }} | sed -r "s ^refs/heads/|^refs/tags/(.*) \1 g" >> $GITHUB_ENV
  262. echo 'EOF' >> $GITHUB_ENV
  263. - uses: actions/download-artifact@v2
  264. with:
  265. name: emqx
  266. path: ./_packages/emqx
  267. - uses: actions/download-artifact@v2
  268. with:
  269. name: emqx-edge
  270. path: ./_packages/emqx-edge
  271. - name: install dos2unix
  272. run: sudo apt-get update && sudo apt install -y dos2unix
  273. - name: get packages
  274. run: |
  275. set -e -x -u
  276. for EMQX in emqx emqx-edge; do
  277. cd _packages/$EMQX
  278. for var in $( ls |grep emqx |grep -v sha256); do
  279. dos2unix $var.sha256
  280. echo "$(cat $var.sha256) $var" | sha256sum -c || exit 1
  281. done
  282. cd -
  283. done
  284. - name: upload aws s3
  285. run: |
  286. set -e -x -u
  287. aws configure set aws_access_key_id ${{ secrets.AWS_ACCESS_KEY_ID }}
  288. aws configure set aws_secret_access_key ${{ secrets.AWS_SECRET_ACCESS_KEY }}
  289. aws configure set default.region us-west-2
  290. aws s3 cp --recursive _packages/emqx s3://packages.emqx/emqx-ce/${{ env.version }}
  291. aws s3 cp --recursive _packages/emqx-edge s3://packages.emqx/emqx-edge/${{ env.version }}
  292. aws cloudfront create-invalidation --distribution-id E170YEULGLT8XB --paths "/emqx-ce/${{ env.version }}/*,/emqx-edge/${{ env.version }}/*"
  293. mkdir packages
  294. mv _packages/emqx/* packages
  295. mv _packages/emqx-edge/* packages
  296. - uses: actions/checkout@v2
  297. with:
  298. path: emqx
  299. - uses: Rory-Z/upload-release-asset@v1
  300. if: github.event_name == 'release'
  301. with:
  302. repo: emqx
  303. path: "packages/emqx-*"
  304. token: ${{ github.token }}
  305. - name: update to emqx.io
  306. if: github.event_name == 'release'
  307. run: |
  308. set -e -x -u
  309. curl -w %{http_code} \
  310. --insecure \
  311. -H "Content-Type: application/json" \
  312. -H "token: ${{ secrets.EMQX_IO_TOKEN }}" \
  313. -X POST \
  314. -d "{\"repo\":\"emqx/emqx\", \"tag\": \"${{ env.version }}\" }" \
  315. ${{ secrets.EMQX_IO_RELEASE_API }}
  316. - name: push docker image to docker hub
  317. if: github.event_name == 'release'
  318. run: |
  319. set -e -x -u
  320. sudo make -C emqx docker-prepare
  321. cd packages && for var in $(ls |grep docker |grep -v sha256); do unzip $var; sudo docker load < ${var%.*}; rm -f ${var%.*}; done && cd -
  322. echo ${{ secrets.DOCKER_HUB_TOKEN }} |sudo docker login -u ${{ secrets.DOCKER_HUB_USER }} --password-stdin
  323. sudo TARGET=emqx/emqx make -C emqx docker-push
  324. sudo TARGET=emqx/emqx make -C emqx docker-manifest-list
  325. sudo TARGET=emqx/emqx-edge make -C emqx docker-push
  326. sudo TARGET=emqx/emqx-edge make -C emqx docker-manifest-list
  327. - name: update repo.emqx.io
  328. if: github.event_name == 'release'
  329. run: |
  330. curl --silent --show-error \
  331. -H "Authorization: token ${{ secrets.CI_GIT_TOKEN }}" \
  332. -H "Accept: application/vnd.github.v3+json" \
  333. -X POST \
  334. -d "{\"ref\":\"v1.0.1\",\"inputs\":{\"version\": \"${{ env.version }}\", \"emqx_ce\": \"true\"}}" \
  335. "https://api.github.com/repos/emqx/emqx-ci-helper/actions/workflows/update_emqx_repos.yaml/dispatches"
  336. - name: update homebrew packages
  337. if: github.event_name == 'release'
  338. run: |
  339. if [ -z $(echo $version | grep -oE "(alpha|beta|rc)\.[0-9]") ]; then
  340. curl --silent --show-error \
  341. -H "Authorization: token ${{ secrets.CI_GIT_TOKEN }}" \
  342. -H "Accept: application/vnd.github.v3+json" \
  343. -X POST \
  344. -d "{\"ref\":\"v1.0.1\",\"inputs\":{\"version\": \"${{ env.version }}\"}}" \
  345. "https://api.github.com/repos/emqx/emqx-ci-helper/actions/workflows/update_emqx_homebrew.yaml/dispatches"
  346. fi
  347. - uses: geekyeggo/delete-artifact@v1
  348. with:
  349. name: emqx
  350. - uses: geekyeggo/delete-artifact@v1
  351. with:
  352. name: emqx-edge