Push docker manifest in CI for multi arch image

This commit is contained in:
Anmol Sethi 2020-05-16 10:55:46 -04:00
parent d56381666a
commit aee2599904
No known key found for this signature in database
GPG Key ID: 8CEF1878FF10ADEB
19 changed files with 143 additions and 100 deletions

View File

@ -106,3 +106,43 @@ jobs:
with: with:
name: release-packages name: release-packages
path: ./release-packages path: ./release-packages
docker-amd64:
runs-on: ubuntu-latest
needs: linux-amd64
steps:
- uses: actions/checkout@v1
- name: Download release package
uses: actions/download-artifact@v2
with:
name: release-packages
path: ./release-packages
- name: Run ./ci/steps/build-docker-image.sh
uses: ./ci/container
with:
args: ./ci/steps/build-docker-image.sh
- name: Upload release image
uses: actions/upload-artifact@v2
with:
name: release-images
path: ./release-images
docker-arm64:
runs-on: ubuntu-arm64-latest
needs: linux-arm64
steps:
- uses: actions/checkout@v1
- name: Download release package
uses: actions/download-artifact@v2
with:
name: release-packages
path: ./release-packages
- name: Run ./ci/steps/build-docker-image.sh
uses: ./ci/container
with:
args: ./ci/steps/build-docker-image.sh
- name: Upload release image
uses: actions/upload-artifact@v2
with:
name: release-images
path: ./release-images

View File

@ -14,28 +14,18 @@ jobs:
with: with:
args: ./ci/steps/publish-npm.sh args: ./ci/steps/publish-npm.sh
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
docker-amd64: docker:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v1 - uses: actions/checkout@v1
- name: Run ./ci/steps/publish-docker.sh - name: Run ./ci/steps/push-docker-manifest.sh
uses: ./ci/container uses: ./ci/container
with: with:
args: ./ci/steps/publish-docker.sh args: ./ci/steps/push-docker-manifest.sh
env:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
docker-arm64:
runs-on: ubuntu-arm64-latest
steps:
- uses: actions/checkout@v1
- name: Run ./ci/steps/publish-docker.sh
uses: ./ci/container
with:
args: ./ci/steps/publish-docker.sh
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}

1
.gitignore vendored
View File

@ -6,4 +6,5 @@ release/
release-static/ release-static/
release-packages/ release-packages/
release-gcp/ release-gcp/
release-images/
node_modules node_modules

View File

@ -21,8 +21,7 @@ Make sure you have `$GITHUB_TOKEN` set and [hub](https://github.com/github/hub)
7. Publish the release 7. Publish the release
1. CI will automatically grab the artifacts and then 1. CI will automatically grab the artifacts and then
1. Publish the NPM package 1. Publish the NPM package
2. Publish the AMD64 docker image 2. Publish the Docker Hub image
3. Publish the ARM64 docker image
8. Update the homebrew and AUR packages 8. Update the homebrew and AUR packages
## dev ## dev
@ -100,10 +99,8 @@ You can disable minification by setting `MINIFY=`.
This directory contains the release docker container. This directory contains the release docker container.
- [./release-container/build.sh](./release-container/build.sh) - [./release-container/build.sh](./release-container/build.sh)
- Builds the release container - Builds the release container with the tag `codercom/code-server:$VERSION-$ARCH`
- Assumes debian releases are ready in `./release-packages` - Assumes debian releases are ready in `./release-packages`
- [./release-container/push.sh](./release-container/push.sh)
- Pushes the built release container to docker hub and updates the latest tag
## container ## container
@ -129,7 +126,9 @@ Just helps avoid clobbering the CI configuration.
- Contains helpers to download artifacts from github actions workflow runs - Contains helpers to download artifacts from github actions workflow runs
- [./steps/publish-npm.sh](./steps/publish-npm.sh) - [./steps/publish-npm.sh](./steps/publish-npm.sh)
- Grabs the `npm-package` release artifact for the current commit and publishes it on NPM - Grabs the `npm-package` release artifact for the current commit and publishes it on NPM
- [./steps/publish-docker.sh](./steps/publish-docker.sh) - [./steps/build-docker-image.sh](./steps/build-docker-image.sh)
- Grabs the `release-packages` release artifact for the current commit and - Builds the docker image and then saves it into `./release-images/$ARCH.tar`
builds a docker image with it and publishes that onto docker hub with the - [./steps/push-docker-manifest.sh](./steps/push-docker-manifest.sh)
correct tag and updates latest - Loads all images in `./release-images` and then builds and pushes a multi architecture
docker manifest for the amd64 and arm64 images to `codercom/code-server:$VERSION` and
`codercom/code-server:latest`

View File

@ -8,25 +8,16 @@ main() {
cd "$(dirname "${0}")/../.." cd "$(dirname "${0}")/../.."
source ./ci/lib.sh source ./ci/lib.sh
export VERSION local release_name="code-server-$VERSION-$OS-$ARCH"
VERSION="$(pkg_json_version)"
local OS
OS="$(os)"
export ARCH
ARCH="$(arch)"
local archive_name="code-server-$VERSION-$OS-$ARCH"
mkdir -p release-packages mkdir -p release-packages
if [[ $OS == "linux" ]]; then if [[ $OS == "linux" ]]; then
tar -czf "release-packages/$archive_name.tar.gz" --transform "s/^\.\/release-static/$archive_name/" ./release-static tar -czf "release-packages/$release_name.tar.gz" --transform "s/^\.\/release-static/$release_name/" ./release-static
else else
tar -czf "release-packages/$archive_name.tar.gz" -s "/^release-static/$archive_name/" release-static tar -czf "release-packages/$release_name.tar.gz" -s "/^release-static/$release_name/" release-static
fi fi
echo "done (release-packages/$archive_name)" echo "done (release-packages/$release_name)"
release_gcp release_gcp
@ -37,9 +28,9 @@ main() {
release_gcp() { release_gcp() {
mkdir -p "release-gcp/$VERSION" mkdir -p "release-gcp/$VERSION"
cp "release-packages/$archive_name.tar.gz" "./release-gcp/$VERSION/$OS-$ARCH.tar.gz" cp "release-packages/$release_name.tar.gz" "./release-gcp/$VERSION/$OS-$ARCH.tar.gz"
mkdir -p "release-gcp/latest" mkdir -p "release-gcp/latest"
cp "./release-packages/$archive_name.tar.gz" "./release-gcp/latest/$OS-$ARCH.tar.gz" cp "./release-packages/$release_name.tar.gz" "./release-gcp/latest/$OS-$ARCH.tar.gz"
} }
# Generates deb and rpm packages. # Generates deb and rpm packages.

View File

@ -8,7 +8,7 @@ MINIFY="${MINIFY-true}"
main() { main() {
cd "$(dirname "${0}")/../.." cd "$(dirname "${0}")/../.."
source ./ci/build/lib.sh source ./ci/lib.sh
VSCODE_SRC_PATH="lib/vscode" VSCODE_SRC_PATH="lib/vscode"
VSCODE_OUT_PATH="$RELEASE_PATH/lib/vscode" VSCODE_OUT_PATH="$RELEASE_PATH/lib/vscode"

View File

@ -3,7 +3,7 @@ set -euo pipefail
main() { main() {
cd "$(dirname "${0}")/../.." cd "$(dirname "${0}")/../.."
source ./ci/build/lib.sh source ./ci/lib.sh
rsync "$RELEASE_PATH/" "$RELEASE_PATH-static" rsync "$RELEASE_PATH/" "$RELEASE_PATH-static"
RELEASE_PATH+=-static RELEASE_PATH+=-static

View File

@ -1,10 +0,0 @@
#!/usr/bin/env bash
source ./ci/lib.sh
# RELEASE_PATH is the destination directory for the release from the root.
# Defaults to release
RELEASE_PATH="${RELEASE_PATH-release}"
rsync() {
command rsync -a --del "$@"
}

View File

@ -15,7 +15,7 @@ main() {
for i in "${!assets[@]}"; do for i in "${!assets[@]}"; do
assets[$i]="--attach=${assets[$i]}" assets[$i]="--attach=${assets[$i]}"
done done
EDITOR=true hub release edit --draft "${assets[@]}" "v$(pkg_json_version)" EDITOR=true hub release edit --draft "${assets[@]}" "v$VERSION"
} }
main "$@" main "$@"

View File

@ -9,8 +9,8 @@ main() {
hub release create \ hub release create \
--file - \ --file - \
--draft "${assets[@]}" "v$(pkg_json_version)" << EOF --draft "${assets[@]}" "v$VERSION" << EOF
v$(pkg_json_version) v$VERSION
VS Code v$(vscode_version) VS Code v$(vscode_version)

View File

@ -34,8 +34,10 @@ RUN curl -sSL https://github.com/koalaman/shellcheck/releases/download/v0.7.1/sh
# Install Go dependencies # Install Go dependencies
RUN ARCH="$(dpkg --print-architecture)" && \ RUN ARCH="$(dpkg --print-architecture)" && \
curl -sSL "https://dl.google.com/go/go1.14.2.linux-$ARCH.tar.gz" | tar -C /usr/local -xz curl -sSL "https://dl.google.com/go/go1.14.3.linux-$ARCH.tar.gz" | tar -C /usr/local -xz
ENV PATH=/usr/local/go/bin:/root/go/bin:$PATH ENV PATH=/usr/local/go/bin:/root/go/bin:$PATH
ENV GO111MODULE=on ENV GO111MODULE=on
RUN go get mvdan.cc/sh/v3/cmd/shfmt RUN go get mvdan.cc/sh/v3/cmd/shfmt
RUN go get github.com/goreleaser/nfpm/cmd/nfpm RUN go get github.com/goreleaser/nfpm/cmd/nfpm
RUN curl -fsSL https://get.docker.com | sh

View File

@ -75,6 +75,21 @@ download_artifact() {
tmp_file="$(mktemp)" tmp_file="$(mktemp)"
curl -sSL "$(get_artifact_url "$artifact_name")" > "$tmp_file" curl -sSL "$(get_artifact_url "$artifact_name")" > "$tmp_file"
unzip -o "$tmp_file" -d "$dst" unzip -q -o "$tmp_file" -d "$dst"
rm "$tmp_file" rm "$tmp_file"
} }
rsync() {
command rsync -a --del "$@"
}
VERSION="$(pkg_json_version)"
export VERSION
ARCH="$(arch)"
export ARCH
OS=$(os)
export OS
# RELEASE_PATH is the destination directory for the release from the root.
# Defaults to release
RELEASE_PATH="${RELEASE_PATH-release}"

View File

@ -35,7 +35,7 @@ RUN ARCH="$(dpkg --print-architecture)" && \
printf "user: coder\ngroup: coder\n" > /etc/fixuid/config.yml printf "user: coder\ngroup: coder\n" > /etc/fixuid/config.yml
COPY release-packages/code-server*.deb /tmp/ COPY release-packages/code-server*.deb /tmp/
RUN dpkg -i /tmp/code-server*-$(dpkg --print-architecture).deb && rm /tmp/code-server*.deb RUN dpkg -i /tmp/code-server*$(dpkg --print-architecture).deb && rm /tmp/code-server*.deb
EXPOSE 8080 EXPOSE 8080
USER coder USER coder

View File

@ -4,11 +4,8 @@ set -euo pipefail
main() { main() {
cd "$(dirname "$0")/../.." cd "$(dirname "$0")/../.."
source ./ci/lib.sh source ./ci/lib.sh
VERSION="$(pkg_json_version)"
imageTag="codercom/code-server:$VERSION" docker build -t "codercom/code-server-$ARCH:$VERSION" -f ./ci/release-container/Dockerfile .
docker build -t "$imageTag" -f ./ci/release-container/Dockerfile .
} }
main "$@" main "$@"

View File

@ -1,16 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
main() {
cd "$(dirname "$0")/../.."
source ./ci/lib.sh
VERSION="$(pkg_json_version)"
imageTag="codercom/code-server:$VERSION"
docker push "$imageTag"
docker tag "$imageTag" codercom/code-server:latest
docker push codercom/code-server:latest
}
main "$@"

14
ci/steps/build-docker-image.sh Executable file
View File

@ -0,0 +1,14 @@
#!/usr/bin/env bash
set -euo pipefail
main() {
cd "$(dirname "$0")/../.."
source ./ci/lib.sh
./ci/release-container/build.sh
mkdir -p release-images
docker save "codercom/code-server-$ARCH:$VERSION" > "release-images/code-server-$ARCH:$VERSION.tar"
}
main "$@"

View File

@ -1,17 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
main() {
cd "$(dirname "$0")/../.."
source ./ci/lib.sh
if [[ ${CI-} ]]; then
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
fi
download_artifact release-packages ./release-packages
./ci/release-container/build.sh
./ci/release-container/push.sh
}
main "$@"

View File

@ -0,0 +1,37 @@
#!/usr/bin/env bash
set -euo pipefail
main() {
cd "$(dirname "$0")/../.."
source ./ci/lib.sh
download_artifact release-images ./release-images
if [[ ${CI-} ]]; then
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
fi
for img in ./release-images/*; do
docker load -i "$img"
done
# We have to ensure the amd64 and arm64 images exist on the remote registry
# in order to build the manifest.
# We don't put the arch in the tag to avoid polluting the main repository.
# These other repositories are private so they don't pollute our organization namespace.
docker push "codercom/code-server-amd64:$VERSION"
docker push "codercom/code-server-arm64:$VERSION"
export DOCKER_CLI_EXPERIMENTAL=enabled
docker manifest create "codercom/code-server:$VERSION" \
"codercom/code-server-amd64:$VERSION" \
"codercom/code-server-arm64:$VERSION"
docker manifest push --purge "codercom/code-server:$VERSION"
docker manifest create "codercom/code-server:latest" \
"codercom/code-server-amd64:$VERSION" \
"codercom/code-server-arm64:$VERSION"
docker manifest push --purge "codercom/code-server:latest"
}
main "$@"

View File

@ -1,7 +1,7 @@
{ {
"name": "code-server", "name": "code-server",
"license": "MIT", "license": "MIT",
"version": "3.3.0", "version": "3.3.0-rc.28",
"description": "Run VS Code on a remote server.", "description": "Run VS Code on a remote server.",
"homepage": "https://github.com/cdr/code-server", "homepage": "https://github.com/cdr/code-server",
"bugs": { "bugs": {