build_packages.yaml 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. name: Build packages
  2. on:
  3. push:
  4. tags:
  5. pull_request:
  6. release:
  7. types:
  8. - published
  9. jobs:
  10. build:
  11. runs-on: ubuntu-latest
  12. steps:
  13. - uses: actions/checkout@v2
  14. with:
  15. fetch-depth: 0
  16. - name: prepare docker
  17. run: |
  18. mkdir -p $HOME/.docker
  19. echo '{ "experimental": "enabled" }' | tee $HOME/.docker/config.json
  20. echo '{ "experimental": true, "storage-driver": "overlay2", "max-concurrent-downloads": 50, "max-concurrent-uploads": 50 }' | sudo tee /etc/docker/daemon.json
  21. sudo systemctl restart docker
  22. docker info
  23. docker buildx create --use --name mybuild
  24. - name: build
  25. run: |
  26. make all_pkgs
  27. cd _packages && for var in $(ls); do sudo bash -c "echo $(sha256sum $var | awk '{print $1}') > $var.sha256"; done && cd -
  28. - uses: actions/upload-artifact@v1
  29. with:
  30. name: packages
  31. path: _packages/.
  32. build-on-mac:
  33. runs-on: macos-latest
  34. steps:
  35. - uses: actions/checkout@v2
  36. with:
  37. fetch-depth: 0
  38. - uses: actions/setup-go@v2
  39. with:
  40. go-version: '1.15.1'
  41. - name: prepare
  42. run: |
  43. brew install curl zip unzip gnu-sed upx pkg-config zmq
  44. echo "/usr/local/bin:$PATH" >> ~/.bashrc
  45. - name: build
  46. run: |
  47. make pkg
  48. cd _packages && for var in $(ls); do openssl dgst -sha256 $var | awk '{print $2}' > $var.sha256; done && cd -
  49. - uses: actions/upload-artifact@v1
  50. with:
  51. name: packages-mac
  52. path: _packages/.
  53. build-docker-images:
  54. runs-on: ubuntu-latest
  55. steps:
  56. - uses: actions/checkout@v2
  57. with:
  58. fetch-depth: 0
  59. - name: prepare docker
  60. run: |
  61. mkdir -p $HOME/.docker
  62. echo '{ "experimental": "enabled" }' | tee $HOME/.docker/config.json
  63. echo '{ "experimental": true, "storage-driver": "overlay2", "max-concurrent-downloads": 50, "max-concurrent-uploads": 50, "graph": "/mnt/docker" }' | sudo tee /etc/docker/daemon.json
  64. sudo systemctl restart docker
  65. docker version
  66. docker buildx create --use --name mybuild
  67. docker run --rm --privileged tonistiigi/binfmt --install all
  68. - name: build docker image
  69. run: |
  70. make docker -j4
  71. docker save emqx/kuiper:$(git describe --tags --always)-slim > kuiper-image.tar.gz
  72. - name: test docker image
  73. run: |
  74. for image_id in $(docker images emqx/kuiper -q); do
  75. container_id=$(docker run -d $image_id)
  76. ip_address=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $container_id)
  77. sleep 5
  78. if ! curl ${ip_address}:9081 >/dev/null 2>&1; then echo "docker image failed"; exit 1; fi
  79. done
  80. - uses: actions/upload-artifact@v2
  81. with:
  82. name: kuiper-image
  83. path: "kuiper-image.tar.gz"
  84. build-plugins:
  85. runs-on: ubuntu-latest
  86. needs: build-docker-images
  87. strategy:
  88. fail-fast: false
  89. matrix:
  90. plugin:
  91. - sinks/file
  92. - sinks/image
  93. - sinks/influx
  94. - sinks/tdengine
  95. - sinks/zmq
  96. - sources/random
  97. - sources/zmq
  98. - functions/accumulateWordCount
  99. - functions/countPlusOne
  100. - functions/echo
  101. - functions/image
  102. - functions/geohash
  103. - functions/labelImage
  104. steps:
  105. - uses: actions/checkout@v2
  106. with:
  107. fetch-depth: 0
  108. - name: prepare docker
  109. run: |
  110. mkdir -p $HOME/.docker
  111. echo '{ "experimental": "enabled" }' | tee $HOME/.docker/config.json
  112. echo '{ "experimental": true, "storage-driver": "overlay2", "max-concurrent-downloads": 50, "max-concurrent-uploads": 50, "graph": "/mnt/docker" }' | sudo tee /etc/docker/daemon.json
  113. sudo systemctl restart docker
  114. docker version
  115. docker buildx create --use --name mybuild
  116. docker run --rm --privileged tonistiigi/binfmt --install all
  117. - name: build debian plugins
  118. env:
  119. PLUGIN: ${{ matrix.plugin }}
  120. run: |
  121. make ${PLUGIN}
  122. - uses: actions/download-artifact@v1
  123. with:
  124. name: kuiper-image
  125. path: .
  126. - name: test docker and plugins
  127. env:
  128. PLUGIN: ${{ matrix.plugin }}
  129. run: |
  130. set -e -x -u
  131. docker load < kuiper-image.tar.gz
  132. plugin_type=$(echo ${PLUGIN%%/*})
  133. plugin_name=$(echo ${PLUGIN##*/})
  134. for image_id in $(docker images emqx/kuiper -q); do
  135. container_id=$(docker run -d -v $(pwd)/_plugins:/var/plugins $image_id)
  136. ip_address=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $container_id)
  137. os=$(docker exec -i ${container_id} sh -c "sed -n '/^ID=/p' /etc/os-release | sed -r 's/ID=(.*)/\1/g'" )
  138. sleep 5
  139. if ! curl ${ip_address}:9081 >/dev/null 2>&1; then echo "docker image failed"; exit 1; fi
  140. if [ ${os} = alpine ]; then continue; fi
  141. if [ "${plugin_name}" = "tdengine" ]; then
  142. curl \
  143. ${ip_address}:9081/plugins/${plugin_type} \
  144. -X POST \
  145. -d "{\"name\":\"${plugin_name}\", \"file\":\"file:///var/plugins/${os}/${plugin_type}/${plugin_name}_amd64.zip\", \"shellParas\": [\"2.0.3.1\"]}"
  146. elif [ "${plugin_name}" = "image" ]; then
  147. curl \
  148. ${ip_address}:9081/plugins/${plugin_type} \
  149. -X POST \
  150. -d "{\"name\":\"${plugin_name}\", \"file\":\"file:///var/plugins/${os}/${plugin_type}/${plugin_name}_amd64.zip\", \"functions\": [\"resize\",\"thumbnail\"]}"
  151. elif [ "${plugin_name}" = "geohash" ]; then
  152. curl \
  153. ${ip_address}:9081/plugins/${plugin_type} \
  154. -X POST \
  155. -d "{\"name\":\"${plugin_name}\", \"file\":\"file:///var/plugins/${os}/${plugin_type}/${plugin_name}_amd64.zip\", \"functions\": [\"geohashEncode\", \"geohashEncodeInt\", \"geohashDecode\", \"geohashDecodeInt\", \"geohashBoundingBox\", \"geohashBoundingBoxInt\", \"geohashNeighbor\", \"geohashNeighborInt\", \"geohashNeighbors\", \"geohashNeighborsInt\"]}"
  156. else
  157. curl \
  158. ${ip_address}:9081/plugins/${plugin_type} \
  159. -X POST \
  160. -d "{\"name\":\"${plugin_name}\", \"file\":\"file:///var/plugins/${os}/${plugin_type}/${plugin_name}_amd64.zip\"}"
  161. fi
  162. docker logs ${container_id}
  163. [ $plugin_name = $(curl ${ip_address}:9081/plugins/${plugin_type}/${plugin_name} | jq '.name'| sed 's/\"//g' ) ] || exit 1
  164. done
  165. - uses: actions/upload-artifact@v2
  166. with:
  167. name: plugins
  168. path: "_plugins/"
  169. build-docker-manifest-images:
  170. runs-on: ubuntu-latest
  171. needs: build-docker-images
  172. if: github.event_name == 'release'
  173. strategy:
  174. matrix:
  175. suffix:
  176. - fat
  177. - slim
  178. - alpine
  179. steps:
  180. - uses: actions/checkout@v2
  181. with:
  182. fetch-depth: 0
  183. - name: prepare docker
  184. run: |
  185. mkdir -p $HOME/.docker
  186. echo '{ "experimental": "enabled" }' | tee $HOME/.docker/config.json
  187. echo '{ "experimental": true, "storage-driver": "overlay2", "max-concurrent-downloads": 50, "max-concurrent-uploads": 50, "graph": "/mnt/docker" }' | sudo tee /etc/docker/daemon.json
  188. sudo systemctl restart docker
  189. docker version
  190. docker buildx create --use --name mybuild
  191. docker run --rm --privileged tonistiigi/binfmt --install all
  192. - name: cross build docker images
  193. if: matrix.suffix == 'fat'
  194. run: |
  195. set -e -u -x
  196. echo ${{ secrets.DOCKER_HUB_TOKEN }} | docker login -u ${{ secrets.DOCKER_HUB_USER }} --password-stdin
  197. docker buildx build --no-cache \
  198. --platform=linux/amd64,linux/arm64,linux/arm/v7,linux/386,linux/ppc64le \
  199. -t emqx/kuiper:$(git describe --tags --always) \
  200. -f deploy/docker/Dockerfile . \
  201. --push
  202. - name: cross build docker images
  203. if: matrix.suffix != 'fat'
  204. env:
  205. SUFFIX: ${{ matrix.suffix }}
  206. run: |
  207. set -e -u -x
  208. echo ${{ secrets.DOCKER_HUB_TOKEN }} | docker login -u ${{ secrets.DOCKER_HUB_USER }} --password-stdin
  209. docker buildx build --no-cache \
  210. --platform=linux/amd64,linux/arm64,linux/arm/v7,linux/386,linux/ppc64le \
  211. -t emqx/kuiper:$(git describe --tags --always)-$SUFFIX \
  212. -f deploy/docker/Dockerfile-$SUFFIX . \
  213. --push
  214. build-kubernetes-tool:
  215. runs-on: ubuntu-latest
  216. steps:
  217. - uses: actions/checkout@v2
  218. with:
  219. fetch-depth: 0
  220. - name: install docker
  221. run: |
  222. sudo apt-get remove docker docker-engine docker.io containerd runc
  223. sudo apt-get update
  224. sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
  225. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  226. sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  227. sudo apt-get update
  228. sudo apt-get install docker-ce docker-ce-cli containerd.io
  229. - name: prepare docker
  230. run: |
  231. mkdir -p $HOME/.docker
  232. echo '{ "experimental": "enabled" }' | tee $HOME/.docker/config.json
  233. echo '{ "experimental": true, "storage-driver": "overlay2", "max-concurrent-downloads": 50, "max-concurrent-uploads": 50, "graph": "/mnt/docker" }' | sudo tee /etc/docker/daemon.json
  234. sudo systemctl restart docker
  235. docker version
  236. docker buildx create --use --name mybuild
  237. docker run --rm --privileged tonistiigi/binfmt --install all
  238. - name: build docker image
  239. run: docker build --no-cache -t emqx/kuiper-kubernetes-tool:$(git describe --tags --always) -f deploy/docker/Dockerfile-kubernetes-tool .
  240. - name: test docker image
  241. run: |
  242. set -e -u -x
  243. docker run -d --name kuiper-kubernetes-tool emqx/kuiper-kubernetes-tool:$(git describe --tags --always)
  244. sleep 5
  245. if [ "$(docker logs kuiper-kubernetes-tool)" != "Kuiper kubernetes tool is started successfully!" ]; then exit 1; fi
  246. - name: buildx docker image
  247. if: github.event_name == 'release'
  248. run: |
  249. echo ${{ secrets.DOCKER_HUB_TOKEN }} | docker login -u ${{ secrets.DOCKER_HUB_USER }} --password-stdin
  250. docker buildx build --no-cache \
  251. --platform=linux/amd64,linux/arm64,linux/arm/v7,linux/386 \
  252. -t emqx/kuiper-kubernetes-tool:$(git describe --tags --always) \
  253. -f deploy/docker/Dockerfile-kubernetes-tool . \
  254. --push
  255. release:
  256. runs-on: ubuntu-latest
  257. needs:
  258. - build
  259. - build-on-mac
  260. - build-plugins
  261. steps:
  262. - uses: actions/checkout@v2
  263. - uses: actions/download-artifact@v1
  264. with:
  265. name: packages
  266. path: _packages
  267. - uses: actions/download-artifact@v1
  268. with:
  269. name: packages-mac
  270. path: _packages
  271. - uses: actions/download-artifact@v1
  272. with:
  273. name: plugins
  274. path: _plugins
  275. - name: check packages
  276. run: |
  277. cd _packages && for var in $( ls |grep -v sha256); do
  278. echo "$(cat $var.sha256) $var" | sha256sum -c || exit 1
  279. done
  280. - uses: zhanghongtong/upload-release-asset@v1
  281. if: github.event_name == 'release'
  282. with:
  283. repo: kuiper
  284. path: "_packages/kuiper-*"
  285. token: ${{ secrets.AccessToken }}
  286. - name: create invalidation for cloudfront
  287. if: github.event_name == 'release'
  288. run: |
  289. version=$(echo ${{ github.ref }} | sed -r "s .*/.*/(.*) \1 g")
  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 rm --quiet --recursive s3://packages.emqx/kuiper/$version
  294. aws s3 cp --quiet --recursive ./_packages s3://packages.emqx/kuiper/$version
  295. aws s3 cp --quiet --recursive ./_plugins s3://packages.emqx/kuiper-plugins/$version
  296. aws cloudfront create-invalidation --distribution-id E170YEULGLT8XB --paths "/kuiper/$version/*,/kuiper-plugins/$version/*"
  297. - name: update emqx.io
  298. if: github.event_name == 'release'
  299. run: |
  300. version=$(echo ${{ github.ref }} | sed -r "s .*/.*/(.*) \1 g")
  301. curl -w %{http_code} \
  302. --insecure \
  303. -H "Content-Type: application/json" \
  304. -H "token: ${{ secrets.EMQX_IO_TOKEN }}" \
  305. -X POST \
  306. -d "{\"repo\":\"emqx/kuiper\", \"tag\": \"${version}\" }" \
  307. ${{ secrets.EMQX_IO_RELEASE_API }}
  308. - name: update helm packages
  309. if: github.event_name == 'release'
  310. run: |
  311. version=$(echo ${{ github.ref }} | sed -r "s .*/.*/(.*) \1 g")
  312. curl \
  313. -H "Authorization: token ${{ secrets.AccessToken }}" \
  314. -H "Accept: application/vnd.github.v3+json" \
  315. -X POST \
  316. -d "{\"ref\":\"v1.0.0\",\"inputs\":{\"version\": \"${version}\", \"emqx_ce\": \"true\"}}" \
  317. https://api.github.com/repos/emqx/emqx-ci-helper/actions/workflows/kuiper_repos.yaml/dispatches