Push docker manifest in CI for multi arch image
This commit is contained in:
parent
d56381666a
commit
aee2599904
|
@ -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
|
||||||
|
|
|
@ -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 }}
|
||||||
|
|
|
@ -6,4 +6,5 @@ release/
|
||||||
release-static/
|
release-static/
|
||||||
release-packages/
|
release-packages/
|
||||||
release-gcp/
|
release-gcp/
|
||||||
|
release-images/
|
||||||
node_modules
|
node_modules
|
||||||
|
|
17
ci/README.md
17
ci/README.md
|
@ -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`
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 "$@"
|
|
||||||
}
|
|
|
@ -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 "$@"
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
17
ci/lib.sh
17
ci/lib.sh
|
@ -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}"
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 "$@"
|
||||||
|
|
|
@ -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 "$@"
|
|
|
@ -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 "$@"
|
|
@ -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 "$@"
|
|
|
@ -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 "$@"
|
|
@ -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": {
|
||||||
|
|
Loading…
Reference in New Issue