build_packages.yaml 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  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: 22.3
  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 22.3.4.13
  76. kerl install 22.3.4.13 $HOME/.kerl/22.3.4.13
  77. - name: build
  78. run: |
  79. . $HOME/.kerl/22.3.4.13/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. ./emqx/bin/emqx start || cat emqx/log/erlang.log.1
  86. ./emqx/bin/emqx_ctl status
  87. ./emqx/bin/emqx stop
  88. rm -rf emqx
  89. openssl dgst -sha256 ./_packages/emqx/$pkg_name | awk '{print $2}' > ./_packages/emqx/$pkg_name.sha256
  90. - uses: actions/upload-artifact@v1
  91. if: startsWith(github.ref, 'refs/tags/')
  92. with:
  93. name: emqx
  94. path: ./_packages/emqx/.
  95. linux:
  96. runs-on: ubuntu-20.04
  97. strategy:
  98. matrix:
  99. arch:
  100. - amd64
  101. - arm64
  102. emqx:
  103. - emqx
  104. - emqx-edge
  105. os:
  106. - ubuntu20.04
  107. - ubuntu18.04
  108. - ubuntu16.04
  109. - debian10
  110. - debian9
  111. - opensuse
  112. - centos8
  113. - centos7
  114. - centos6
  115. - raspbian10
  116. - raspbian9
  117. exclude:
  118. - os: raspbian9
  119. arch: amd64
  120. - os: raspbian9
  121. emqx: emqx
  122. - os: raspbian10
  123. arch: amd64
  124. - os: raspbian10
  125. emqx: emqx
  126. - os: centos6
  127. arch: arm64
  128. defaults:
  129. run:
  130. shell: bash
  131. steps:
  132. - name: prepare docker
  133. run: |
  134. mkdir -p $HOME/.docker
  135. echo '{ "experimental": "enabled" }' | tee $HOME/.docker/config.json
  136. echo '{ "experimental": true, "storage-driver": "overlay2", "max-concurrent-downloads": 50, "max-concurrent-uploads": 50}' | sudo tee /etc/docker/daemon.json
  137. sudo systemctl restart docker
  138. docker info
  139. docker buildx create --use --name mybuild
  140. docker run --rm --privileged tonistiigi/binfmt --install all
  141. - uses: actions/checkout@v1
  142. - name: get deps
  143. run: |
  144. docker run -i --rm \
  145. -e GITHUB_RUN_ID=$GITHUB_RUN_ID \
  146. -e GITHUB_REF=$GITHUB_REF \
  147. -v $(pwd):/emqx \
  148. -w /emqx \
  149. emqx/build-env:erl22.3-debian10 \
  150. bash -c "make deps-all"
  151. - name: downloads emqx zip packages
  152. env:
  153. EMQX: ${{ matrix.emqx }}
  154. ARCH: ${{ matrix.arch }}
  155. SYSTEM: ${{ matrix.os }}
  156. run: |
  157. set -e -u -x
  158. if [ $EMQX = "emqx-edge" ];then broker="emqx-edge"; else broker="emqx-ce"; fi
  159. if [ $ARCH = "arm64" ];then arch="aarch64"; else arch="x86_64"; fi
  160. vsn="$(grep -oE '\{vsn, (.*)\}' src/emqx.app.src | sed -r 's/\{vsn, (.*)\}/\1/g' | sed 's/\"//g')"
  161. pre_vsn="$(echo $vsn | grep -oE '^[0-9]+.[0-9]')"
  162. old_vsns=($(git tag -l "$pre_vsn.[0-9]" | sed "s/$vsn//"))
  163. mkdir -p tmp/relup_packages/$EMQX
  164. cd tmp/relup_packages/$EMQX
  165. for tag in ${old_vsns[@]};do
  166. 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
  167. wget https://s3-us-west-2.amazonaws.com/packages.emqx/$broker/v${tag#[e|v]}/$EMQX-$SYSTEM-${tag#[e|v]}-$arch.zip
  168. wget https://s3-us-west-2.amazonaws.com/packages.emqx/$broker/v${tag#[e|v]}/$EMQX-$SYSTEM-${tag#[e|v]}-$arch.zip.sha256
  169. echo "$(cat $EMQX-$SYSTEM-${tag#[e|v]}-$arch.zip.sha256) $EMQX-$SYSTEM-${tag#[e|v]}-$arch.zip" | sha256sum -c || exit 1
  170. fi
  171. done
  172. cd -
  173. - name: build emqx packages
  174. if: (matrix.arch == 'amd64' && matrix.emqx == 'emqx') || startsWith(github.ref, 'refs/tags/')
  175. env:
  176. ERL_OTP: erl22.3
  177. EMQX: ${{ matrix.emqx }}
  178. ARCH: ${{ matrix.arch }}
  179. SYSTEM: ${{ matrix.os }}
  180. run: |
  181. set -e -u -x
  182. docker buildx build --no-cache \
  183. --platform=linux/$ARCH \
  184. -t cross_build_emqx_for_$SYSTEM \
  185. -f .ci/build_packages/Dockerfile \
  186. --build-arg BUILD_FROM=emqx/build-env:$ERL_OTP-$SYSTEM \
  187. --build-arg EMQX_NAME=$EMQX \
  188. --output type=tar,dest=/tmp/cross-build-$EMQX-for-$SYSTEM.tar .
  189. mkdir -p /tmp/packages/$EMQX
  190. tar -xvf /tmp/cross-build-$EMQX-for-$SYSTEM.tar --wildcards emqx/_packages/$EMQX/*
  191. mv emqx/_packages/$EMQX/* /tmp/packages/$EMQX/
  192. rm -rf /tmp/cross-build-$EMQX-for-$SYSTEM.tar
  193. docker rm -f $(docker ps -a -q)
  194. docker volume prune -f
  195. - name: create sha256
  196. env:
  197. EMQX: ${{ matrix.emqx }}
  198. run: |
  199. if [ -d /tmp/packages/$EMQX ]; then
  200. cd /tmp/packages/$EMQX
  201. for var in $(ls emqx-* ); do
  202. bash -c "echo $(sha256sum $var | awk '{print $1}') > $var.sha256"
  203. done
  204. cd -
  205. fi
  206. - uses: actions/upload-artifact@v1
  207. if: startsWith(github.ref, 'refs/tags/')
  208. with:
  209. name: ${{ matrix.emqx }}
  210. path: /tmp/packages/${{ matrix.emqx }}/.
  211. docker:
  212. runs-on: ubuntu-20.04
  213. strategy:
  214. matrix:
  215. arch:
  216. - [amd64, x86_64]
  217. - [arm64v8, aarch64]
  218. - [arm32v7, arm]
  219. - [i386, i386]
  220. - [s390x, s390x]
  221. steps:
  222. - uses: actions/checkout@v1
  223. - name: get deps
  224. run: |
  225. docker run -i --rm \
  226. -e GITHUB_RUN_ID=$GITHUB_RUN_ID \
  227. -e GITHUB_REF=$GITHUB_REF \
  228. -v $(pwd):/emqx \
  229. -w /emqx \
  230. emqx/build-env:erl22.3-alpine-amd64 \
  231. sh -c "make deps-emqx"
  232. - name: build emqx docker image
  233. env:
  234. ARCH: ${{ matrix.arch[0] }}
  235. QEMU_ARCH: ${{ matrix.arch[1] }}
  236. run: |
  237. sudo docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
  238. sudo TARGET=emqx/emqx ARCH=$ARCH QEMU_ARCH=$QEMU_ARCH make docker
  239. cd _packages/emqx && for var in $(ls emqx-docker-* ); do sudo bash -c "echo $(sha256sum $var | awk '{print $1}') > $var.sha256"; done && cd -
  240. sudo TARGET=emqx/emqx-edge ARCH=$ARCH QEMU_ARCH=$QEMU_ARCH make docker
  241. 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 -
  242. - uses: actions/upload-artifact@v1
  243. if: startsWith(github.ref, 'refs/tags/')
  244. with:
  245. name: emqx
  246. path: ./_packages/emqx/.
  247. - uses: actions/upload-artifact@v1
  248. if: startsWith(github.ref, 'refs/tags/')
  249. with:
  250. name: emqx-edge
  251. path: ./_packages/emqx-edge/.
  252. upload:
  253. runs-on: ubuntu-20.04
  254. needs: [windows, mac, linux, docker]
  255. if: startsWith(github.ref, 'refs/tags/')
  256. steps:
  257. - uses: actions/download-artifact@v2
  258. with:
  259. name: emqx
  260. path: ./_packages/emqx
  261. - uses: actions/download-artifact@v2
  262. with:
  263. name: emqx-edge
  264. path: ./_packages/emqx-edge
  265. - name: install dos2unix
  266. run: sudo apt-get update && sudo apt install -y dos2unix
  267. - name: get packages
  268. run: |
  269. set -e -x -u
  270. for EMQX in emqx emqx-edge; do
  271. cd _packages/$EMQX
  272. for var in $( ls |grep emqx |grep -v sha256); do
  273. dos2unix $var.sha256
  274. echo "$(cat $var.sha256) $var" | sha256sum -c || exit 1
  275. done
  276. cd -
  277. done
  278. - name: upload aws s3
  279. run: |
  280. set -e -x -u
  281. version=$(echo ${{ github.ref }} | sed -r "s ^refs/heads/|^refs/tags/(.*) \1 g")
  282. curl "https://d1vvhvl2y92vvt.cloudfront.net/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
  283. unzip awscliv2.zip
  284. sudo ./aws/install
  285. aws configure set aws_access_key_id ${{ secrets.AWS_ACCESS_KEY_ID }}
  286. aws configure set aws_secret_access_key ${{ secrets.AWS_SECRET_ACCESS_KEY }}
  287. aws configure set default.region us-west-2
  288. aws s3 cp --recursive _packages/emqx s3://packages.emqx/emqx-ce/$version
  289. aws s3 cp --recursive _packages/emqx-edge s3://packages.emqx/emqx-edge/$version
  290. aws cloudfront create-invalidation --distribution-id E170YEULGLT8XB --paths "/emqx-ce/$version/*,/emqx-edge/$version/*"
  291. mkdir packages
  292. mv _packages/emqx/* packages
  293. mv _packages/emqx-edge/* packages
  294. - uses: actions/checkout@v2
  295. with:
  296. path: emqx
  297. - name: update to github and emqx.io
  298. if: github.event_name == 'release'
  299. run: |
  300. set -e -x -u
  301. version=$(echo ${{ github.ref }} | sed -r "s ^refs/heads/|^refs/tags/(.*) \1 g")
  302. cd packages
  303. for var in $(ls); do
  304. ../emqx/.ci/build_packages/upload_github_release_asset.sh owner=emqx repo=emqx tag=$version filename=$var github_api_token=$(echo ${{ secrets.AccessToken }})
  305. sleep 1
  306. done
  307. curl -w %{http_code} \
  308. --insecure \
  309. -H "Content-Type: application/json" \
  310. -H "token: ${{ secrets.EMQX_IO_TOKEN }}" \
  311. -X POST \
  312. -d "{\"repo\":\"emqx/emqx\", \"tag\": \"${version}\" }" \
  313. ${{ secrets.EMQX_IO_RELEASE_API }}
  314. - name: push docker image to docker hub
  315. if: github.event_name == 'release'
  316. run: |
  317. set -e -x -u
  318. version=$(echo ${{ github.ref }} | sed -r "s ^refs/heads/|^refs/tags/(.*) \1 g")
  319. sudo make -C emqx docker-prepare
  320. cd packages && for var in $(ls |grep docker |grep -v sha256); do unzip $var; sudo docker load < ${var%.*}; rm -f ${var%.*}; done && cd -
  321. echo ${{ secrets.DOCKER_HUB_TOKEN }} |sudo docker login -u ${{ secrets.DOCKER_HUB_USER }} --password-stdin
  322. sudo TARGET=emqx/emqx make -C emqx docker-push
  323. sudo TARGET=emqx/emqx make -C emqx docker-manifest-list
  324. sudo TARGET=emqx/emqx-edge make -C emqx docker-push
  325. sudo TARGET=emqx/emqx-edge make -C emqx docker-manifest-list
  326. - name: update repo.emqx.io
  327. if: github.event_name == 'release'
  328. run: |
  329. set -e -x -u
  330. version=$(echo ${{ github.ref }} | sed -r "s ^refs/heads/|^refs/tags/(.*) \1 g")
  331. curl \
  332. -H "Authorization: token ${{ secrets.AccessToken }}" \
  333. -H "Accept: application/vnd.github.v3+json" \
  334. -X POST \
  335. -d "{\"ref\":\"v1.0.0\",\"inputs\":{\"version\": \"${version}\", \"emqx_ce\": \"true\"}}" \
  336. https://api.github.com/repos/emqx/emqx-ci-helper/actions/workflows/update_repos.yaml/dispatches
  337. - uses: geekyeggo/delete-artifact@v1
  338. with:
  339. name: emqx
  340. - uses: geekyeggo/delete-artifact@v1
  341. with:
  342. name: emqx-edge
  343. # - name: update homebrew packages
  344. # run: |
  345. # version=$(echo ${{ github.ref }} | sed -r "s .*/.*/(.*) \1 g")
  346. # if [ ! -z $(echo $version | grep -oE "v[0-9]+\.[0-9]+(\.[0-9]+)?") ] && [ -z $(echo $version | grep -oE "(alpha|beta|rc)\.[0-9]") ]; then
  347. # 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
  348. # fi