diff --git a/.editorconfig b/.editorconfig index c229cfa..fa62ea3 100644 --- a/.editorconfig +++ b/.editorconfig @@ -19,6 +19,9 @@ indent_style = tab [*.md] trim_trailing_whitespace = false +[*.json] +insert_final_newline = false + [*.{patch,diff}] insert_final_newline = false trim_trailing_whitespace = false diff --git a/.github/workflows/build-ariang.yml b/.github/workflows/build-ariang.yml deleted file mode 100644 index 0d9a6cb..0000000 --- a/.github/workflows/build-ariang.yml +++ /dev/null @@ -1,50 +0,0 @@ -name: Build AriaNg - -on: - workflow_dispatch: - inputs: - version: - description: 'target AriaNg version' - required: false - default: '' - -env: - VERSION: ${{ github.event.inputs.version }} - DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - -jobs: - build: - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Log into DockerHub - if: ${{ github.event_name != 'pull_request' && github.actor == env.DOCKERHUB_USERNAME }} - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Log into GitHub Packages - if: ${{ github.event_name != 'pull_request' }} - uses: docker/login-action@v1 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Build docker image - env: - DOCKER_REPO: "${{ github.actor }}/ariang" - GHCR_REPO: "ghcr.io/${{ github.actor }}/ariang" - working-directory: ariang - run: | - ./build.sh diff --git a/.github/workflows/build-frp.yml b/.github/workflows/build-frp.yml deleted file mode 100644 index 3dcc556..0000000 --- a/.github/workflows/build-frp.yml +++ /dev/null @@ -1,55 +0,0 @@ -name: Build frp - -on: - workflow_dispatch: - inputs: - version: - description: 'target frp version' - required: false - default: '' - -env: - VERSION: ${{ github.event.inputs.version }} - DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - -jobs: - build: - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - - strategy: - matrix: - program: [frpc, frps] - - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Log into DockerHub - if: ${{ github.event_name != 'pull_request' && github.actor == env.DOCKERHUB_USERNAME }} - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Log into GitHub Packages - if: ${{ github.event_name != 'pull_request' }} - uses: docker/login-action@v1 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Build - env: - DOCKER_REPO: "${{ github.actor }}/${{ matrix.program }}" - GHCR_REPO: "ghcr.io/${{ github.actor }}/${{ matrix.program }}" - PROGRAM: ${{ matrix.program }} - working-directory: frp - run: | - ./build.sh $PROGRAM diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..e21856e --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,127 @@ +name: Build Docker Image + +on: + push: + branches: + - main + workflow_call: + inputs: + projects: + required: true + type: string + workflow_dispatch: + inputs: + projects: + description: "projects to build, comma separated" + required: true + +env: + DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + +jobs: + matrix: + runs-on: ubuntu-latest + outputs: + projects: ${{ steps.determine.outputs.projects }} + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + filter: 'blob:none' + + - name: Determine projects to build + id: determine + env: + PROJECTS: ${{ github.event.inputs.projects }} + run: | + set -e + + # https://stackoverflow.com/a/28368319 + declare -A projects + + if [ "${{ github.event_name }}" == "workflow_call" ] || [ "${{ github.event_name }}" == "workflow_dispatch" ]; then + if [ ! -z "$PROJECTS" ]; then + while read -r dir; do + if [ -f "$dir/subprojects.txt" ]; then + while read -r line; do + projects["$dir/$line"]=1 + done < "$dir/subprojects.txt" + elif [ -f "$dir/build.sh" ] || [ -f "$dir/Dockerfile" ]; then + projects["$dir"]=1 + fi + done <<< "$(echo -n $PROJECTS | tr ',' '\n')" + fi + + else + # for file in $(git diff --name-only --diff-filter=d ${{ github.event.before }} ${{ github.event.after }}); do + for file in $(git diff --name-only d050f4a HEAD); do + dir="$(dirname $file)" + while [ "$dir" != "." ]; do + # respect `subprojects.txt` + if [ -f "$dir/subprojects.txt" ]; then + while read -r line; do + projects["$dir/$line"]=1 + done < "$dir/subprojects.txt" + break + + # otherwise look for `build.sh` or `Dockerfile` + elif [ -f "$dir/build.sh" ] || [ -f "$dir/Dockerfile" ]; then + projects["$dir"]=1 + break + fi + + dir="$(dirname $dir)" + done + done + fi + + if [ ${#projects[@]} -eq 0 ]; then + echo "::error ::No available projects to build" + exit 1 + fi + + echo "projects=$(jq --compact-output --null-input '$ARGS.positional' --args -- "${!projects[@]}")" >> "$GITHUB_OUTPUT" + + build: + runs-on: ubuntu-latest + needs: matrix + permissions: + contents: read + packages: write + + strategy: + matrix: + project: ${{ fromJson(needs.matrix.outputs.projects) }} + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + if: ${{ github.actor == env.DOCKERHUB_USERNAME }} + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build ${{ matrix.project }} + env: + DOCKERHUB_NAMESPACE: "${{ env.DOCKERHUB_USERNAME }}" + GHCR_NAMESPACE: "ghcr.io/${{ github.actor }}" + run: | + set -e + if [ "$(git rev-parse HEAD)" == "$(git rev-parse origin/main)" ]; then + export LATEST=1 + fi + ./build-image.sh "${{ matrix.project }}" diff --git a/.github/workflows/trigger-docker-build-when-package-releases.yml b/.github/workflows/trigger-docker-build-when-package-releases.yml deleted file mode 100644 index 09d8b90..0000000 --- a/.github/workflows/trigger-docker-build-when-package-releases.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: Trigger Docker Build When Package Releases - -on: - workflow_dispatch: - schedule: - - cron: '0 */2 * * *' - -jobs: - check-update: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/cache@v2 - with: - key: rss-cache-releases - path: ./.cache/rss-cache-releases - - run: ./_scripts/check-update-and-trigger-docker-build - env: - PKG_ARIANG_WEBHOOK: ${{ secrets.PKG_ARIANG_WEBHOOK }} - PKG_FRPC_WEBHOOK: ${{ secrets.PKG_FRPC_WEBHOOK }} - PKG_FRPS_WEBHOOK: ${{ secrets.PKG_FRPS_WEBHOOK }} diff --git a/_scripts/check-update-and-trigger-docker-build b/_scripts/check-update-and-trigger-docker-build deleted file mode 100755 index c4c3c64..0000000 --- a/_scripts/check-update-and-trigger-docker-build +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/bash - -set -eo pipefail - -RSS_CACHE_FILE=.cache/rss-cache-releases - -if [ ! -d ./.cache ]; then - mkdir .cache -fi - -# load previous result -if [ -f $RSS_CACHE_FILE ]; then - . $RSS_CACHE_FILE - rm -f $RSS_CACHE_FILE -fi - -check_pkg_releases() { - local pkg=$1 - local path=${2:-$1} - local pkg_upper=${pkg^^} - - if [ ! -d $path ] || [ ! -f $path/.env ]; then - return 0 - fi - - . $path/.env - - local SUBPKG_VARNAME="PKG_${pkg_upper}_SUBPKGS" - if [ ! -z "${!SUBPKG_VARNAME}" ]; then - for subpkg in ${!SUBPKG_VARNAME}; do - check_pkg_releases $subpkg $path/$subpkg - done - fi - - local RSSURL_VARNAME="PKG_${pkg_upper}_RELEASES_RSS_URL" - if [ -z "${!RSSURL_VARNAME}" ]; then - return 0 - fi - - local WEBHOOK_VARNAME="PKG_${pkg_upper}_WEBHOOK" - if [ -z "${!WEBHOOK_VARNAME}" ]; then - >&2 echo "$WEBHOOK_VARNAME is required" - return 1 - fi - - # write cache, ignore the first run if needed - local LASTCHECK_DATE_VARNAME="PKG_${pkg_upper}_RELEASES_RSS_LASTCHECK" - local IGNORE_FIRST_RUN_VARNAME="PKG_${pkg_upper}_RELEASES_RSS_IGNORE_FIRST_RUN" - echo "$LASTCHECK_DATE_VARNAME=$(date -u -Iseconds | sed 's/UTC/+00:00/')" >> $RSS_CACHE_FILE - if [ -z "${!LASTCHECK_DATE_VARNAME}" ] && [ "${!IGNORE_FIRST_RUN_VARNAME:-true}" == "true" ]; then - return 0 - fi - - echo -n ":: Checking package ${path}..." - local tags=$(curl -sS ${!RSSURL_VARNAME} | ./_scripts/filter-new-release-tags ${!LASTCHECK_DATE_VARNAME}) - - # unable to pass version to DockerHub, only build the latest version - if [ ! -z "$tags" ]; then - echo -e -n "\n -> Triggering build for $(echo "$tags" | tail -n1)..." - curl -sS -XPOST ${!WEBHOOK_VARNAME} - echo " done" - else - echo " already up to date" - fi - - unset `awk -F '=' '{print $1}' $path/.env` -} - -for pkg in *; do - check_pkg_releases $pkg -done diff --git a/_scripts/filter-new-release-tags b/_scripts/filter-new-release-tags deleted file mode 100755 index 624c563..0000000 --- a/_scripts/filter-new-release-tags +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import sys -import re -import xml.etree.ElementTree as ET -from datetime import datetime -from typing import List, Dict, Optional - -def parse_argv(argv: List[str]) -> Dict[str, str]: - # cat releases.atom | get-newer-versions - if len(argv) < 2: - return { 'file': '-', 'date': '' } - - # cat releases.atom | get-newer-versions 2021-01-01T00:00:00+00:00 - elif len(argv) == 2 and (re.compile(r'^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+\d{2}:\d{2}$').match(argv[1])): - return { 'file': '-', 'date': argv[1] } - - # get-newer-versions releases.atom - elif len(argv) == 2: - return { 'file': argv[1], 'date': '' } - - # get-newer-versions releases.atom 2021-01-01T00:00:00+00:00 - else: - return { 'file': argv[1], 'date': argv[2] } - -def extract_tag(item: ET.Element) -> Optional[Dict[str, str]]: - date_node = item.find('{http://www.w3.org/2005/Atom}updated') - link_node = item.find('{http://www.w3.org/2005/Atom}link') - if date_node != None and link_node != None: - href = link_node.attrib['href'] - return { 'tag': href[(href.rindex('/') + 1):], 'date': date_node.text.replace('Z', '+00:00') } - -args = parse_argv(sys.argv) -tree = ET.parse(args['file'] if args['file'] != '-' else open(0, encoding='utf-8')) -feed = tree.getroot() - -tags = [] -for item in feed: - if item.tag == '{http://www.w3.org/2005/Atom}entry': - result = extract_tag(item) - if result == None: - break - - if args['date'] == '': - tags.insert(0, result['tag']) - break - - if datetime.fromisoformat(result['date']) > datetime.fromisoformat(args['date']): - tags.insert(0, result['tag']) - -print(*tags, sep='\n') diff --git a/ariang/Dockerfile b/ariang/Dockerfile index 91b4d82..8ec3508 100644 --- a/ariang/Dockerfile +++ b/ariang/Dockerfile @@ -1,33 +1,17 @@ # syntax=docker/dockerfile:1 -FROM --platform=$BUILDPLATFORM node:lts AS build - -ARG GIT_BRANCH - -RUN < /build/root/etc/passwd echo 'nobody:x:65534:' > /build/root/etc/group EOF -COPY --from=build /build/AriaNg/dist /build/root/www - FROM scratch COPY --from=xbuild /build/root/ / -ARG VERSION +ARG VERSION=1.3.7 # github-releases/mayswind/AriaNg LABEL version=${VERSION} EXPOSE 8080 diff --git a/ariang/build.sh b/ariang/build.sh deleted file mode 100755 index 4a87620..0000000 --- a/ariang/build.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/sh - -set -e - -DOCKER_REPO="${DOCKER_REPO:-leonismoe/ariang}" - -LATEST=0 - -if [ -z "$VERSION" ]; then - GIT_BRANCH="$(curl -fsSL https://github.com/mayswind/AriaNg/releases.atom | grep -oE 'releases/tag/[^"]+' | head -n1 | cut -d/ -f3)" - VERSION=${GIT_BRANCH#v} - LATEST=1 -else - GIT_BRANCH="$VERSION" -fi - -docker buildx build --pull --push \ - -t $DOCKER_REPO:$VERSION \ - --platform linux/amd64,linux/arm64/v8,linux/arm/v6,linux/arm/v7,linux/386,linux/ppc64le,linux/s390x,linux/riscv64 \ - --build-arg VERSION=$VERSION \ - --build-arg GIT_BRANCH=$GIT_BRANCH \ - . - -if [ $LATEST -eq 1 ]; then - docker buildx imagetools create -t $DOCKER_REPO:latest $DOCKER_REPO:$VERSION -fi - -if [ ! -z "$GHCR_REPO" ]; then - docker buildx imagetools create -t $GHCR_REPO:$VERSION $DOCKER_REPO:$VERSION - if [ $LATEST -eq 1 ]; then - docker buildx imagetools create -t $GHCR_REPO:latest $DOCKER_REPO:$VERSION - fi -fi diff --git a/ariang/supported-platforms.txt b/ariang/supported-platforms.txt new file mode 100644 index 0000000..c453ff0 --- /dev/null +++ b/ariang/supported-platforms.txt @@ -0,0 +1,8 @@ +linux/amd64 +linux/arm64 +linux/arm/v7 +linux/arm/v6 +linux/386 +linux/ppc64le +linux/s390x +linux/riscv64 diff --git a/build-image.sh b/build-image.sh new file mode 100755 index 0000000..59ebc6f --- /dev/null +++ b/build-image.sh @@ -0,0 +1,77 @@ +#!/bin/sh + +set -e + +PROJECT_DIR="$1" +if [ -z "$PROJECT_DIR" ]; then + echo "usage: $0 " >&2 + exit 1 +fi + +if [ -f "$PROJECT_DIR/.srcinfo" ]; then + . "$PROJECT_DIR/.srcinfo" +fi + +if [ -z "$PROJECT_NAME" ]; then + PROJECT_NAME="$(basename "$PROJECT_DIR")" +fi + +if [ -z "$GHCR_REPO" ] && [ ! -z "$GHCR_NAMESPACE" ]; then + GHCR_REPO="$GHCR_NAMESPACE/$PROJECT_NAME" +fi + +if [ -z "$DOCKER_REPO" ]; then + if [ ! -z "$DOCKERHUB_NAMESPACE" ]; then + DOCKER_REPO="$DOCKERHUB_NAMESPACE/$PROJECT_NAME" + elif [ ! -z "$GHCR_REPO" ]; then + DOCKER_REPO="$GHCR_REPO" + fi +fi + +if [ -z "$DOCKER_REPO" ]; then + echo "error: DOCKER_REPO is not set" >&2 + exit 1 +fi + +if [ -f "$PROJECT_DIR/build.sh" ]; then + cd "$PROJECT_DIR" + DOCKER_REPO="$DOCKER_REPO" GHCR_REPO="$GHCR_REPO" ./build.sh + +elif [ -f "$PROJECT_DIR/subprojects.txt" ]; then + echo "error: project $(dirname "$PROJECT_DIR") contains sub projects, please build them individually" >&2 + exit 1 + +elif [ -f "$PROJECT_DIR/Dockerfile" ]; then + cd "$PROJECT_DIR" + + VERSION="$(grep -oP '(?<=ARG VERSION=)\S+' Dockerfile | head -n1)" + PLATFORM=linux/amd64,linux/arm64,linux/arm/v7,linux/386,linux/riscv64 + if [ -f supported-platforms.txt ]; then + PLATFORM="$(paste -sd',' supported-platforms.txt)" + elif [ -f "../supported-platforms.txt" ]; then + PLATFORM="$(paste -sd',' ../supported-platforms.txt)" + fi + + set -x + + docker buildx build --pull --push \ + -t "$DOCKER_REPO:$VERSION" \ + --platform "$PLATFORM" \ + . + + if [ "$LATEST" = '1' ]; then + docker buildx imagetools create -t "$DOCKER_REPO:latest" "$DOCKER_REPO:$VERSION" + fi + + if [ ! -z "$GHCR_REPO" ] && [ "$GHCR_REPO" != "$DOCKER_REPO" ]; then + docker buildx imagetools create -t "$GHCR_REPO:$VERSION" "$DOCKER_REPO:$VERSION" + + if [ "$LATEST" = '1' ]; then + docker buildx imagetools create -t "$GHCR_REPO:latest" "$GHCR_REPO:$VERSION" + fi + fi + +else + echo "error: $PROJECT_DIR does not contain a build.sh or Dockerfile" >&2 + exit 1 +fi diff --git a/frp/build.sh b/frp/build.sh deleted file mode 100755 index d9d25c2..0000000 --- a/frp/build.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/sh - -set -e - -PROGRAM="$1" -if [ "$PROGRAM" != "frps" ] && [ "$PROGRAM" != "frpc" ]; then - echo "usage: $0 " >&2 - echo >&2 - echo " PROGRAM: frps or frpc" >&2 - exit 1 -fi - -DOCKER_REPO="${DOCKER_REPO:-"leonismoe/$PROGRAM"}" - -LATEST=0 - -if [ -z "$VERSION" ]; then - GIT_BRANCH="$(curl -fsSL https://github.com/fatedier/frp/releases.atom | grep -oE 'releases/tag/[^"]+' | head -n1 | cut -d/ -f3)" - VERSION="${GIT_BRANCH#v}" - LATEST=1 -else - VERSION="${VERSION#v}" - GIT_BRANCH="v${VERSION}" -fi - -docker buildx build --pull --push \ - -t $DOCKER_REPO:$VERSION \ - -f $PROGRAM/Dockerfile \ - --platform linux/amd64,linux/arm64/v8,linux/arm/v6,linux/arm/v7,linux/386,linux/ppc64le,linux/s390x,linux/mips,linux/mipsle,linux/mips64,linux/mips64le,linux/riscv64 \ - --build-arg VERSION=$VERSION \ - --build-arg GIT_BRANCH=$GIT_BRANCH \ - . - -if [ $LATEST -eq 1 ]; then - docker buildx imagetools create -t $DOCKER_REPO:latest $DOCKER_REPO:$VERSION -fi - -if [ ! -z "$GHCR_REPO" ]; then - docker buildx imagetools create -t $GHCR_REPO:$VERSION $DOCKER_REPO:$VERSION - if [ $LATEST -eq 1 ]; then - docker buildx imagetools create -t $GHCR_REPO:latest $DOCKER_REPO:$VERSION - fi -fi diff --git a/frp/frpc/Dockerfile b/frp/frpc/Dockerfile index df1e767..64adcf7 100644 --- a/frp/frpc/Dockerfile +++ b/frp/frpc/Dockerfile @@ -2,7 +2,7 @@ FROM --platform=$BUILDPLATFORM tonistiigi/xx AS xx -FROM --platform=$BUILDPLATFORM golang AS build +FROM --platform=$BUILDPLATFORM golang:1.22 AS build COPY --from=xx / / @@ -14,11 +14,14 @@ ENV GO111MODULE=on \ CGO_ENABLED=0 \ LDFLAGS="-s -w" -ARG GIT_BRANCH +ARG VERSION=0.58.1 # github-releases/fatedier/frp -RUN <\\S+)", + "versioning": "regex:^(?\\d+)(?:\\.(?\\d+))?(?:\\.(?\\d+))(?:[._](?.+?))?(-r(?\\d+))?$", + "followTag": "latest" + } + ], + "customManagers": [ + { + "customType": "regex", + "fileMatch": ["aria2/Dockerfile$"], + "matchStringsStrategy": "any", + "matchStrings": [ + "ARG (?:\\S+_)?VERSION=(?.*) # (?.*?)/(?.*?)(?:\\&versioning=(?.*?))?\\s" + ], + "extractVersionTemplate": "^v?(?.*)$" + }, + { + "customType": "regex", + "fileMatch": ["^renovate.json"], + "matchStringsStrategy": "any", + "matchStrings": [ + "\"defaultRegistryUrlTemplate\"\\s*:\\s*\"https://pkgs.alpinelinux.org/package/(?.*?)/.+?\"" + ], + "extractVersionTemplate": "^v?(?.*)$", + "depNameTemplate": "alpine", + "datasourceTemplate": "docker" + } + ], + "customDatasources": { + "alpine": { + "defaultRegistryUrlTemplate": "https://pkgs.alpinelinux.org/package/v3.20/main/x86_64/{{packageName}}", + "format": "plain", + "transformTemplates": [ + "( $version := releases[version ~> /^\\s*\\d+(\\.\\d+)*(_[a-zA-Z]+\\d+)?-r\\d+\\s*$/].version; { 'releases': [{ 'version': $version }], 'tags': { 'latest': $version } })" + ] + }, + "alpine-community": { + "defaultRegistryUrlTemplate": "https://pkgs.alpinelinux.org/package/v3.20/community/x86_64/{{packageName}}", + "format": "plain", + "transformTemplates": [ + "( $version := releases[version ~> /^\\s*\\d+(\\.\\d+)*(_[a-zA-Z]+\\d+)?-r\\d+\\s*$/].version; { 'releases': [{ 'version': $version }], 'tags': { 'latest': $version } })" + ] + } + } +} \ No newline at end of file diff --git a/test-image-build.sh b/test-image-build.sh new file mode 100755 index 0000000..6dabcb4 --- /dev/null +++ b/test-image-build.sh @@ -0,0 +1,52 @@ +#!/bin/sh + +set -e + +PROJECT_DIR="$1" +if [ -z "$PROJECT_DIR" ]; then + echo "usage: $0 " >&2 + exit 1 +fi + +if [ -f "$PROJECT_DIR/.srcinfo" ]; then + . "$PROJECT_DIR/.srcinfo" +fi + +if [ -z "$PROJECT_NAME" ]; then + PROJECT_NAME="$(basename "$PROJECT_DIR")" +fi + +if [ -z "$DOCKER_REPO" ]; then + if [ ! -z "$DOCKERHUB_NAMESPACE" ]; then + DOCKER_REPO="$DOCKERHUB_NAMESPACE/$PROJECT_NAME" + elif [ ! -z "$GHCR_REPO" ]; then + DOCKER_REPO="$GHCR_REPO" + elif [ ! -z "$GHCR_NAMESPACE" ]; then + DOCKER_REPO="$GHCR_NAMESPACE/$PROJECT_NAME" + else + DOCKER_REPO="localhost/$PROJECT_NAME" + fi +fi + +if [ -f "$PROJECT_DIR/test.sh" ]; then + cd $PROJECT_DIR + DOCKER_REPO="$DOCKER_REPO" ./test.sh + +elif [ -f "$PROJECT_DIR/build.sh" ]; then + cd $PROJECT_DIR + TEST=1 DOCKER_REPO="$DOCKER_REPO" ./build.sh + +elif [ -f "$PROJECT_DIR/subprojects.txt" ]; then + echo "error: project $(dirname "$PROJECT_DIR") contains sub projects, please test them individually" >&2 + exit 1 + +elif [ -f "$PROJECT_DIR/Dockerfile" ]; then + cd $PROJECT_DIR + + docker buildx build --pull -t $DOCKER_REPO:test . + docker rmi $DOCKER_REPO:test + +else + echo "error: $PROJECT_DIR does not contain a build.sh or Dockerfile" >&2 + exit 1 +fi