diff --git a/.gitlab/build-images.sh b/.gitlab/build-images.sh index 81d83ee4baf44e8937e63e31b747e225d0f00456..207d5f1707eb3166a1a9411b8982c8580c05938a 100755 --- a/.gitlab/build-images.sh +++ b/.gitlab/build-images.sh @@ -18,6 +18,6 @@ for github_version in ${github_versions[@]}; do ( docker_hub_version=${github_version/v/} docker_hub_architecture_version="${docker_hub_version}-${architecture}" - echo ${docker_hub_versions} | grep -q ${docker_hub_architecture_version} || build_image "${architecture}" "${docker_hub_version}" + build_image "${architecture}" "${distro}" "${docker_hub_version}" ) done diff --git a/.gitlab/ci/build-images-amd64/.gitlab-ci.yml b/.gitlab/ci/build-images-amd64/.gitlab-ci.yml index 59a71e20a9762094f97fedc6e905a03a9dcfaa9e..98b714c1d79bc88ef7bdf225c3f25ba50c060720 100644 --- a/.gitlab/ci/build-images-amd64/.gitlab-ci.yml +++ b/.gitlab/ci/build-images-amd64/.gitlab-ci.yml @@ -2,7 +2,7 @@ build-images-amd64: stage: build only: refs: - - /^feature\//i + - /^\d+-/i - master variables: - $BUILD_JOBS == "true" diff --git a/.gitlab/ci/build-images-arm64v8/.gitlab-ci.yml b/.gitlab/ci/build-images-arm64v8/.gitlab-ci.yml index 527878a30e15552b8df0dabedd1f5c6f326485d9..2300a737aeff07b5c0f0ac1f20e91b9a9199fb36 100644 --- a/.gitlab/ci/build-images-arm64v8/.gitlab-ci.yml +++ b/.gitlab/ci/build-images-arm64v8/.gitlab-ci.yml @@ -2,7 +2,7 @@ build-images-arm64v8: stage: build only: refs: - - /^feature\//i + - /^\d+-/i - master variables: - $BUILD_JOBS == "true" diff --git a/.gitlab/ci/build-images-armv7/.gitlab-ci.yml b/.gitlab/ci/build-images-armv7/.gitlab-ci.yml index 44f61844a4da2650583da1c1621eb3dea9d46bf5..84510625d5e4ddd4b65287afd007830d24475748 100644 --- a/.gitlab/ci/build-images-armv7/.gitlab-ci.yml +++ b/.gitlab/ci/build-images-armv7/.gitlab-ci.yml @@ -4,7 +4,7 @@ build-images-armv7: - armv7 only: refs: - - /^feature\//i + - /^\d+-/i - master variables: - $BUILD_JOBS == "true" diff --git a/.gitlab/ci/build-images-i386/.gitlab-ci.yml b/.gitlab/ci/build-images-i386/.gitlab-ci.yml index da3ca208bd08cc3a30b046d82eb0468122f1747c..3b892804fa9ae568314350475a08875c6a0c611d 100644 --- a/.gitlab/ci/build-images-i386/.gitlab-ci.yml +++ b/.gitlab/ci/build-images-i386/.gitlab-ci.yml @@ -2,7 +2,7 @@ build-images-i386: stage: build only: refs: - - /^feature\//i + - /^\d+-/i - master variables: - $BUILD_JOBS == "true" diff --git a/.gitlab/ci/build-images-ppc64le/.gitlab-ci.yml b/.gitlab/ci/build-images-ppc64le/.gitlab-ci.yml index cecd6e7c8188558fd5905b8f747aba2a875b3fe7..dc1c3c1c6961134e5756611472ae401d78f50695 100644 --- a/.gitlab/ci/build-images-ppc64le/.gitlab-ci.yml +++ b/.gitlab/ci/build-images-ppc64le/.gitlab-ci.yml @@ -2,7 +2,7 @@ build-images-ppc64le: stage: build only: refs: - - /^feature\//i + - /^\d+-/i - master variables: - $BUILD_JOBS == "true" diff --git a/.gitlab/ci/check-for-new-versions/.gitlab-ci.yml b/.gitlab/ci/check-for-new-versions/.gitlab-ci.yml index 90d64c1a057add81d3fc41bfa14ef94b5da5f88b..5aaebec2e5722c86a1a1bc877d10be791ea03b5a 100644 --- a/.gitlab/ci/check-for-new-versions/.gitlab-ci.yml +++ b/.gitlab/ci/check-for-new-versions/.gitlab-ci.yml @@ -2,7 +2,7 @@ check-for-new-versions: stage: test only: refs: - - /^feature\//i + - /^\d+-/i - master variables: - $CHECK_FOR_NEW_VERSIONS == "true" diff --git a/.gitlab/ci/deploy-manifests/.gitlab-ci.yml b/.gitlab/ci/deploy-manifests/.gitlab-ci.yml index 773e8449ddb1b2274b43b4c884f8dc96ed25d82a..d5210c4ee180c6b9bc27292ebb3600e492606ea0 100644 --- a/.gitlab/ci/deploy-manifests/.gitlab-ci.yml +++ b/.gitlab/ci/deploy-manifests/.gitlab-ci.yml @@ -18,3 +18,26 @@ deploy-manifests: alias: docker script: - ./.gitlab/deploy-manifests.sh + +test-deploy-manifests: + stage: deploy + only: + refs: + - /^\d+-/i + variables: + - $BUILD_JOBS == "true" + variables: + # To build docker images + # https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#tls-disabled + DOCKER_HOST: tcp://docker:2375 + DOCKER_TLS_CERTDIR: "" + # Enable Docker CLI experimental features + DOCKER_CLI_EXPERIMENTAL: enabled + # Do not login to Docker Hub + DOCKER_HUB_PASSWORD: "" + services: + # Default Docker service to interact with the docker daemon + - name: docker:19.03.8-dind + alias: docker + script: + - ./.gitlab/deploy-manifests.sh \ No newline at end of file diff --git a/.gitlab/ci/init/.gitlab-ci.yml b/.gitlab/ci/init/.gitlab-ci.yml index b6624a83a252b2aaf5b059999d30bbc2ade0cd89..cc2a6371f2b6572d4bcb66b5eb1a2140c97126c1 100644 --- a/.gitlab/ci/init/.gitlab-ci.yml +++ b/.gitlab/ci/init/.gitlab-ci.yml @@ -8,7 +8,7 @@ init: DOCKER_CLI_EXPERIMENTAL: enabled only: refs: - - /^feature\//i + - /^\d+-/i - master variables: - $FIRST_RUN == "true" diff --git a/.gitlab/common.sh b/.gitlab/common.sh old mode 100644 new mode 100755 index d770f885eca02b67050dcbf9bf67538505314d76..14eb98039d681be0bf3f9db1b4bec7b74b19ec7e --- a/.gitlab/common.sh +++ b/.gitlab/common.sh @@ -1,7 +1,9 @@ #!/usr/bin/env bash if [ -z "${DOCKER_HUB_REPOSITORY}" ]; then - echo 'Set the "DOCKER_HUB_REPOSITORY" environment variable first. e.g. "/"' + echo 'Set the "DOCKER_HUB_REPOSITORY" environment variable first.' + echo 'E.g. if your docker hub repo is https://hub.docker.com/r/example/docker-image' + echo 'You will need to run `export DOCKER_HUB_REPOSITORY=example/docker-image`' exit 1 fi @@ -20,7 +22,7 @@ function login_to_docker_hub() function get_build_architectures() { - local docker_files=($(ls | grep .Dockerfile)) + local docker_files=($(ls os/${os}/${distro} | grep .Dockerfile)) local architectures="" for docker_file in ${docker_files[@]}; do @@ -30,6 +32,13 @@ function get_build_architectures() echo ${architectures} } +function get_distros() +{ + local distros=$(ls os/${os}) + + echo ${distros} +} + # Return the latest 20 versions on GitHub (versions older than v3.0.26 have build issues) function get_versions_from_github() { @@ -43,14 +52,15 @@ function get_versions_from_docker_hub() function build_image() { - architecture=${1} - aliyun_cli_version=${2} + local architecture=${1} + local distro=${2} + local aliyun_cli_version=${3} - echo "Building: ${architecture}:${aliyun_cli_version}" + echo "Building: ${architecture}-${distro}:${aliyun_cli_version}" # Deterministic variables - image_label="${DOCKER_HUB_REPOSITORY}:${aliyun_cli_version}" - architecture_image_label="${image_label}-${architecture}" + local image_label="${DOCKER_HUB_REPOSITORY}:${aliyun_cli_version}-${distro}" + local architecture_image_label="${image_label}-${architecture}" # Pull the image if it already exists docker pull "${architecture_image_label}" || true @@ -60,7 +70,7 @@ function build_image() --cache-from "${architecture_image_label}" \ --build-arg ALIYUN_CLI_VERSION=${aliyun_cli_version} \ -t "${architecture_image_label}" \ - -f "${architecture}.Dockerfile" \ + -f "os/${os}/${distro}/${architecture}.Dockerfile" \ . # Push the image @@ -69,20 +79,44 @@ function build_image() fi } +function build_manifests() +{ + local aliyun_cli_version=${1} + + # Build generic manifest + build_manifest ${aliyun_cli_version} + + local build_distros=($(get_distros)) + + # Build manifest for each distro + for build_distro in ${build_distros[@]}; do + build_manifest ${aliyun_cli_version} ${build_distro} + done +} + function build_manifest() { - aliyun_cli_version=${1} + local aliyun_cli_version=${1} + local build_distro=${2} + + local description="Building Manifest: ${aliyun_cli_version}" + if [ -n "${build_distro}" ]; then + description+="-${build_distro}" + fi - echo "Building Manifest: ${aliyun_cli_version}" + echo $description # Create the list of architecture images to be linked to the manifest - build_architectures=($(get_build_architectures)) + local build_architectures=($(get_build_architectures)) # Deterministic variables - image_label="${DOCKER_HUB_REPOSITORY}:${aliyun_cli_version}" - architecture_image_label="${image_label}-${architecture}" + local image_label="${DOCKER_HUB_REPOSITORY}:${aliyun_cli_version}" + # Append build distro + if [ -n "${build_distro}" ]; then + image_label+="-${build_distro}" + fi - architecture_image_labels="" + local architecture_image_labels="" for build_architecture in ${build_architectures[@]}; do architecture_image_labels+=" ${image_label}-${build_architecture}" done @@ -96,13 +130,13 @@ function build_manifest() function set_as_latest_version() { - aliyun_cli_version=${1} + local aliyun_cli_version=${1} - image_label="${DOCKER_HUB_REPOSITORY}:${aliyun_cli_version}" - latest_image_label="${DOCKER_HUB_REPOSITORY}:latest" + local image_label="${DOCKER_HUB_REPOSITORY}:${aliyun_cli_version}" + local latest_image_label="${DOCKER_HUB_REPOSITORY}:latest" - current_image_digest=$(docker manifest inspect ${image_label} | jq .manifests[0].digest) - current_latest_image_digest=$(docker manifest inspect ${latest_image_label} | jq .manifests[0].digest) + local current_image_digest=$(docker manifest inspect ${image_label} | jq .manifests[0].digest) + local current_latest_image_digest=$(docker manifest inspect ${latest_image_label} | jq .manifests[0].digest) # No need to create the 'latest' manifest # if the 'aliyun_cli_version' already matches 'latest' @@ -114,11 +148,11 @@ function set_as_latest_version() echo "Setting 'latest' Manifest: ${image_label}" # Create the list of architecture images to be linked to the manifest - build_architectures=($(get_build_architectures)) + local build_architectures=($(get_build_architectures)) - architecture_image_labels="" + local architecture_image_labels="" for build_architecture in ${build_architectures[@]}; do - architecture_image_labels+=" ${image_label}-${build_architecture}" + architecture_image_labels+=" ${image_label}-${distro}-${build_architecture}" done # Create and push the manifest file @@ -144,7 +178,9 @@ function trigger_build_jobs() # Defaults architecture=${1:-amd64} +distro=${2:-alpine} is_docker_hub_authenticated=false - +# For now the only supported OS is Linux +os="linux" # Login to Docker Hub login_to_docker_hub diff --git a/.gitlab/deploy-manifests.sh b/.gitlab/deploy-manifests.sh index 47f7b882fd0a5c1ee51f57e80b2c4dcaabbb205b..a8e24868d10be1753adc4671904265c6502667dd 100755 --- a/.gitlab/deploy-manifests.sh +++ b/.gitlab/deploy-manifests.sh @@ -36,7 +36,7 @@ for github_version in ${reverse_github_versions[@]}; do result=$? if [ $result = 1 ] || [ "${FORCE_MANIFEST_RECREATION}" = "true" ]; then - build_manifest "${docker_hub_version}" + build_manifests "${docker_hub_version}" fi ) done diff --git a/amd64.Dockerfile b/os/linux/alpine/amd64.Dockerfile similarity index 100% rename from amd64.Dockerfile rename to os/linux/alpine/amd64.Dockerfile diff --git a/arm64v8.Dockerfile b/os/linux/alpine/arm64v8.Dockerfile similarity index 100% rename from arm64v8.Dockerfile rename to os/linux/alpine/arm64v8.Dockerfile diff --git a/armv7.Dockerfile b/os/linux/alpine/armv7.Dockerfile similarity index 100% rename from armv7.Dockerfile rename to os/linux/alpine/armv7.Dockerfile diff --git a/i386.Dockerfile b/os/linux/alpine/i386.Dockerfile similarity index 100% rename from i386.Dockerfile rename to os/linux/alpine/i386.Dockerfile diff --git a/ppc64le.Dockerfile b/os/linux/alpine/ppc64le.Dockerfile similarity index 100% rename from ppc64le.Dockerfile rename to os/linux/alpine/ppc64le.Dockerfile diff --git a/os/linux/debian/amd64.Dockerfile b/os/linux/debian/amd64.Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..4d7f7558a41a493d0075d070236b29b77611fe23 --- /dev/null +++ b/os/linux/debian/amd64.Dockerfile @@ -0,0 +1,15 @@ +# Build Aliyun CLI +FROM library/golang:1.14.4-buster as builder + +# Default version to build is version 3.0.46 +ARG ALIYUN_CLI_VERSION=3.0.46 + +RUN apt-get update && apt-get install -y git jq build-essential && \ + git clone https://github.com/aliyun/aliyun-openapi-meta && \ + git clone https://github.com/aliyun/aliyun-cli.git && \ + cd aliyun-cli/ && git checkout tags/v${ALIYUN_CLI_VERSION} && \ + make deps && make build && cp out/aliyun /usr/local/bin/aliyun + +FROM library/debian:buster-slim +COPY --from=builder /usr/local/bin/aliyun /usr/local/bin/aliyun +ENTRYPOINT [ "/usr/local/bin/aliyun" ] diff --git a/os/linux/debian/arm64v8.Dockerfile b/os/linux/debian/arm64v8.Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..b448eafbe745ad31a66ea22543290d4103b9d6e2 --- /dev/null +++ b/os/linux/debian/arm64v8.Dockerfile @@ -0,0 +1,15 @@ +# Build Aliyun CLI +FROM arm64v8/golang:1.14.4-buster as builder + +# Default version to build is version 3.0.46 +ARG ALIYUN_CLI_VERSION=3.0.46 + +RUN apt-get update && apt-get install -y git jq build-essential && \ + git clone https://github.com/aliyun/aliyun-openapi-meta && \ + git clone https://github.com/aliyun/aliyun-cli.git && \ + cd aliyun-cli/ && git checkout tags/v${ALIYUN_CLI_VERSION} && \ + make deps && make build && cp out/aliyun /usr/local/bin/aliyun + +FROM arm64v8/debian:buster-slim +COPY --from=builder /usr/local/bin/aliyun /usr/local/bin/aliyun +ENTRYPOINT [ "/usr/local/bin/aliyun" ] diff --git a/os/linux/debian/armv7.Dockerfile b/os/linux/debian/armv7.Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..4d7f7558a41a493d0075d070236b29b77611fe23 --- /dev/null +++ b/os/linux/debian/armv7.Dockerfile @@ -0,0 +1,15 @@ +# Build Aliyun CLI +FROM library/golang:1.14.4-buster as builder + +# Default version to build is version 3.0.46 +ARG ALIYUN_CLI_VERSION=3.0.46 + +RUN apt-get update && apt-get install -y git jq build-essential && \ + git clone https://github.com/aliyun/aliyun-openapi-meta && \ + git clone https://github.com/aliyun/aliyun-cli.git && \ + cd aliyun-cli/ && git checkout tags/v${ALIYUN_CLI_VERSION} && \ + make deps && make build && cp out/aliyun /usr/local/bin/aliyun + +FROM library/debian:buster-slim +COPY --from=builder /usr/local/bin/aliyun /usr/local/bin/aliyun +ENTRYPOINT [ "/usr/local/bin/aliyun" ] diff --git a/os/linux/debian/i386.Dockerfile b/os/linux/debian/i386.Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..1500b834eb774deae7a8b8031b90cd809b404ddd --- /dev/null +++ b/os/linux/debian/i386.Dockerfile @@ -0,0 +1,15 @@ +# Build Aliyun CLI +FROM i386/golang:1.14.4-buster as builder + +# Default version to build is version 3.0.46 +ARG ALIYUN_CLI_VERSION=3.0.46 + +RUN apt-get update && apt-get install -y git jq build-essential && \ + git clone https://github.com/aliyun/aliyun-openapi-meta && \ + git clone https://github.com/aliyun/aliyun-cli.git && \ + cd aliyun-cli/ && git checkout tags/v${ALIYUN_CLI_VERSION} && \ + make deps && make build && cp out/aliyun /usr/local/bin/aliyun + +FROM i386/debian:buster-slim +COPY --from=builder /usr/local/bin/aliyun /usr/local/bin/aliyun +ENTRYPOINT [ "/usr/local/bin/aliyun" ] diff --git a/os/linux/debian/ppc64le.Dockerfile b/os/linux/debian/ppc64le.Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..296dda9a787d4006f2e1de30f243975b14b62912 --- /dev/null +++ b/os/linux/debian/ppc64le.Dockerfile @@ -0,0 +1,15 @@ +# Build Aliyun CLI +FROM ppc64le/golang:1.14.4-buster as builder + +# Default version to build is version 3.0.46 +ARG ALIYUN_CLI_VERSION=3.0.46 + +RUN apt-get update && apt-get install -y git jq build-essential && \ + git clone https://github.com/aliyun/aliyun-openapi-meta && \ + git clone https://github.com/aliyun/aliyun-cli.git && \ + cd aliyun-cli/ && git checkout tags/v${ALIYUN_CLI_VERSION} && \ + make deps && make build && cp out/aliyun /usr/local/bin/aliyun + +FROM ppc64le/debian:buster-slim +COPY --from=builder /usr/local/bin/aliyun /usr/local/bin/aliyun +ENTRYPOINT [ "/usr/local/bin/aliyun" ]