Skip to content

Commit b706e85

Browse files
authored
Merge pull request #1611 from cdr/ci
Automate release process
2 parents 4590c3a + 7c7f62d commit b706e85

File tree

13 files changed

+160
-34
lines changed

13 files changed

+160
-34
lines changed

.github/workflows/ci.yaml

+2-1
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ jobs:
8181
- run: ./ci/steps/release-static.sh
8282
env:
8383
# Otherwise we get rate limited when fetching the ripgrep binary.
84-
GITHUB_TOKEN: ${{ secrets.github_token }}
84+
# For whatever reason only MacOS needs it.
85+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
8586
- name: Upload release artifacts
8687
uses: actions/upload-artifact@v2
8788
with:

.github/workflows/publish.yaml

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
name: publish
2+
3+
on:
4+
release:
5+
types: [published]
6+
7+
jobs:
8+
npm:
9+
runs-on: ubuntu-latest
10+
steps:
11+
- uses: actions/checkout@v1
12+
- name: Run ./ci/steps/publish-npm.sh
13+
uses: ./ci/container
14+
with:
15+
args: ./ci/steps/publish-npm.sh
16+
env:
17+
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
18+
19+
docker-amd64:
20+
runs-on: ubuntu-latest
21+
steps:
22+
- uses: actions/checkout@v1
23+
- name: Run ./ci/steps/publish-docker.sh
24+
uses: ./ci/container
25+
with:
26+
args: ./ci/steps/publish-docker.sh
27+
env:
28+
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
29+
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
30+
31+
docker-arm64:
32+
runs-on: ubuntu-arm64-latest
33+
steps:
34+
- uses: actions/checkout@v1
35+
- name: Run ./ci/steps/publish-docker.sh
36+
uses: ./ci/container
37+
with:
38+
args: ./ci/steps/publish-docker.sh
39+
env:
40+
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
41+
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}

ci/README.md

+28-14
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,17 @@ Any file and directory added into this tree should be documented here.
88

99
## Publishing a release
1010

11-
1. Change the version of code-server in `package.json` and push this commit.
12-
1. CI will run and generate an NPM package and release packages that you can download
13-
as artifacts on Github Actions.
14-
1. Create a new draft release with the built release packages.
15-
1. Run some basic sanity tests on one of the released packages.
16-
1. Publish.
17-
1. Download the built npm package and publish it.
18-
1. Place the debian releases into `./release-packages` and then push the docker
19-
image with `./ci/release-container/push.sh`.
20-
1. This will need to be ran on an ARM64 instance as well.
21-
1. At some point we need to automate this.
11+
1. Update the version of code-server in `package.json` and push a commit
12+
1. CI will run and generate the `npm-package` and `release-packages` artifacts on the GH actions workflow
13+
1. Create a new draft release and attach all files in `release-packages`
14+
1. Run some basic sanity tests on one of the released packages
15+
1. Summarize the major changes in the release notes and link to the relevant issues.
16+
1. Make sure to mention the VS Code version in the release notes
17+
1. Publish the release
18+
1. CI will automatically grab the artifacts and then
19+
1. Publish the NPM package
20+
1. Publish the AMD64 docker image
21+
1. Publish the ARM64 docker image
2222

2323
## dev
2424

@@ -65,9 +65,9 @@ You can disable minification by setting `MINIFY=`.
6565
- Useful to do a clean build.
6666
- [./build/code-server.sh](./build/code-server.sh)
6767
- Copied into static releases to run code-server with the bundled node binary.
68-
- [./build/test-release.sh](./build/test-static-release.sh)
68+
- [./build/test-static-release.sh](./build/test-static-release.sh) (`yarn test:static-release`)
6969
- Ensures code-server in the `./release-static` directory runs
70-
- [./build/build-packages.sh](./build/build-static-pkgs.sh) (`yarn package`)
70+
- [./build/build-packages.sh](./build/build-packages.sh) (`yarn package`)
7171
- Packages `./release-static` into an archive in `./release-packages`
7272
- If on linux, [nfpm](https://github.com/goreleaser/nfpm) is used to generate .deb and .rpm
7373
- [./build/nfpm.yaml](./build/nfpm.yaml)
@@ -79,14 +79,20 @@ You can disable minification by setting `MINIFY=`.
7979

8080
This directory contains the release docker container.
8181

82+
- [./release-container/build.sh](./release-container/build.sh)
83+
- Builds the release container
84+
- Assumes debian releases are ready in `./release-packages`
85+
- [./release-container/push.sh](./release-container/push.sh)
86+
- Pushes the built release container to docker hub and updates the latest tag
87+
8288
## container
8389

8490
This directory contains the container for CI.
8591

8692
## steps
8793

8894
This directory contains a few scripts used in CI.
89-
Just helps avoid clobbering .travis.yml.
95+
Just helps avoid clobbering the CI configuration.
9096

9197
- [./steps/test.sh](./steps/test.sh)
9298
- Runs `yarn ci` after ensuring VS Code is patched
@@ -95,3 +101,11 @@ Just helps avoid clobbering .travis.yml.
95101
- Generates the npm package at `./release`
96102
- [./steps/static-release.sh](./steps/static-release.sh)
97103
- Takes the output of the previous script and generates a static release and packages
104+
- [./steps/lib.sh](./steps/lib.sh)
105+
- Contains helpers to download artifacts from github actions workflow runs
106+
- [./steps/publish-npm.sh](./steps/publish-npm.sh)
107+
- Grabs the `npm-package` release artifact for the current commit and publishes it on NPM
108+
- [./steps/publish-docker.sh](./steps/publish-docker.sh)
109+
- Grabs the `release-packages` release artifact for the current commit and
110+
builds a docker image with it and publishes that onto docker hub with the
111+
correct tag and updates latest

ci/container/Dockerfile

+4-4
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ RUN apt-get update
66
RUN apt-get install -y curl gnupg
77

88
# Installs node.
9-
RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - && \
9+
RUN curl -sSL https://deb.nodesource.com/setup_14.x | bash - && \
1010
apt-get install -y nodejs
1111

1212
# Installs yarn.
13-
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
13+
RUN curl -sSL https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
1414
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
1515
apt-get update && apt-get install -y yarn
1616

@@ -27,14 +27,14 @@ RUN apt-get install -y gettext-base
2727
RUN apt-get install -y jq git rsync
2828

2929
# Installs shellcheck.
30-
RUN curl -L https://github.com/koalaman/shellcheck/releases/download/v0.7.1/shellcheck-v0.7.1.linux.$(uname -m).tar.xz | \
30+
RUN curl -sSL https://github.com/koalaman/shellcheck/releases/download/v0.7.1/shellcheck-v0.7.1.linux.$(uname -m).tar.xz | \
3131
tar -xJ && \
3232
mv shellcheck*/shellcheck /usr/local/bin && \
3333
rm -R shellcheck*
3434

3535
# Install Go dependencies
3636
RUN ARCH="$(dpkg --print-architecture)" && \
37-
curl "https://dl.google.com/go/go1.14.2.linux-$ARCH.tar.gz" | tar -C /usr/local -xz
37+
curl -sSL "https://dl.google.com/go/go1.14.2.linux-$ARCH.tar.gz" | tar -C /usr/local -xz
3838
ENV PATH=/usr/local/go/bin:/root/go/bin:$PATH
3939
ENV GO111MODULE=on
4040
RUN go get mvdan.cc/sh/v3/cmd/shfmt

ci/release-container/Dockerfile

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,14 @@ RUN adduser --gecos '' --disabled-password coder && \
2828
echo "coder ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/nopasswd
2929

3030
RUN ARCH="$(dpkg --print-architecture)" && \
31-
curl -L "https://github.com/boxboat/fixuid/releases/download/v0.4.1/fixuid-0.4.1-linux-$ARCH.tar.gz" | tar -C /usr/local/bin -xzf - && \
31+
curl -sSL "https://github.com/boxboat/fixuid/releases/download/v0.4.1/fixuid-0.4.1-linux-$ARCH.tar.gz" | tar -C /usr/local/bin -xzf - && \
3232
chown root:root /usr/local/bin/fixuid && \
3333
chmod 4755 /usr/local/bin/fixuid && \
3434
mkdir -p /etc/fixuid && \
3535
printf "user: coder\ngroup: coder\n" > /etc/fixuid/config.yml
3636

3737
COPY release-packages/code-server*.deb /tmp/
38-
RUN dpkg -i /tmp/code-server*.deb && rm /tmp/code-server*.deb
38+
RUN dpkg -i /tmp/code-server*-$(dpkg --print-architecture).deb && rm /tmp/code-server*.deb
3939

4040
EXPOSE 8080
4141
USER coder

ci/release-container/build.sh

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
main() {
5+
cd "$(dirname "$0")/../.."
6+
source ./ci/lib.sh
7+
VERSION="$(pkg_json_version)"
8+
9+
imageTag="codercom/code-server:$VERSION"
10+
11+
docker build -t "$imageTag" -f ./ci/release-container/Dockerfile .
12+
}
13+
14+
main "$@"

ci/release-container/push.sh

+2-11
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,16 @@
11
#!/usr/bin/env bash
2-
32
set -euo pipefail
43

54
main() {
65
cd "$(dirname "$0")/../.."
76
source ./ci/lib.sh
87
VERSION="$(pkg_json_version)"
98

10-
if [[ ${CI-} ]]; then
11-
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
12-
fi
13-
149
imageTag="codercom/code-server:$VERSION"
15-
if [[ $(arch) == "arm64" ]]; then
16-
imageTag+="-arm64"
17-
fi
1810

19-
docker build \
20-
-t "$imageTag" \
21-
-f ./ci/release-container/Dockerfile .
2211
docker push "$imageTag"
12+
docker tag "$imageTag" codercom/code-server:latest
13+
docker push codercom/code-server:latest
2314
}
2415

2516
main "$@"

ci/steps/lib.sh

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#!/usr/bin/env bash
2+
source ./ci/lib.sh
3+
4+
# Grabs the most recent ci.yaml github workflow run that was successful and triggered from the same commit being pushd.
5+
# This will contain the artifacts we want.
6+
# https://developer.github.com/v3/actions/workflow-runs/#list-workflow-runs
7+
get_artifacts_url() {
8+
curl -sSL 'https://api.github.com/repos/cdr/code-server/actions/workflows/ci.yaml/runs?status=success&event=push' | jq -r ".workflow_runs[] | select(.head_sha == \"$(git rev-parse HEAD)\") | .artifacts_url" | head -n 1
9+
}
10+
11+
# Grabs the artifact's download url.
12+
# https://developer.github.com/v3/actions/artifacts/#list-workflow-run-artifacts
13+
get_artifact_url() {
14+
local artifact_name="$1"
15+
curl -sSL "$(get_artifacts_url)" | jq -r ".artifacts[] | select(.name == \"$artifact_name\") | .archive_download_url" | head -n 1
16+
}
17+
18+
# Uses the above two functions to download a artifact into a directory.
19+
download_artifact() {
20+
local artifact_name="$1"
21+
local dst="$2"
22+
23+
local tmp_file
24+
tmp_file="$(mktemp)"
25+
26+
curl -sSL "$(get_artifact_url "$artifact_name")" > "$tmp_file"
27+
unzip -o "$tmp_file" -d "$dst"
28+
rm "$tmp_file"
29+
}

ci/steps/publish-docker.sh

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
main() {
5+
cd "$(dirname "$0")/../.."
6+
source ./ci/steps/lib.sh
7+
8+
if [[ ${CI-} ]]; then
9+
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
10+
fi
11+
12+
download_artifact release-packages ./release-packages
13+
./ci/release-container/build.sh
14+
./ci/release-container/push.sh
15+
}
16+
17+
main "$@"

ci/steps/publish-npm.sh

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
main() {
5+
cd "$(dirname "$0")/../.."
6+
source ./ci/steps/lib.sh
7+
8+
if [[ ${CI-} ]]; then
9+
echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" > ~/.npmrc
10+
fi
11+
12+
download_artifact npm-package ./release
13+
yarn publish --non-interactive release
14+
}
15+
16+
main "$@"

ci/steps/release-static.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ main() {
55
cd "$(dirname "$0")/../.."
66

77
yarn release:static
8-
./ci/build/test-static-release.sh
8+
yarn test:static-release
99
yarn package
1010
}
1111

doc/CONTRIBUTING.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,7 @@ yarn vscode
4141
yarn build
4242
yarn build:vscode
4343
yarn release
44-
node ./release # Run the built JavaScript with Node.
44+
cd release
45+
yarn --production
46+
node . # Run the built JavaScript with Node.
4547
```

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
"build:vscode": "./ci/build/build-vscode.sh",
1818
"release": "./ci/build/build-release.sh",
1919
"release:static": "./ci/build/build-static-release.sh",
20+
"test:static-release": "./ci/build/test-static-release.sh",
2021
"package": "./ci/build/build-packages.sh",
2122
"_____": "",
2223
"fmt": "./ci/dev/fmt.sh",

0 commit comments

Comments
 (0)