build_packages.yaml 14 KB

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