build_packages.yaml 14 KB

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