build_packages.yaml 12 KB

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