Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Automatically Run Tests on PR and Push Docker Image #38

Merged
merged 27 commits into from
Oct 19, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
3f9b250
Add github actions tests
withinboredom Oct 18, 2022
42ed376
native running is a bit more complicated
withinboredom Oct 18, 2022
735d8ef
Add actual builder
withinboredom Oct 18, 2022
90a954e
Add runner os
withinboredom Oct 18, 2022
3737890
and this one too
withinboredom Oct 18, 2022
3481078
fix naming
withinboredom Oct 18, 2022
504db86
checkout submodules
withinboredom Oct 18, 2022
ab12434
remove backslash
withinboredom Oct 18, 2022
de1e183
fix test runner
withinboredom Oct 18, 2022
3ef12d0
Add documentation and fix up docker deployment stuff
withinboredom Oct 19, 2022
0d2bbdc
use different caching method
withinboredom Oct 19, 2022
3c2a243
also for tests
withinboredom Oct 19, 2022
19e7405
update caches for main
withinboredom Oct 19, 2022
88f6b0a
specify target
withinboredom Oct 19, 2022
03cf5d8
specify target
withinboredom Oct 19, 2022
61c5f3e
remove docker cache from tests
withinboredom Oct 19, 2022
011578b
Optimize dockerfile for better caching
withinboredom Oct 19, 2022
7181d2d
significantly speed up cached builds
withinboredom Oct 19, 2022
0ecf987
use gha cache
withinboredom Oct 19, 2022
785fafd
update action versions
withinboredom Oct 19, 2022
a8166e2
only build one os for now
withinboredom Oct 19, 2022
ffe4e48
test non-code change
withinboredom Oct 19, 2022
847069d
Update docker actions
withinboredom Oct 19, 2022
b20f847
fix typo
withinboredom Oct 19, 2022
46c0edc
fake commit
withinboredom Oct 19, 2022
38ed629
reset changes
withinboredom Oct 19, 2022
8483f35
build other platforms for tests
withinboredom Oct 19, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 93 additions & 0 deletions .github/workflows/push.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
name: Build and push Docker image (latest)
on:
push:
branches:
- main
tags:
- v*
jobs:
docker-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
submodules: recursive

- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@master
with:
install: true

- name: Build test image
uses: docker/build-push-action@v3
with:
context: ./
file: Dockerfile
push: false
pull: true
target: builder
tags: ${{secrets.REGISTRY_LOGIN_SERVER}}/${{ secrets.REGISTRY_USERNAME }}/frankenphp:${{ github.sha }}-builder
builder: ${{ steps.buildx.outputs.name }}
cache-from: type=gha
cache-to: type=gha,mode=max
outputs: type=docker,dest=/tmp/.builder.tar

- name: Run tests
run: |
docker load -i /tmp/.builder.tar
docker run --rm ${{secrets.REGISTRY_LOGIN_SERVER}}/${{ secrets.REGISTRY_USERNAME }}/frankenphp:${{ github.sha }}-builder "go test"
push-image:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
submodules: recursive

- name: Docker Login
uses: docker/login-action@v2
with:
registry: ${{secrets.REGISTRY_LOGIN_SERVER}}
username: ${{secrets.REGISTRY_USERNAME}}
password: ${{secrets.REGISTRY_PASSWORD}}

- name: Docker meta
id: meta
uses: docker/metadata-action@v4
with:
# list of Docker images to use as base name for tags
images: |
${{ secrets.REGISTRY_LOGIN_SERVER }}/${{ secrets.REGISTRY_REPO }}/frankenphp
# generate Docker tags based on the following events/attributes
tags: |
type=schedule
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
type=sha

- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@master
with:
install: true

- name: Setup QEMU
uses: docker/setup-qemu-action@v2

- name: Build and Push Image
uses: docker/build-push-action@v3
with:
context: ./
file: Dockerfile
push: true
pull: true
target: final
platforms: linux/amd64,linux/arm64
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
builder: ${{ steps.buildx.outputs.name }}
cache-from: type=gha
cache-to: type=gha,mode=max
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll add a new line here.

91 changes: 91 additions & 0 deletions .github/workflows/tests.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
name: Tests
on:
pull_request:
branches:
- main
jobs:
docker-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
submodules: recursive

- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@master
with:
install: true

- name: Build test image
uses: docker/build-push-action@v3
with:
context: ./
file: Dockerfile
push: false
pull: true
target: builder
tags: ${{secrets.REGISTRY_LOGIN_SERVER}}/${{ secrets.REGISTRY_USERNAME }}/frankenphp:${{ github.sha }}-builder
builder: ${{ steps.buildx.outputs.name }}
cache-from: type=gha
cache-to: type=gha,mode=max
outputs: type=docker,dest=/tmp/.builder.tar

- name: Run tests
run: |
docker load -i /tmp/.builder.tar
docker run --rm ${{secrets.REGISTRY_LOGIN_SERVER}}/${{ secrets.REGISTRY_USERNAME }}/frankenphp:${{ github.sha }}-builder "go test"
push-image:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
submodules: recursive

- name: Docker Login
uses: docker/login-action@v2
with:
registry: ${{secrets.REGISTRY_LOGIN_SERVER}}
username: ${{secrets.REGISTRY_USERNAME}}
password: ${{secrets.REGISTRY_PASSWORD}}

- name: Docker meta
id: meta
uses: docker/metadata-action@v4
with:
# list of Docker images to use as base name for tags
images: |
${{ secrets.REGISTRY_LOGIN_SERVER }}/${{ secrets.REGISTRY_REPO }}/frankenphp
# generate Docker tags based on the following events/attributes
tags: |
type=schedule
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
type=sha

- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@master
with:
install: true

- name: Setup QEMU
uses: docker/setup-qemu-action@v2

- name: Build and Push Image
uses: docker/build-push-action@v3
with:
context: ./
file: Dockerfile
push: true
pull: true
target: final
platforms: linux/amd64,linux/arm64
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
builder: ${{ steps.buildx.outputs.name }}
cache-from: type=gha
cache-to: type=gha,mode=max
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll add a new line here.

14 changes: 10 additions & 4 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -85,14 +85,18 @@ COPY --from=golang:bullseye /usr/local/go /usr/local/go
WORKDIR /go/src/app

COPY go.mod go.sum ./
RUN go get -v ./...
RUN go mod graph | awk '{if ($1 !~ "@") print $2}' | xargs go get

RUN mkdir caddy && cd caddy
COPY go.mod go.sum ./
COPY caddy/go.mod caddy/go.sum ./caddy/

RUN go get -v ./...
RUN cd caddy && go mod graph | awk '{if ($1 !~ "@") print $2}' | xargs go get

COPY . .
COPY *.* .
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I changed this to *.* because my editor likes to put things in a dotfile, which caused the cache to always blow up.

COPY caddy caddy
COPY C-Thread-Pool C-Thread-Pool
COPY internal internal
COPY testdata testdata

# todo: automate this?
# see https://github.com/docker-library/php/blob/master/8.2-rc/bullseye/zts/Dockerfile#L57-L59 for php values
Expand All @@ -103,6 +107,8 @@ RUN cd caddy/frankenphp && \
cp frankenphp /usr/local/bin && \
cp /go/src/app/caddy/frankenphp/Caddyfile /etc/Caddyfile

ENTRYPOINT ["/bin/bash","-c"]

FROM php:8.2.0RC4-zts-bullseye AS final

COPY --from=mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/local/bin/
Expand Down
31 changes: 31 additions & 0 deletions docs/github-actions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Using GitHub Actions

This repository builds and deploys the Docker image to [Docker Hub](https://hub.docker.com/r/dunglas/frankenphp) on
every approved pull request or on your own fork once setup.

## Setting up GitHub Actions

In the repository settings, under secrets, add the following secrets:

- `REGISTRY_LOGIN_SERVER`: The docker registry to use (e.g. `docker.io`).
- `REGISTRY_USERNAME`: The username to use to login to the registry (e.g. `dunglas`).
- `REGISTRY_REPO`: The repository to use (e.g. `dunglas`).
- `REGISTRY_PASSWORD`: The password to use to login to the registry (e.g. an access key).

## Building and pushing the image

1. Create a pull request or push to your fork.
2. GitHub Actions will build the image and run any tests.
3. If the build is successful, the image will be pushed to the registry using the `pr-x`, where `x` is the PR number, as the tag.

## Deploying the image

1. Once the pull request is merged, GitHub Actions will again run the tests and build a new image.
2. If the build is successful, the `main` tag will be updated in the Docker registry.

## Releases

1. Create a new tag in the repository.
2. GitHub Actions will build the image and run any tests.
3. If the build is successful, the image will be pushed to the registry using the tag name as the tag (e.g. `v1.2.3` and `v1.2` will be created).
4. The `latest` tag will also be updated.