diff --git a/.circleci/config.yml b/.circleci/config.yml index 36acaf1..d0d6af5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -96,9 +96,13 @@ jobs: name: install docker command: apt-get update -q && apt-get install -q -y docker.io - setup_remote_docker + # Build and test the tip-of-tree build of EMSDK - run: name: build - command: docker build --network host ./docker + command: make -C ./docker version=tot build + - run: + name: test + command: make -C ./docker version=tot test publish-docker-image: executor: bionic @@ -110,16 +114,15 @@ jobs: - setup_remote_docker - run: name: build - command: docker build --network host --build-arg EMSCRIPTEN_VERSION=${CIRCLE_TAG} --tag emscripten/emsdk:${CIRCLE_TAG} ./docker + command: make -C ./docker version=${CIRCLE_TAG} build - run: - name: tag image - command: docker tag emscripten/emsdk:${CIRCLE_TAG} emscripten/emsdk:latest + name: test + command: make -C ./docker version=${CIRCLE_TAG} test - run: name: push image command: | docker login -u "$DOCKER_USER" -p "$DOCKER_PASS" - docker push emscripten/emsdk:${CIRCLE_TAG} - docker push emscripten/emsdk:latest + make -C ./docker version=${CIRCLE_TAG} alias=latest push workflows: flake8: diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..0e32b67 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,25 @@ +# Ignore all subdirectories +*/* + +# Allow to run the test script inside the Docker container +!/docker/test_dockerimage.sh + +# Allow the Dockerfile for future re-creation/reference +!/docker/Dockerfile + +# Ignore unnecessary files inside top-level directory +*.bat +*.csh +*.fish +*.ps1 +*.pyc +.emscripten +.emscripten.old +.emscripten_cache +.emscripten_cache__last_clear +.emscripten_sanity +.emscripten_sanity_wasm +.flake8 +emscripten-releases-tot.txt +legacy-*-tags.txt +README.md diff --git a/docker/Dockerfile b/docker/Dockerfile index 8f3f159..e183c21 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,6 +1,6 @@ FROM debian:buster AS stage_build -ARG EMSCRIPTEN_VERSION=1.39.20 +ARG EMSCRIPTEN_VERSION=tot ENV EMSDK /emsdk # ------------------------------------------------------------------------------ @@ -18,12 +18,12 @@ RUN echo "## Start building" \ python3-pip \ && echo "## Done" -RUN echo "## Get EMSDK" \ - && git clone https://github.com/emscripten-core/emsdk.git ${EMSDK} \ - && echo "## Done" +# Copy the contents of this repository to the container +COPY . ${EMSDK} RUN echo "## Install Emscripten" \ && cd ${EMSDK} \ + && if [ "$EMSCRIPTEN_VERSION" = "tot" ]; then ./emsdk update-tags; fi \ && ./emsdk install ${EMSCRIPTEN_VERSION} \ && echo "## Done" @@ -115,18 +115,6 @@ RUN echo "## Update and install packages" \ && rm -rf /usr/share/man/??_* \ && echo "## Done" -# ------------------------------------------------------------------------------ -# Internal test suite of tools that this image provides -COPY test_dockerimage.sh /emsdk/ - -RUN echo "## Internal Testing of image" \ - && /emsdk/test_dockerimage.sh \ - && echo "## Done" - -# ------------------------------------------------------------------------------ -# Copy this Dockerimage into image, so that it will be possible to recreate it later -COPY Dockerfile /emsdk/dockerfiles/emscripten-core/emsdk/ - # ------------------------------------------------------------------------------ # Use commonly used /src as working directory WORKDIR /src diff --git a/docker/Makefile b/docker/Makefile index fa02f45..0c961ca 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -1,21 +1,28 @@ -#!/usr/bin/env make +# A Makefile to build, test, tag and publish the Emscripten SDK Docker container. # Emscripten version to build: Should match the version that has been already released. -# i.e.: 1.38.45, 1.38.45-upstream +# i.e.: 1.39.18 version = alias = +image_name ?= emscripten/emsdk + .TEST: ifndef version $(error argument 'version' is not set. Please call `make version=SOME_VERSION ...`) endif -build: .TEST - docker build --network host --build-arg=EMSCRIPTEN_VERSION=${version} --tag emscripten/emsdk:${version} . +build: Dockerfile .TEST + cd .. && docker build --network host --build-arg=EMSCRIPTEN_VERSION=${version} -t ${image_name}:${version} -f docker/$< . + +test: test_dockerimage.sh .TEST + # test as non-root + docker run --rm -u `id -u`:`id -g` -w /emsdk/docker --net=host ${image_name}:${version} \ + bash $< push: .TEST - docker push emscripten/emsdk:${version} + docker push ${image_name}:${version} ifdef alias - docker tag emscripten/emsdk:${version} emscripten/emsdk:${alias} - docker push emscripten/emsdk:${alias} + docker tag ${image_name}:${version} ${image_name}:${alias} + docker push ${image_name}:${alias} endif diff --git a/docker/README.md b/docker/README.md index 7199de8..d7c7fc8 100644 --- a/docker/README.md +++ b/docker/README.md @@ -1,6 +1,6 @@ # Dockerfile for EMSDK -This Dockerfile builds a self-contained version of emsdk that enables emscripten to be used without any +This Dockerfile builds a self-contained version of Emscripten SDK that enables Emscripten to be used without any other installation on the host system. It is published at https://hub.docker.com/u/emscripten/emsdk @@ -23,7 +23,7 @@ EOF # compile with docker image docker run \ --rm \ - -v $(pwd):$(pwd) \ + -v $(pwd):/src \ -u $(id -u):$(id -g) \ emscripten/emsdk \ emcc helloworld.cpp -o helloworld.js @@ -51,7 +51,7 @@ This image requires to specify following build arguments: | arg | description | | --- | --- | -| `EMSCRIPTEN_VERSION` | One of released version of Emscripten. For example `1.38.45`
Can be used with `-upstream` variant like: `1.38.45-upstream`
Minimal supported version is **1.38.40**| +| `EMSCRIPTEN_VERSION` | One of released version of Emscripten. For example `1.39.17`
Minimal supported version is **1.39.0**| **Building** @@ -60,13 +60,14 @@ This step will build Dockerfile as given tag on local machine # using docker docker build \ --network host \ - --build-arg=EMSCRIPTEN_VERSION=1.38.43-upstream \ - --tag emscripten/emsdk:1.38.43-upstream \ + --build-arg=EMSCRIPTEN_VERSION=1.39.17 \ + -t emscripten/emsdk:1.39.17 \ + -f docker/Dockerfile \ . ``` ```bash # using predefined make target -make version=1.38.43-upstream build +make version=1.39.17 build test ``` **Tagging** @@ -79,35 +80,24 @@ This step will take local image and push to default docker registry. You need to ```bash # using docker -docker push emscripten/emsdk:1.38.43-upstream +docker push emscripten/emsdk:1.39.17 ``` ```bash # using predefined make target -make version=1.38.43-upstream push +make version=1.39.17 push ``` -In case of pushing the most recent version, this version should be also tagged as `latest` or `latest-upstream` and pushed. +In case of pushing the most recent version, this version should be also tagged as `latest` and pushed. ```bash # using docker cli - -# in case of fastcomp variant (default backend) -docker tag emscripten/emsdk:1.38.43 emscripten/emsdk:latest +docker tag emscripten/emsdk:1.39.17 emscripten/emsdk:latest docker push emscripten/emsdk:latest -# in case of upstream variant -docker tag emscripten/emsdk:1.38.43-upstream emscripten/emsdk:latest-upstream -docker push emscripten/emsdk:latest-upstream - -``` - ```bash -# using predefined make target - -make version=1.38.43-upstream alias=latest-upstream push - +# using make +make version=1.39.17 alias=latest push ``` - ### Extending If your project uses packages that this image doesn't provide you might want to: @@ -117,20 +107,19 @@ If your project uses packages that this image doesn't provide you might want to: 1. create own Dockerfile that holds: ```dockerfile # Point at any base image that you find suitable to extend. - FROM emscripten/emsdk:1.38.25 + FROM emscripten/emsdk:1.39.17 # Install required tools that are useful for your project i.e. ninja-build RUN apt update && apt install -y ninja-build - ``` + 2. build it - ```shell + ```bash docker build -t extended_emscripten . ``` 3. test - ```shell + ```bash docker run --rm extended_emscripten ninja --version - # Python 2.7.16 + # 1.10.0 ``` - diff --git a/docker/test_dockerimage.sh b/docker/test_dockerimage.sh index 9c8b92b..4f44806 100755 --- a/docker/test_dockerimage.sh +++ b/docker/test_dockerimage.sh @@ -1,9 +1,10 @@ -#!/bin/bash +#!/usr/bin/env bash set -ex -sudo -u nobody `which emcc` --version +if [ $EUID -eq 0 ]; then + sudo -u nobody `which emcc` --version +fi -which asm2wasm which llvm-ar which emsdk node --version @@ -15,5 +16,15 @@ emcc --version java -version cmake --version -# cleanup after test -find ${EMSDK} -name "*.pyc" -exec rm {} \; +exit_code=0 + +# test emcc compilation +echo 'int main() { return 0; }' | emcc -o /tmp/main.js -xc - +node /tmp/main.js || exit_code=$? +if [ $exit_code -ne 0 ]; then + echo "Node exited with non-zero exit code: $exit_code" + exit $exit_code +fi + +# test embuilder +embuilder build zlib --force