Docker improvements (#571)
- Copy the current checkout to the Dockerfile. - Add .dockerignore to exclude files while copying. - Test tip-of-tree build within CI. - Run the test suite outside the Docker image. - Perform extra sanity tests. - Switch to make commands for CircleCI. - Improve Docker README.
This commit is contained in:
committed by
GitHub
parent
f6c9e453f8
commit
645d276b5c
@@ -96,9 +96,13 @@ jobs:
|
|||||||
name: install docker
|
name: install docker
|
||||||
command: apt-get update -q && apt-get install -q -y docker.io
|
command: apt-get update -q && apt-get install -q -y docker.io
|
||||||
- setup_remote_docker
|
- setup_remote_docker
|
||||||
|
# Build and test the tip-of-tree build of EMSDK
|
||||||
- run:
|
- run:
|
||||||
name: build
|
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:
|
publish-docker-image:
|
||||||
executor: bionic
|
executor: bionic
|
||||||
@@ -110,16 +114,15 @@ jobs:
|
|||||||
- setup_remote_docker
|
- setup_remote_docker
|
||||||
- run:
|
- run:
|
||||||
name: build
|
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:
|
- run:
|
||||||
name: tag image
|
name: test
|
||||||
command: docker tag emscripten/emsdk:${CIRCLE_TAG} emscripten/emsdk:latest
|
command: make -C ./docker version=${CIRCLE_TAG} test
|
||||||
- run:
|
- run:
|
||||||
name: push image
|
name: push image
|
||||||
command: |
|
command: |
|
||||||
docker login -u "$DOCKER_USER" -p "$DOCKER_PASS"
|
docker login -u "$DOCKER_USER" -p "$DOCKER_PASS"
|
||||||
docker push emscripten/emsdk:${CIRCLE_TAG}
|
make -C ./docker version=${CIRCLE_TAG} alias=latest push
|
||||||
docker push emscripten/emsdk:latest
|
|
||||||
|
|
||||||
workflows:
|
workflows:
|
||||||
flake8:
|
flake8:
|
||||||
|
|||||||
25
.dockerignore
Normal file
25
.dockerignore
Normal file
@@ -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
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
FROM debian:buster AS stage_build
|
FROM debian:buster AS stage_build
|
||||||
|
|
||||||
ARG EMSCRIPTEN_VERSION=1.39.20
|
ARG EMSCRIPTEN_VERSION=tot
|
||||||
ENV EMSDK /emsdk
|
ENV EMSDK /emsdk
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
@@ -18,12 +18,12 @@ RUN echo "## Start building" \
|
|||||||
python3-pip \
|
python3-pip \
|
||||||
&& echo "## Done"
|
&& echo "## Done"
|
||||||
|
|
||||||
RUN echo "## Get EMSDK" \
|
# Copy the contents of this repository to the container
|
||||||
&& git clone https://github.com/emscripten-core/emsdk.git ${EMSDK} \
|
COPY . ${EMSDK}
|
||||||
&& echo "## Done"
|
|
||||||
|
|
||||||
RUN echo "## Install Emscripten" \
|
RUN echo "## Install Emscripten" \
|
||||||
&& cd ${EMSDK} \
|
&& cd ${EMSDK} \
|
||||||
|
&& if [ "$EMSCRIPTEN_VERSION" = "tot" ]; then ./emsdk update-tags; fi \
|
||||||
&& ./emsdk install ${EMSCRIPTEN_VERSION} \
|
&& ./emsdk install ${EMSCRIPTEN_VERSION} \
|
||||||
&& echo "## Done"
|
&& echo "## Done"
|
||||||
|
|
||||||
@@ -115,18 +115,6 @@ RUN echo "## Update and install packages" \
|
|||||||
&& rm -rf /usr/share/man/??_* \
|
&& rm -rf /usr/share/man/??_* \
|
||||||
&& echo "## Done"
|
&& 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
|
# Use commonly used /src as working directory
|
||||||
WORKDIR /src
|
WORKDIR /src
|
||||||
|
|||||||
@@ -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.
|
# 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 =
|
version =
|
||||||
alias =
|
alias =
|
||||||
|
|
||||||
|
image_name ?= emscripten/emsdk
|
||||||
|
|
||||||
.TEST:
|
.TEST:
|
||||||
ifndef version
|
ifndef version
|
||||||
$(error argument 'version' is not set. Please call `make version=SOME_VERSION ...`)
|
$(error argument 'version' is not set. Please call `make version=SOME_VERSION ...`)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
build: .TEST
|
build: Dockerfile .TEST
|
||||||
docker build --network host --build-arg=EMSCRIPTEN_VERSION=${version} --tag emscripten/emsdk:${version} .
|
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
|
push: .TEST
|
||||||
docker push emscripten/emsdk:${version}
|
docker push ${image_name}:${version}
|
||||||
ifdef alias
|
ifdef alias
|
||||||
docker tag emscripten/emsdk:${version} emscripten/emsdk:${alias}
|
docker tag ${image_name}:${version} ${image_name}:${alias}
|
||||||
docker push emscripten/emsdk:${alias}
|
docker push ${image_name}:${alias}
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Dockerfile for EMSDK
|
# 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.
|
other installation on the host system.
|
||||||
|
|
||||||
It is published at https://hub.docker.com/u/emscripten/emsdk
|
It is published at https://hub.docker.com/u/emscripten/emsdk
|
||||||
@@ -23,7 +23,7 @@ EOF
|
|||||||
# compile with docker image
|
# compile with docker image
|
||||||
docker run \
|
docker run \
|
||||||
--rm \
|
--rm \
|
||||||
-v $(pwd):$(pwd) \
|
-v $(pwd):/src \
|
||||||
-u $(id -u):$(id -g) \
|
-u $(id -u):$(id -g) \
|
||||||
emscripten/emsdk \
|
emscripten/emsdk \
|
||||||
emcc helloworld.cpp -o helloworld.js
|
emcc helloworld.cpp -o helloworld.js
|
||||||
@@ -51,7 +51,7 @@ This image requires to specify following build arguments:
|
|||||||
|
|
||||||
| arg | description |
|
| arg | description |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| `EMSCRIPTEN_VERSION` | One of released version of Emscripten. For example `1.38.45`<br/> Can be used with `-upstream` variant like: `1.38.45-upstream`<br /> Minimal supported version is **1.38.40**|
|
| `EMSCRIPTEN_VERSION` | One of released version of Emscripten. For example `1.39.17`<br/> Minimal supported version is **1.39.0**|
|
||||||
|
|
||||||
**Building**
|
**Building**
|
||||||
|
|
||||||
@@ -60,13 +60,14 @@ This step will build Dockerfile as given tag on local machine
|
|||||||
# using docker
|
# using docker
|
||||||
docker build \
|
docker build \
|
||||||
--network host \
|
--network host \
|
||||||
--build-arg=EMSCRIPTEN_VERSION=1.38.43-upstream \
|
--build-arg=EMSCRIPTEN_VERSION=1.39.17 \
|
||||||
--tag emscripten/emsdk:1.38.43-upstream \
|
-t emscripten/emsdk:1.39.17 \
|
||||||
|
-f docker/Dockerfile \
|
||||||
.
|
.
|
||||||
```
|
```
|
||||||
```bash
|
```bash
|
||||||
# using predefined make target
|
# using predefined make target
|
||||||
make version=1.38.43-upstream build
|
make version=1.39.17 build test
|
||||||
```
|
```
|
||||||
|
|
||||||
**Tagging**
|
**Tagging**
|
||||||
@@ -79,35 +80,24 @@ This step will take local image and push to default docker registry. You need to
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# using docker
|
# using docker
|
||||||
docker push emscripten/emsdk:1.38.43-upstream
|
docker push emscripten/emsdk:1.39.17
|
||||||
```
|
```
|
||||||
```bash
|
```bash
|
||||||
# using predefined make target
|
# 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
|
```bash
|
||||||
# using docker cli
|
# using docker cli
|
||||||
|
docker tag emscripten/emsdk:1.39.17 emscripten/emsdk:latest
|
||||||
# in case of fastcomp variant (default backend)
|
|
||||||
docker tag emscripten/emsdk:1.38.43 emscripten/emsdk:latest
|
|
||||||
docker push 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
|
```bash
|
||||||
# using predefined make target
|
# using make
|
||||||
|
make version=1.39.17 alias=latest push
|
||||||
make version=1.38.43-upstream alias=latest-upstream push
|
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
### Extending
|
### Extending
|
||||||
|
|
||||||
If your project uses packages that this image doesn't provide you might want to:
|
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:
|
1. create own Dockerfile that holds:
|
||||||
```dockerfile
|
```dockerfile
|
||||||
# Point at any base image that you find suitable to extend.
|
# 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
|
# Install required tools that are useful for your project i.e. ninja-build
|
||||||
RUN apt update && apt install -y ninja-build
|
RUN apt update && apt install -y ninja-build
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
2. build it
|
2. build it
|
||||||
```shell
|
```bash
|
||||||
docker build -t extended_emscripten .
|
docker build -t extended_emscripten .
|
||||||
```
|
```
|
||||||
|
|
||||||
3. test
|
3. test
|
||||||
```shell
|
```bash
|
||||||
docker run --rm extended_emscripten ninja --version
|
docker run --rm extended_emscripten ninja --version
|
||||||
# Python 2.7.16
|
# 1.10.0
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
set -ex
|
set -ex
|
||||||
|
|
||||||
|
if [ $EUID -eq 0 ]; then
|
||||||
sudo -u nobody `which emcc` --version
|
sudo -u nobody `which emcc` --version
|
||||||
|
fi
|
||||||
|
|
||||||
which asm2wasm
|
|
||||||
which llvm-ar
|
which llvm-ar
|
||||||
which emsdk
|
which emsdk
|
||||||
node --version
|
node --version
|
||||||
@@ -15,5 +16,15 @@ emcc --version
|
|||||||
java -version
|
java -version
|
||||||
cmake --version
|
cmake --version
|
||||||
|
|
||||||
# cleanup after test
|
exit_code=0
|
||||||
find ${EMSDK} -name "*.pyc" -exec rm {} \;
|
|
||||||
|
# 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
|
||||||
|
|||||||
Reference in New Issue
Block a user