diff --git a/.github/workflows/push_to_docker_hub.yml b/.github/workflows/push_to_docker_hub.yml new file mode 100644 index 00000000000..af93972b61f --- /dev/null +++ b/.github/workflows/push_to_docker_hub.yml @@ -0,0 +1,126 @@ +name: Build Docker images and push to DockerHub + +on: + workflow_dispatch: + # Allow to run manually + branches: + - 'develop' + - 'docker_hub_gha' + push: + tags: + # Just create image on pushing a tag + - '*' + +jobs: + sagemath-dev: + name: Build Docker image on target make-build and push to DockerHub sagemath-dev + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set tag + # docker/metadata-action@v4 is not used since we need to distinguish + # between latest and develop tags + id: set_tag + run: | + git fetch --depth=1 origin +refs/tags/*:refs/tags/* + TAG_NAME=$(git tag --sort=v:refname | tail -1) + TAG="sagemath/sagemath-dev:$TAG_NAME" + TAG_LIST="$TAG, sagemath/sagemath-dev:develop" + TAG_LIST="$TAG" # don't tag develop until meaning of sagemath-dev is clear + echo "TAG_NAME=$TAG_NAME" >> $GITHUB_ENV + echo "TAG=$TAG" >> $GITHUB_ENV + echo "TAG_LIST=$TAG_LIST" >> $GITHUB_ENV + + - name: Update Tag List + id: upd_tag_list + run: | + TAG_LIST="${{ env.TAG_LIST }}, sagemath/sagemath-dev:latest" + TAG_LIST="${{ env.TAG_LIST }}" # don't tag latest until meaning of sagemath-dev is clear + echo "TAG_LIST=$TAG_LIST" >> $GITHUB_ENV + if: "!contains(env.TAG_NAME, 'beta') && !contains(env.TAG_NAME, 'rc')" + + - name: Check env + run: | + echo ${{ env.TAG_NAME }} + echo ${{ env.TAG }} + echo ${{ env.TAG_LIST }} + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and push make-build + uses: docker/build-push-action@v4 + with: + context: . + file: docker/Dockerfile + target: make-build # see the corresponding header-note + push: true + tags: ${{ env.TAG_LIST }} + cache-from: type=gha + cache-to: type=gha,mode=max + + sagemath: + needs: sagemath-dev + name: Build Docker image on target sagemath and push to DockerHub sagemath + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set tag + # docker/metadata-action@v4 is not used since we need to distinguish + # between latest and develop tags + id: set_tag + run: | + git fetch --depth=1 origin +refs/tags/*:refs/tags/* + TAG_NAME=$(git tag --sort=v:refname | tail -1) + TAG="sagemath/sagemath:$TAG_NAME" + TAG_LIST="$TAG, sagemath/sagemath:develop" + BASE="sagemath/sagemath-dev:$TAG_NAME" + echo "TAG_NAME=$TAG_NAME" >> $GITHUB_ENV + echo "TAG=$TAG" >> $GITHUB_ENV + echo "TAG_LIST=$TAG_LIST" >> $GITHUB_ENV + echo "BASE=$BASE" >> $GITHUB_ENV + + - name: Update Tag List + id: upd_tag_list + run: | + TAG_LIST="${{ env.TAG_LIST }}, sagemath/sagemath:latest" + echo "TAG_LIST=$TAG_LIST" >> $GITHUB_ENV + if: "!contains(env.TAG_NAME, 'beta') && !contains(env.TAG_NAME, 'rc')" + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and push sagemath + uses: docker/build-push-action@v4 + with: + context: . + file: docker/Dockerfile + build-args: | + MAKE_BUILD=${{ env.BASE }} + target: sagemath + push: true + tags: ${{ env.TAG_LIST }} + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/docker/Dockerfile b/docker/Dockerfile index 9d56b10b9c5..6b0ecab4795 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -70,11 +70,12 @@ ARG ARTIFACT_BASE=source-clean +ARG MAKE_BUILD=make-build ################################################################################ # Image containing the run-time dependencies for Sage # ################################################################################ -FROM ubuntu:jammy as run-time-dependencies +FROM ubuntu:latest as run-time-dependencies LABEL maintainer="Erik M. Bray , Julian RĂ¼th " # Set sane defaults for common environment variables. ENV LC_ALL C.UTF-8 @@ -122,7 +123,7 @@ ARG SAGE_ROOT=/home/sage/sage RUN mkdir -p "$SAGE_ROOT" WORKDIR $SAGE_ROOT RUN git init -RUN git remote add trac https://gitlab.com/sagemath/dev/tracmirror.git +RUN git remote add upstream https://github.com/sagemath/sage.git ################################################################################ # Image with the build context added, i.e., the directory from which `docker # @@ -155,10 +156,10 @@ WORKDIR $SAGE_ROOT # We create a list of all files present in the artifact-base (with a timestamp # of now) so we can find out later which files were added/changed/removed. RUN find . \( -type f -or -type l \) > $HOME/artifact-base.manifest -RUN git fetch "$HOME/sage-context" HEAD \ +RUN git fetch --update-shallow "$HOME/sage-context" HEAD \ && if [ -e docker/.commit ]; then \ git reset `cat docker/.commit` \ - || ( echo "Could not find commit `cat docker/.commit` in your local Git history. Please merge in the latest built develop branch to fix this: git fetch trac && git merge `cat docker/.commit`." && exit 1 ) \ + || ( echo "Could not find commit `cat docker/.commit` in your local Git history. Please merge in the latest built develop branch to fix this: git fetch upstream && git merge `cat docker/.commit`." && exit 1 ) \ else \ echo "You are building from $ARTIFACT_BASE which has no docker/.commit file. That's a bug unless you are building from source-clean or something similar." \ && git reset FETCH_HEAD \ @@ -203,7 +204,7 @@ RUN make build ################################################################################ # Image with a full build of sage and its documentation. # ################################################################################ -FROM make-build as make-all +FROM $MAKE_BUILD as make-all # The docbuild needs quite some RAM (as of May 2018). It sometimes calls # os.fork() to spawn an external program which then exceeds easily the # overcommit limit of the system (no RAM is actually used, but this limit is