simonw / datasette

An open source multi-tool for exploring and publishing data
https://datasette.io
Apache License 2.0
9.59k stars 691 forks source link

Move CI to GitHub Issues #940

Closed simonw closed 4 years ago

simonw commented 4 years ago

It looks like the tests take 3m33s to run in GitHub Actions, but they're taking more than 8 minutes in Travis

simonw commented 4 years ago

I need to figure out how to build and push the Docker image on releases. Here's the Travis code for that: https://github.com/simonw/datasette/blob/52eabb019d4051084b21524bd0fd9c2731126985/.travis.yml#L38-L47

simonw commented 4 years ago

I'd like to set these up as different workflows that depend on each other, if that's possible.

I want to start three test runs in parallel (on three different Python versions), then if all three pass kick off the PyPI push (without running more tests), then if that passes do the Docker build and push.

simonw commented 4 years ago

https://docs.github.com/en/actions/getting-started-with-github-actions/core-concepts-for-github-actions#job

A set of steps that execute on the same runner. You can define the dependency rules for how jobs run in a workflow file. Jobs can run at the same time in parallel or run sequentially depending on the status of a previous job. For example, a workflow can have two sequential jobs that build and test code, where the test job is dependent on the status of the build job. If the build job fails, the test job will not run.

simonw commented 4 years ago

When I figure this out I'll update the https://github.com/simonw/datasette-plugin/blob/main/datasette-%7B%7Bcookiecutter.hyphenated%7D%7D/.github/workflows/publish.yml default workflow to do this - right now it runs the tests once on just a single version of Python as part of the package deploy to PyPI step.

simonw commented 4 years ago

This example of jobs depending on each other and sharing data via artifacts looks relevant: https://docs.github.com/en/actions/configuring-and-managing-workflows/persisting-workflow-data-using-artifacts#passing-data-between-jobs-in-a-workflow

simonw commented 4 years ago

I think ${GITHUB_REF#refs/tags/} is the equivalent of $TRAVIS_TAG.

simonw commented 4 years ago

I think this is ready. I'll only know for sure the first time I push a release through it though!

simonw commented 4 years ago

I'll close this after the next release successfully goes out.

simonw commented 4 years ago

I tested this new publish pattern (running the tests in parallel before the deploy step) on github-to-sqlite - skipping the Docker step - and it worked: https://github.com/dogsheep/github-to-sqlite/actions/runs/213809864

simonw commented 4 years ago

Package deploys are still broken, just got this error trying to ship 0.49a1: https://github.com/simonw/datasette/actions/runs/253099665

The workflow is not valid. .github/workflows/publish.yml (Line: 61, Col: 9): Unexpected symbol: '"a"'. Located at position 24 within expression: !(contains(github.ref, "a") || contains(github.ref, "b"))

simonw commented 4 years ago

This bit here: https://github.com/simonw/datasette/blob/c18117cf08ad67c704dab29e3cb3b88f1de4026b/.github/workflows/publish.yml#L58-L62

simonw commented 4 years ago

I think those should be single quoted.

simonw commented 4 years ago

That worked: https://github.com/simonw/datasette/runs/1110040212?check_suite_focus=true ran and deployed https://pypi.org/project/datasette/0.49a1/ to PyPI but it skipped the push to Docker step because there was an "a" in the tag.

simonw commented 4 years ago

Just release Datasette 0.49 - which shipped to PyPI just fine but skipped the Docker step for some reason!

https://github.com/simonw/datasette/runs/1114585275?check_suite_focus=true

Release_0_49_·_simonw_datasette_c024952
simonw commented 4 years ago

I bet that's because the github.ref actually looks like this:

${GITHUB_REF#refs/tags/}

And the refs/tags/ part has an a in it.

simonw commented 4 years ago

So now I've released Datasette 0.49 but failed to push a new Docker image. This is bad, and I need to fix it.

I'd like to push to Docker from GitHub Actions, so I think I'm going to create a one-off workflow task for doing that.

simonw commented 4 years ago

Using https://github.com/marketplace/actions/debugging-with-tmate to manually submit a new build from within an interactive GitHub Actions session.

simonw commented 4 years ago

I'm going to switch to using this logic to decide if I should ship to Docker: https://github.community/t/release-prerelease-action-triggers/17275/2

if: "!github.event.release.prerelease"
simonw commented 4 years ago

I shipped the Docker build manually by running the following in a tmate session:

docker login
# Typed my username and password interactively
export REPO=datasetteproject/datasette 
docker build -f Dockerfile -t $REPO:0.49 . 
docker tag $REPO:0.49 $REPO:latest
docker push $REPO 
simonw commented 4 years ago

I'm going to cross my fingers and hope that this works - I don't want to leave this issue open until Datasette 0.50.