Skip to content

Commit

Permalink
Switch from Circle CI to GitHub Actions
Browse files Browse the repository at this point in the history
The testing docker image has been split up. Instead of having one image
with all supported versions of zsh installed, we now have a separate
image for each supported zsh version.

We use GitHub Action matrices to run jobs in parallel for all of the
supported versions.

We no longer need to publish images to Docker Hub. The images are just
built by CI (or developers) as needed from the Dockerfile in the repo.
  • Loading branch information
ericfreese committed May 27, 2023
1 parent fcca875 commit e0d48f1
Show file tree
Hide file tree
Showing 6 changed files with 78 additions and 45 deletions.
15 changes: 0 additions & 15 deletions .circleci/config.yml

This file was deleted.

54 changes: 54 additions & 0 deletions .github/workflows/integration.yml
@@ -0,0 +1,54 @@
on: [push, pull_request]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
IMAGE_CACHE_PATH: /tmp/.image-cache
IMAGE_CACHE_NAME: zsh-autosuggestions-test
jobs:
# Load the ZSH_VERSIONS file as a JSON array to use as a matrix
determine-versions:
runs-on: ubuntu-22.04
outputs:
versions: ${{ steps.set-versions.outputs.versions }}
steps:
- uses: actions/checkout@v3
- id: set-versions
run: |
echo "versions=$(
grep "^[^#]" ZSH_VERSIONS \
| sed -E 's/(^|$)/"/g' \
| paste -sd ',' - \
| sed -e 's/^/[/' -e 's/$/]/'
)" >> $GITHUB_OUTPUT
# Run the tests
test:
needs: determine-versions
runs-on: ubuntu-22.04
strategy:
matrix:
version: ${{ fromJson(needs.determine-versions.outputs.versions) }}
steps:
- uses: actions/checkout@v3
- name: Docker image cache
id: image-cache
uses: actions/cache@v3
with:
path: ${{ env.IMAGE_CACHE_PATH }}
key: image-cache-${{ matrix.version }}-${{ hashFiles('Dockerfile', 'install_test_zsh.sh', 'Gemfile.lock') }}
- name: Load cached docker image if available
if: ${{ steps.image-cache.outputs.cache-hit }}
run: gunzip < $IMAGE_CACHE_PATH/$IMAGE_CACHE_NAME.tar.gz | docker load
- name: Build the docker image if necessary
if: ${{ !steps.image-cache.outputs.cache-hit }}
run: |
docker build --build-arg TEST_ZSH_VERSION=${{ matrix.version }} -t $IMAGE_CACHE_NAME .
mkdir -p $IMAGE_CACHE_PATH
docker save $IMAGE_CACHE_NAME | gzip > $IMAGE_CACHE_PATH/$IMAGE_CACHE_NAME.tar.gz
- name: Run the tests
run: |
docker run --rm \
-v $PWD:/zsh-autosuggestions \
$IMAGE_CACHE_NAME \
make test
9 changes: 5 additions & 4 deletions Dockerfile
@@ -1,5 +1,8 @@
FROM ruby:2.5.3-alpine

ARG TEST_ZSH_VERSION
RUN : "${TEST_ZSH_VERSION:?}"

RUN apk add --no-cache autoconf
RUN apk add --no-cache libtool
RUN apk add --no-cache libcap-dev
Expand All @@ -11,10 +14,8 @@ RUN apk add --no-cache tmux

WORKDIR /zsh-autosuggestions

ADD ZSH_VERSIONS /zsh-autosuggestions/ZSH_VERSIONS
ADD install_test_zsh.sh /zsh-autosuggestions/install_test_zsh.sh
ADD install_test_zsh.sh ./
RUN ./install_test_zsh.sh

ADD Gemfile /zsh-autosuggestions/Gemfile
ADD Gemfile.lock /zsh-autosuggestions/Gemfile.lock
ADD Gemfile Gemfile.lock ./
RUN bundle install
10 changes: 5 additions & 5 deletions README.md
Expand Up @@ -170,18 +170,18 @@ Tests are written in ruby using the [`rspec`](http://rspec.info/) framework. The

Test files live in `spec/`. To run the tests, run `make test`. To run a specific test, run `TESTS=spec/some_spec.rb make test`. You can also specify a `zsh` binary to use by setting the `TEST_ZSH_BIN` environment variable (ex: `TEST_ZSH_BIN=/bin/zsh make test`).

A docker image for testing is available [on docker hub](https://hub.docker.com/r/ericfreese/zsh-autosuggestions-test). It comes with ruby, the bundler dependencies, and all supported versions of zsh installed.
You can also run the tests for any supported version of zsh in a Docker image by building an image from the provided Dockerfile.

Pull the docker image with:
To build the docker image for a specific version of zsh (where `<version>` below is substituted with the contents of a line from the [`ZSH_VERSIONS`](ZSH_VERSIONS) file):

```sh
docker pull ericfreese/zsh-autosuggestions-test
docker build --build-arg TEST_ZSH_VERSION=<version> -t zsh-autosuggestions-test .
```

To run the tests for a specific version of zsh (where `<version>` below is substituted with the contents of a line from the [`ZSH_VERSIONS`](ZSH_VERSIONS) file):
After building the image, run the tests via:

```sh
docker run -it -e TEST_ZSH_BIN=zsh-<version> -v $PWD:/zsh-autosuggestions zsh-autosuggestions-test make test
docker run -it -v $PWD:/zsh-autosuggestions zsh-autosuggestions-test make test
```


Expand Down
4 changes: 0 additions & 4 deletions ZSH_VERSIONS
@@ -1,9 +1,5 @@
# Zsh releases to run tests against
# See https://github.com/zsh-users/zsh/releases
#
# When modifying this file, rebuild and push docker image:
# $ docker build -t ericfreese/zsh-autosuggestions-test .
# $ docker push ericfreese/zsh-autosuggestions-test
4.3.11
5.0.2
5.0.8
Expand Down
31 changes: 14 additions & 17 deletions install_test_zsh.sh
Expand Up @@ -2,25 +2,22 @@

set -ex

for v in $(grep "^[^#]" ZSH_VERSIONS); do
mkdir zsh-$v
cd zsh-$v
mkdir zsh-build
cd zsh-build

curl -L https://api.github.com/repos/zsh-users/zsh/tarball/zsh-$v | tar xz --strip=1
curl -L https://api.github.com/repos/zsh-users/zsh/tarball/zsh-$TEST_ZSH_VERSION | tar xz --strip=1

./Util/preconfig
./configure --enable-pcre \
--enable-cap \
--enable-multibyte \
--with-term-lib='ncursesw tinfo' \
--with-tcsetpgrp \
--program-suffix="-$v"
./Util/preconfig
./configure --enable-pcre \
--enable-cap \
--enable-multibyte \
--with-term-lib='ncursesw tinfo' \
--with-tcsetpgrp

make install.bin
make install.modules
make install.fns
make install.bin
make install.modules
make install.fns

cd ..
cd ..

rm -rf zsh-$v
done
rm -rf zsh-build

0 comments on commit e0d48f1

Please sign in to comment.