1
0

Move CI/CD from Travis to Github Actions.

This commit is contained in:
Kevin Marilleau 2020-11-30 19:10:20 +01:00 committed by Nicolas Duchon
parent a717c35c13
commit cd3c9681dd
No known key found for this signature in database
GPG Key ID: EA3151C66A4D79E7
22 changed files with 131 additions and 100 deletions

79
.github/workflows/test.yml vendored Normal file
View File

@ -0,0 +1,79 @@
name: Test
on: [push, pull_request]
env:
IMAGE: jrcs/letsencrypt-nginx-proxy-companion
NGINX_CONTAINER_NAME: nginx-proxy
DOCKER_GEN_CONTAINER_NAME: nginx-proxy-gen
TEST_DOMAINS: le1.wtf,le2.wtf,le3.wtf
DOCKER_COMPOSE_VERSION: 1.24.0
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v2
- name: Build Image
run: docker build -t "$IMAGE" .
- name: Inspect Image
run: docker inspect "$IMAGE"
- name: Get acme.sh Version
run: docker run --rm "$IMAGE" acme.sh --version
- name: List Docker Images
run: docker images
- name: Export Image Artifact
run: docker save $IMAGE > image.tar
- name: Upload Image Artifact
uses: actions/upload-artifact@v2
with:
name: image.tar
path: image.tar
test:
needs: build
strategy:
fail-fast: true
matrix:
setup: [2containers, 3containers]
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v2
# PREPARE RUNNER ENV
- name: Add Test Domains in /etc/hosts
run: |
test_domains=$(echo $TEST_DOMAINS | tr "," "\n")
for domain in $test_domains
do
echo "127.0.0.1 $domain" | sudo tee -a /etc/hosts
done
- run: cat /etc/hosts
- name: Add Test Dependencies
uses: actions/checkout@v2
with:
repository: docker-library/official-images
path: official-images
- name: Setup Boulder
run: test/setup/setup-boulder.sh
- name: Setup NGINX Proxy
env:
SETUP: ${{ matrix.setup }}
run: test/setup/setup-nginx-proxy.sh
# ADD BUILDED IMAGE
- name: Download Builded Image
uses: actions/download-artifact@v2
with:
name: image.tar
- name: Import Builded Image
run: docker load < image.tar
# TEST
- name: Test Image 1
run: official-images/test/run.sh "$IMAGE"
- name: Test Image 2
run: test/run.sh "$IMAGE"
- if: ${{ failure() }}
run: test/github_actions/containers-logs.sh

View File

@ -1,49 +0,0 @@
os: linux
dist: focal
language: shell
branches:
only:
- master
addons:
hosts:
- le1.wtf
- le2.wtf
- le3.wtf
env:
global:
- IMAGE=jrcs/letsencrypt-nginx-proxy-companion
- NGINX_CONTAINER_NAME=nginx-proxy
- DOCKER_GEN_CONTAINER_NAME=nginx-proxy-gen
- TEST_DOMAINS=le1.wtf,le2.wtf,le3.wtf
- DOCKER_COMPOSE_VERSION=1.24.0
jobs:
include:
- env: SETUP=2containers
- env: SETUP=3containers
before_install:
- test/travis/update-docker-compose.sh
install:
- docker build -t "$IMAGE" .
- docker inspect "$IMAGE"
- docker run --rm "$IMAGE" acme.sh --version
- docker images
before_script:
- git clone https://github.com/docker-library/official-images.git official-images
- test/setup/setup-boulder.sh
- test/setup/setup-nginx-proxy.sh
- docker pull nginx:alpine
script:
- official-images/test/run.sh "$IMAGE"
- test/run.sh "$IMAGE"
after_failure:
- test/travis/containers-logs.sh

View File

@ -8,8 +8,8 @@ fold_end() {
echo -e "\ntravis_fold:end:$1\r"
}
if [[ -f "$TRAVIS_BUILD_DIR/test/travis/failed_tests.txt" ]]; then
mapfile -t containers < "$TRAVIS_BUILD_DIR/test/travis/failed_tests.txt"
if [[ -f "$GITHUB_WORKSPACE/test/github_actions/failed_tests.txt" ]]; then
mapfile -t containers < "$GITHUB_WORKSPACE/test/github_actions/failed_tests.txt"
fi
containers+=("$NGINX_CONTAINER_NAME")

View File

@ -203,7 +203,7 @@ dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
self="$(basename "$0")"
failed_tests=()
if [[ -z $TRAVIS ]] && [[ -f "$dir/local_test_env.sh" ]]; then
if [[ -z $GITHUB_ACTIONS ]] && [[ -f "$dir/local_test_env.sh" ]]; then
# shellcheck source=/dev/null
source "$dir/local_test_env.sh"
fi
@ -448,9 +448,9 @@ done
if [ "$didFail" ]; then
## Next five lines were added by jrcs/docker-letsencrypt-nginx-proxy-companion
if [[ $TRAVIS == 'true' ]]; then
if [[ $GITHUB_ACTIONS == 'true' ]]; then
for test in "${failed_tests[@]}"; do
echo "$test" >> "$dir/travis/failed_tests.txt"
echo "$test" >> "$dir/github_actions/failed_tests.txt"
done
fi
## End of additional code

View File

@ -5,7 +5,7 @@ set -e
acme_endpoint='http://boulder:4001/directory'
setup_boulder() {
export GOPATH=${TRAVIS_BUILD_DIR}/go
export GOPATH=${GITHUB_WORKSPACE}/go
[[ ! -d $GOPATH/src/github.com/letsencrypt/boulder ]] \
&& git clone https://github.com/letsencrypt/boulder \
"$GOPATH/src/github.com/letsencrypt/boulder"

View File

@ -6,22 +6,23 @@ function get_environment {
dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
LOCAL_BUILD_DIR="$(cd "$dir/../.." && pwd)"
export TRAVIS_BUILD_DIR="$LOCAL_BUILD_DIR"
export GITHUB_WORKSPACE="$LOCAL_BUILD_DIR"
# shellcheck source=/dev/null
[[ -f "${TRAVIS_BUILD_DIR}/test/local_test_env.sh" ]] && \
source "${TRAVIS_BUILD_DIR}/test/local_test_env.sh"
[[ -f "${GITHUB_WORKSPACE}/test/local_test_env.sh" ]] && \
source "${GITHUB_WORKSPACE}/test/local_test_env.sh"
# Get the environment variables from the .travis.yml file with sed
declare -a travis_yml
travis_yml[0]="$(sed -n 's/.*- NGINX_CONTAINER_NAME=//p' "$LOCAL_BUILD_DIR/.travis.yml")"
travis_yml[1]="$(sed -n 's/.*- DOCKER_GEN_CONTAINER_NAME=//p' "$LOCAL_BUILD_DIR/.travis.yml")"
travis_yml[2]="$(sed -n 's/.*- TEST_DOMAINS=//p' "$LOCAL_BUILD_DIR/.travis.yml")"
# Get the environment variables from the .github/workflows/test.yml file with sed
declare -a ci_test_yml
ci_test_yml[0]="$(sed -n 's/.* NGINX_CONTAINER_NAME: //p' "$LOCAL_BUILD_DIR/.github/workflows/test.yml")"
ci_test_yml[1]="$(sed -n 's/.* DOCKER_GEN_CONTAINER_NAME: //p' "$LOCAL_BUILD_DIR/.github/workflows/test.yml")"
ci_test_yml[2]="$(sed -n 's/.* TEST_DOMAINS: //p' "$LOCAL_BUILD_DIR/.github/workflows/test.yml")"
# If environment variable where sourced or manually set use them, else use those from .travis.yml
export NGINX_CONTAINER_NAME="${NGINX_CONTAINER_NAME:-${travis_yml[0]}}"
export DOCKER_GEN_CONTAINER_NAME="${DOCKER_GEN_CONTAINER_NAME:-${travis_yml[1]}}"
export TEST_DOMAINS="${TEST_DOMAINS:-${travis_yml[2]}}"
# If environment variable where sourced or manually set use them, else use those from
# .github/workflows/test.yml
export NGINX_CONTAINER_NAME="${NGINX_CONTAINER_NAME:-${ci_test_yml[0]}}"
export DOCKER_GEN_CONTAINER_NAME="${DOCKER_GEN_CONTAINER_NAME:-${ci_test_yml[1]}}"
export TEST_DOMAINS="${TEST_DOMAINS:-${ci_test_yml[2]}}"
# Build the array containing domains to add to /etc/hosts
IFS=',' read -r -a domains <<< "$TEST_DOMAINS"
@ -57,8 +58,8 @@ case $1 in
get_environment
# Prepare the env file that run.sh will source
cat > "${TRAVIS_BUILD_DIR}/test/local_test_env.sh" <<EOF
export TRAVIS_BUILD_DIR="$LOCAL_BUILD_DIR"
cat > "${GITHUB_WORKSPACE}/test/local_test_env.sh" <<EOF
export GITHUB_WORKSPACE="$LOCAL_BUILD_DIR"
export NGINX_CONTAINER_NAME="$NGINX_CONTAINER_NAME"
export DOCKER_GEN_CONTAINER_NAME="$DOCKER_GEN_CONTAINER_NAME"
export TEST_DOMAINS="$TEST_DOMAINS"
@ -77,8 +78,8 @@ EOF
docker pull nginx:alpine
# Prepare the test setup using the setup scripts
"${TRAVIS_BUILD_DIR}/test/setup/setup-boulder.sh"
"${TRAVIS_BUILD_DIR}/test/setup/setup-nginx-proxy.sh"
"${GITHUB_WORKSPACE}/test/setup/setup-boulder.sh"
"${GITHUB_WORKSPACE}/test/setup/setup-nginx-proxy.sh"
;;
--teardown)
@ -92,14 +93,14 @@ EOF
# Stop and remove boulder
docker-compose --project-name 'boulder' \
--file "${TRAVIS_BUILD_DIR}/go/src/github.com/letsencrypt/boulder/docker-compose.yml" \
--file "${GITHUB_WORKSPACE}/go/src/github.com/letsencrypt/boulder/docker-compose.yml" \
down --volumes
# Cleanup files created by the setup
if [[ -n "${TRAVIS_BUILD_DIR// }" ]]; then
[[ -f "${TRAVIS_BUILD_DIR}/nginx.tmpl" ]]&& rm "${TRAVIS_BUILD_DIR}/nginx.tmpl"
rm "${TRAVIS_BUILD_DIR}/test/local_test_env.sh"
echo "The ${TRAVIS_BUILD_DIR}/go folder require superuser permission to fully remove."
if [[ -n "${GITHUB_WORKSPACE// }" ]]; then
[[ -f "${GITHUB_WORKSPACE}/nginx.tmpl" ]]&& rm "${GITHUB_WORKSPACE}/nginx.tmpl"
rm "${GITHUB_WORKSPACE}/test/local_test_env.sh"
echo "The ${GITHUB_WORKSPACE}/go folder require superuser permission to fully remove."
echo "Doing sudo rm -rf in scripts is dangerous, so the folder won't be automatically removed."
fi

View File

@ -18,7 +18,7 @@ case $SETUP in
;;
3containers)
curl https://raw.githubusercontent.com/jwilder/nginx-proxy/master/nginx.tmpl > "${TRAVIS_BUILD_DIR}/nginx.tmpl"
curl https://raw.githubusercontent.com/jwilder/nginx-proxy/master/nginx.tmpl > "${GITHUB_WORKSPACE}/nginx.tmpl"
docker run -d -p 80:80 -p 443:443 \
--name "$NGINX_CONTAINER_NAME" \
@ -33,7 +33,7 @@ case $SETUP in
docker run -d \
--name "$DOCKER_GEN_CONTAINER_NAME" \
--volumes-from "$NGINX_CONTAINER_NAME" \
-v "${TRAVIS_BUILD_DIR}/nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro" \
-v "${GITHUB_WORKSPACE}/nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro" \
-v /var/run/docker.sock:/tmp/docker.sock:ro \
--label com.github.jrcs.letsencrypt_nginx_proxy_companion.test_suite \
--network boulder_bluenet \

View File

@ -2,7 +2,7 @@
## Test for ACME accounts handling.
if [[ -z $TRAVIS ]]; then
if [[ -z $GITHUB_ACTIONS ]]; then
le_container_name="$(basename "${0%/*}")_$(date "+%Y-%m-%d_%H.%M.%S")"
else
le_container_name="$(basename "${0%/*}")"

View File

@ -2,7 +2,7 @@
## Test for SAN (Subject Alternative Names) certificates.
if [[ -z $TRAVIS ]]; then
if [[ -z $GITHUB_ACTIONS ]]; then
le_container_name="$(basename "${0%/*}")_$(date "+%Y-%m-%d_%H.%M.%S")"
else
le_container_name="$(basename "${0%/*}")"

View File

@ -2,7 +2,7 @@
## Test for single domain certificates.
if [[ -z $TRAVIS ]]; then
if [[ -z $GITHUB_ACTIONS ]]; then
le_container_name="$(basename "${0%/*}")_$(date "+%Y-%m-%d_%H.%M.%S")"
else
le_container_name="$(basename "${0%/*}")"

View File

@ -2,7 +2,7 @@
## Test for spliting SAN certificates into single domain certificates by NGINX container env variables
if [[ -z $TRAVIS ]]; then
if [[ -z $GITHUB_ACTIONS ]]; then
le_container_name="$(basename "${0%/*}")_$(date "+%Y-%m-%d_%H.%M.%S")"
else
le_container_name="$(basename "${0%/*}")"

View File

@ -2,7 +2,7 @@
## Test for standalone certificates.
if [[ -z $TRAVIS ]]; then
if [[ -z $GITHUB_ACTIONS ]]; then
le_container_name="$(basename "${0%/*}")_$(date "+%Y-%m-%d_%H.%M.%S")"
else
le_container_name="$(basename "${0%/*}")"
@ -24,7 +24,7 @@ function cleanup {
trap cleanup EXIT
# Create letsencrypt_user_data with a single domain cert
cat > "${TRAVIS_BUILD_DIR}/test/tests/certs_standalone/letsencrypt_user_data" <<EOF
cat > "${GITHUB_WORKSPACE}/test/tests/certs_standalone/letsencrypt_user_data" <<EOF
LETSENCRYPT_STANDALONE_CERTS=('single')
LETSENCRYPT_single_HOST=('${domains[0]}')
EOF
@ -43,7 +43,7 @@ elif [[ "${DRY_RUN:-}" == 1 ]]; then
fi
run_le_container "${1:?}" "$le_container_name" \
"--volume ${TRAVIS_BUILD_DIR}/test/tests/certs_standalone/letsencrypt_user_data:/app/letsencrypt_user_data"
"--volume ${GITHUB_WORKSPACE}/test/tests/certs_standalone/letsencrypt_user_data:/app/letsencrypt_user_data"
# Wait for a file at /etc/nginx/conf.d/standalone-cert-${domains[0]}.conf
wait_for_standalone_conf "${domains[0]}" "$le_container_name"
@ -66,7 +66,7 @@ docker exec "$le_container_name" bash -c "[[ -f /etc/nginx/conf.d/standalone-cer
&& echo "Standalone configuration for ${domains[0]} wasn't correctly removed."
# Add another (SAN) certificate to letsencrypt_user_data
cat > "${TRAVIS_BUILD_DIR}/test/tests/certs_standalone/letsencrypt_user_data" <<EOF
cat > "${GITHUB_WORKSPACE}/test/tests/certs_standalone/letsencrypt_user_data" <<EOF
LETSENCRYPT_STANDALONE_CERTS=('single' 'san')
LETSENCRYPT_single_HOST=('${domains[0]}')
LETSENCRYPT_san_HOST=('${domains[1]}' '${domains[2]}')

View File

@ -2,7 +2,7 @@
## Test for LETSENCRYPT_RESTART_CONTAINER variable.
if [[ -z $TRAVIS ]]; then
if [[ -z $GITHUB_ACTIONS ]]; then
le_container_name="$(basename "${0%/*}")_$(date "+%Y-%m-%d_%H.%M.%S")"
else
le_container_name="$(basename "${0%/*}")"
@ -15,7 +15,7 @@ IFS=',' read -r -a domains <<< "$TEST_DOMAINS"
# Listen for Docker restart events
docker events \
--filter event=restart \
--format 'Container {{.Actor.Attributes.name}} restarted' > "${TRAVIS_BUILD_DIR}/test/tests/container_restart/docker_event_out.txt" &
--format 'Container {{.Actor.Attributes.name}} restarted' > "${GITHUB_WORKSPACE}/test/tests/container_restart/docker_event_out.txt" &
docker_events_pid=$!
# Cleanup function with EXIT trap
@ -23,7 +23,7 @@ function cleanup {
# Kill the Docker events listener
kill $docker_events_pid && wait $docker_events_pid 2>/dev/null
# Remove temporary files
rm -f "${TRAVIS_BUILD_DIR}/test/tests/container_restart/docker_event_out.txt"
rm -f "${GITHUB_WORKSPACE}/test/tests/container_restart/docker_event_out.txt"
# Remove any remaining Nginx container(s) silently.
for domain in "${domains[@]}"; do
docker rm --force "$domain" &> /dev/null
@ -53,7 +53,7 @@ for domain in "${domains[@]}"; do
# Check if container restarted
timeout="$(date +%s)"
timeout="$((timeout + 60))"
until grep "$domain" "${TRAVIS_BUILD_DIR}"/test/tests/container_restart/docker_event_out.txt; do
until grep "$domain" "${GITHUB_WORKSPACE}"/test/tests/container_restart/docker_event_out.txt; do
if [[ "$(date +%s)" -gt "$timeout" ]]; then
echo "Container $domain didn't restart in under one minute."
break

View File

@ -2,7 +2,7 @@
## Test for default certificate creation.
if [[ -z $TRAVIS ]]; then
if [[ -z $GITHUB_ACTIONS ]]; then
le_container_name="$(basename "${0%/*}")_$(date "+%Y-%m-%d_%H.%M.%S")"
else
le_container_name="$(basename "${0%/*}")"

View File

@ -78,7 +78,7 @@ case $SETUP in
"$1" \
bash -c "$commands" 2>&1
cat > "${TRAVIS_BUILD_DIR}/test/tests/docker_api/expected-std-out.txt" <<EOF
cat > "${GITHUB_WORKSPACE}/test/tests/docker_api/expected-std-out.txt" <<EOF
Container $nginx_vol received exec_start: sh -c /app/docker-entrypoint.sh /usr/local/bin/docker-gen /app/nginx.tmpl /etc/nginx/conf.d/default.conf; /usr/sbin/nginx -s reload
$nginx_vol
Container $nginx_env received exec_start: sh -c /app/docker-entrypoint.sh /usr/local/bin/docker-gen /app/nginx.tmpl /etc/nginx/conf.d/default.conf; /usr/sbin/nginx -s reload
@ -220,7 +220,7 @@ EOF
"$1" \
bash -c "$commands" 2>&1
cat > "${TRAVIS_BUILD_DIR}/test/tests/docker_api/expected-std-out.txt" <<EOF
cat > "${GITHUB_WORKSPACE}/test/tests/docker_api/expected-std-out.txt" <<EOF
Container $docker_gen received signal 1
Container $nginx_vol received signal 1
$docker_gen

View File

@ -2,7 +2,7 @@
## Test for the /app/force_renew script.
if [[ -z $TRAVIS ]]; then
if [[ -z $GITHUB_ACTIONS ]]; then
le_container_name="$(basename "${0%/*}")_$(date "+%Y-%m-%d_%H.%M.%S")"
else
le_container_name="$(basename "${0%/*}")"

View File

@ -7,7 +7,7 @@ test_comment='### This is a test comment'
vhost_path='/etc/nginx/vhost.d'
# Create custom location configuration file to be bind mounted
location_file="${TRAVIS_BUILD_DIR}/test/tests/location_config/le2.wtf"
location_file="${GITHUB_WORKSPACE}/test/tests/location_config/le2.wtf"
echo "$test_comment" > "$location_file"
# Create le1.wtf configuration file, *.le3.wtf and test.* from inside the nginx container
@ -18,7 +18,7 @@ docker exec "$NGINX_CONTAINER_NAME" sh -c "echo '### This is a test comment' > /
# Zero the default configuration file.
docker exec "$NGINX_CONTAINER_NAME" sh -c "echo '' > /etc/nginx/vhost.d/default"
if [[ -z $TRAVIS ]]; then
if [[ -z $GITHUB_ACTIONS ]]; then
le_container_name="$(basename "${0%/*}")_$(date "+%Y-%m-%d_%H.%M.%S")"
else
le_container_name="$(basename "${0%/*}")"

View File

@ -7,7 +7,7 @@ files_gid=1001
files_perms=640
folders_perms=750
if [[ -z $TRAVIS ]]; then
if [[ -z $GITHUB_ACTIONS ]]; then
le_container_name="$(basename "${0%/*}")_$(date "+%Y-%m-%d_%H.%M.%S")"
else
le_container_name="$(basename "${0%/*}")"

View File

@ -2,7 +2,7 @@
## Test for sensitive files and folders permissions
if [[ -z $TRAVIS ]]; then
if [[ -z $GITHUB_ACTIONS ]]; then
le_container_name="$(basename "${0%/*}")_$(date "+%Y-%m-%d_%H.%M.%S")"
else
le_container_name="$(basename "${0%/*}")"

View File

@ -2,7 +2,7 @@
## Test for private keys types
if [[ -z $TRAVIS ]]; then
if [[ -z $GITHUB_ACTIONS ]]; then
le_container_name="$(basename "${0%/*}")_$(date "+%Y-%m-%d_%H.%M.%S")"
else
le_container_name="$(basename "${0%/*}")"

View File

@ -2,7 +2,7 @@
## Test for symlink creation / removal.
if [[ -z $TRAVIS ]]; then
if [[ -z $GITHUB_ACTIONS ]]; then
le_container_name="$(basename "${0%/*}")_$(date "+%Y-%m-%d_%H.%M.%S")"
else
le_container_name="$(basename "${0%/*}")"