From 3d3b0a86a824512b5bf89b0b8e3bd9837f927b15 Mon Sep 17 00:00:00 2001 From: Christian Segundo Date: Sat, 20 Dec 2025 06:39:33 +0100 Subject: Move build to Gitea --- .gitea/workflows/main.yml | 80 +++++++++++++++++++++++++++++++++++++++++++++++ .scripts.d/10-check.sh | 16 ++-------- .scripts.d/20-build.sh | 24 ++++++++------ .scripts.d/30-test.sh | 17 +++++++--- .scripts.d/40-publish.sh | 63 +++++++++++++++++-------------------- Dockerfile | 6 ++-- Jenkinsfile | 33 ------------------- 7 files changed, 143 insertions(+), 96 deletions(-) create mode 100644 .gitea/workflows/main.yml delete mode 100644 Jenkinsfile diff --git a/.gitea/workflows/main.yml b/.gitea/workflows/main.yml new file mode 100644 index 0000000..25f2393 --- /dev/null +++ b/.gitea/workflows/main.yml @@ -0,0 +1,80 @@ +name: Build and Push Docker Image +on: + push: {} + pull_request: {} + schedule: + - cron: '0 */6 * * *' + workflow_dispatch: {} + +jobs: + find-latest-version: + runs-on: ubuntu-latest + container: + image: gitea.segundo.io/docker/ci-base:latest + credentials: + username: "${GITEA_REGISTRY_TOKEN}" + password: "${GITEA_REGISTRY_USER}" + outputs: + lt-version: ${{ steps.find-lt-version.outputs.lt-version }} + steps: + - uses: actions/checkout@v5 + - id: find-lt-version + run: | + curl --silent --fail https://languagetool.org/download/ | + grep -o 'href=".*">' | + grep -Po '="\K[^"]+' | + grep -Po 'LanguageTool-\K\d\.\d+' | + sort -V | + tail -n 1 | + xargs -I {} echo "lt-version={}" >> $GITHUB_OUTPUT + + check: + runs-on: ubuntu-latest + container: ghcr.io/super-linter/super-linter:latest + steps: + - uses: actions/checkout@v5 + - run: | + bash .scripts.d/10-check.sh + + build: + runs-on: ubuntu-latest + needs: [find-latest-version, check] + env: + LT_VERSION: ${{ needs.find-latest-version.outputs.lt-version }} + container: + image: gitea.segundo.io/docker/ci-base:latest + credentials: + username: "${GITEA_REGISTRY_TOKEN}" + password: "${GITEA_REGISTRY_USER}" + steps: + - uses: actions/checkout@v5 + - run: | + bash .scripts.d/20-build.sh + + test: + runs-on: ubuntu-latest + needs: build + container: + image: gitea.segundo.io/docker/ci-base:latest + credentials: + username: "${GITEA_REGISTRY_TOKEN}" + password: "${GITEA_REGISTRY_USER}" + steps: + - uses: actions/checkout@v5 + - run: | + bash .scripts.d/30-test.sh + + publish: + runs-on: ubuntu-latest + needs: [find-latest-version, test] + env: + LT_VERSION: ${{ needs.find-latest-version.outputs.lt-version }} + container: + image: gitea.segundo.io/docker/ci-base:latest + credentials: + username: "${GITEA_REGISTRY_TOKEN}" + password: "${GITEA_REGISTRY_USER}" + steps: + - uses: actions/checkout@v5 + - run: | + bash .scripts.d/40-publish.sh diff --git a/.scripts.d/10-check.sh b/.scripts.d/10-check.sh index e8ddf59..71b3ab6 100644 --- a/.scripts.d/10-check.sh +++ b/.scripts.d/10-check.sh @@ -1,22 +1,12 @@ #!/bin/bash -# vim: ai:ts=8:sw=8:noet set -EeufCo pipefail export SHELLOPTS # propagate set to children by default IFS=$'\t\n' # check required commands are in place -command -v shellcheck >/dev/null 2>&1 || { - echo 'please install shellcheck' - exit 1 -} -command -v hadolint >/dev/null 2>&1 || { - echo 'please install hadolint' - exit 1 -} -command -v yamllint >/dev/null 2>&1 || { - echo 'please install yamllint' - exit 1 -} +command -v shellcheck >/dev/null 2>&1 || { echo 'please install shellcheck'; exit 1; } +command -v hadolint >/dev/null 2>&1 || { echo 'please install hadolint'; exit 1; } +command -v yamllint >/dev/null 2>&1 || { echo 'please install yamllint'; exit 1; } # check all the Dockerfiles with hadolint find . \ diff --git a/.scripts.d/20-build.sh b/.scripts.d/20-build.sh index 56af8df..b077ac3 100644 --- a/.scripts.d/20-build.sh +++ b/.scripts.d/20-build.sh @@ -5,14 +5,20 @@ export SHELLOPTS # propagate set to children by default IFS=$'\t\n' # check required commands are in place -command -v docker >/dev/null 2>&1 || { - echo 'please install docker-client' - exit 1 -} +command -v docker >/dev/null 2>&1 || { echo 'please install docker-client'; exit 1; } +# shellcheck disable=SC2001 +REGISTRY=$(echo "${GITHUB_SERVER_URL}" | sed -e 's|^[^/]*//||') +TAG="${GITHUB_RUN_ID}" +IMAGE_NAME="${REGISTRY}/${GITHUB_REPOSITORY,,}:${TAG}" + +echo "${GITEA_REGISTRY_TOKEN}" | + docker login "${REGISTRY}" -u "${GITEA_REGISTRY_USER}" --password-stdin + +docker buildx create --name builder --use --bootstrap docker buildx build \ - --no-cache \ - --pull \ - --load \ - --tag "chn2guevara/languagetool:${BUILD_ID}" \ - . + --platform linux/amd64,linux/arm64 \ + --tag "${IMAGE_NAME}" \ + --build-arg VERSION="${LT_VERSION}" \ + --push \ + . diff --git a/.scripts.d/30-test.sh b/.scripts.d/30-test.sh index a357caf..ae4e78c 100644 --- a/.scripts.d/30-test.sh +++ b/.scripts.d/30-test.sh @@ -13,10 +13,11 @@ command -v docker >/dev/null 2>&1 || { # install goss curl -fsSL https://goss.rocks/install | sh -export GOSS_SLEEP=${GOSS_SLEEP:-30} +export GOSS_SLEEP=${GOSS_SLEEP:-60} export GOSS_VARS=${GOSS_VARS:-} export GOSS_ADDITIONAL_COPY_PATH=${GOSS_ADDITIONAL_COPY_PATH:-} -export GOSS_OPTS="--format junit --no-color" +export GOSS_OPTS="--no-color" +export DEBUG=false export CONTAINER_LOG_OUTPUT=${CONTAINER_LOG_OUTPUT:-} # The default 'mount' strategy uses 'sleep infinity' to keep @@ -29,6 +30,12 @@ fi goss --gossfile goss.yaml render >goss-full.yaml mv goss-full.yaml goss.yaml -rm -rf build/reports/ -mkdir -p build/reports/ -dgoss run "chn2guevara/languagetool:${BUILD_ID}" > build/reports/goss.xml +# shellcheck disable=SC2001 +REGISTRY=$(echo "${GITHUB_SERVER_URL}" | sed -e 's|^[^/]*//||') +TAG="${GITHUB_RUN_ID}" +IMAGE_NAME="${REGISTRY}/${GITHUB_REPOSITORY,,}:${TAG}" + +echo "${GITEA_REGISTRY_TOKEN}" | + docker login "${REGISTRY}" -u "${GITEA_REGISTRY_USER}" --password-stdin + +dgoss run "${IMAGE_NAME}" diff --git a/.scripts.d/40-publish.sh b/.scripts.d/40-publish.sh index 58ef019..68820d0 100644 --- a/.scripts.d/40-publish.sh +++ b/.scripts.d/40-publish.sh @@ -5,41 +5,36 @@ export SHELLOPTS # propagate set to children by default IFS=$'\t\n' # check required commands are in place -command -v docker >/dev/null 2>&1 || { - echo 'please install docker-client' - exit 1 -} +command -v docker >/dev/null 2>&1 || { echo 'please install docker-client'; exit 1; } -docker login --username "chn2guevara" \ - --password-stdin <<<"$DOCKERHUB_TOKEN" +# shellcheck disable=SC2001 +REGISTRY=$(echo "${GITHUB_SERVER_URL}" | sed -e 's|^[^/]*//||') +TAG="${GITHUB_RUN_ID}" +IMAGE_TEST_NAME="${REGISTRY}/${GITHUB_REPOSITORY,,}:${TAG}" +IMAGE_INTERNAL_RELEASE_NAME_VERSIONED="${REGISTRY}/${GITHUB_REPOSITORY,,}:${LT_VERSION}" +IMAGE_INTERNAL_RELEASE_NAME_LATEST="${REGISTRY}/${GITHUB_REPOSITORY,,}:latest" +IMAGE_EXTERNAL_RELEASE_NAME_VERSIONED="docker.io/${DOCKERHUB_REGISTRY_USER}/languagetool:${LT_VERSION}" +IMAGE_EXTERNAL_RELEASE_NAME_LATEST="docker.io/${DOCKERHUB_REGISTRY_USER}/languagetool:latest" -BUILDER_SUFFIX=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 5 ; echo '') -docker run --privileged --rm tonistiigi/binfmt --install arm64 -docker buildx create --use --name "multi-arch-builder-${BUILDER_SUFFIX}" -trap "docker buildx rm 'multi-arch-builder-""${BUILDER_SUFFIX}""'" EXIT +docker login "${REGISTRY}" -u "${GITEA_REGISTRY_USER}" --password-stdin <<<"${GITEA_REGISTRY_TOKEN}" +docker login docker.io -u "${DOCKERHUB_REGISTRY_USER}" --password-stdin <<<"${DOCKERHUB_REGISTRY_TOKEN}" -DOCKER_TAG="latest" -if [ "$BRANCH_NAME" != "master" ]; then - DOCKER_TAG="${BRANCH_NAME//\//-}" -fi +skopeo copy \ + --all \ + "docker://${IMAGE_TEST_NAME}" \ + "docker://${IMAGE_INTERNAL_RELEASE_NAME_VERSIONED}" -if [ "$(git tag --contains)" = "" ]; then - docker buildx build \ - --platform linux/amd64,linux/arm64 \ - --builder "multi-arch-builder-${BUILDER_SUFFIX}" \ - --no-cache \ - --pull \ - --push \ - --tag "chn2guevara/languagetool:${DOCKER_TAG}" \ - . -else - docker buildx build \ - --platform linux/amd64,linux/arm64 \ - --builder "multi-arch-builder-${BUILDER_SUFFIX}" \ - --no-cache \ - --pull \ - --push \ - --tag "chn2guevara/languagetool:${DOCKER_TAG}" \ - --tag "chn2guevara/languagetool:$(git tag --contains | head -1)" \ - . -fi +skopeo copy \ + --all \ + "docker://${IMAGE_TEST_NAME}" \ + "docker://${IMAGE_INTERNAL_RELEASE_NAME_LATEST}" + +skopeo copy \ + --all \ + "docker://${IMAGE_TEST_NAME}" \ + "docker://${IMAGE_EXTERNAL_RELEASE_NAME_VERSIONED}" + +skopeo copy \ + --all \ + "docker://${IMAGE_TEST_NAME}" \ + "docker://${IMAGE_EXTERNAL_RELEASE_NAME_LATEST}" diff --git a/Dockerfile b/Dockerfile index 079da19..92fa335 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,7 @@ -FROM openjdk:slim +# hadolint ignore=DL3007 +FROM eclipse-temurin:latest -ARG VERSION=6.4 +ARG VERSION=6.6 WORKDIR /home/languagetool @@ -8,6 +9,7 @@ SHELL ["/bin/bash", "-eufo", "pipefail", "-c"] # hadolint ignore=DL3008 RUN \ + userdel ubuntu && \ groupadd -g 1000 languagetool && \ adduser \ --uid 1000 \ diff --git a/Jenkinsfile b/Jenkinsfile deleted file mode 100644 index a16496b..0000000 --- a/Jenkinsfile +++ /dev/null @@ -1,33 +0,0 @@ -String cron_string = BRANCH_NAME == "master" ? "@weekly" : "" - -pipeline { - agent any - triggers { cron(cron_string) } - options { ansiColor('xterm') } - stages { - stage('Check') { - agent { - docker { - image 'ghcr.io/super-linter/super-linter:latest' - args '--entrypoint ""' - } - } - steps { sh 'bash .scripts.d/10-check.sh' } - } - stage('Build') { steps { sh 'bash .scripts.d/20-build.sh' } } - stage('Test') { steps { sh 'bash .scripts.d/30-test.sh' } } - stage('Publish') { - environment { DOCKERHUB_TOKEN = credentials('DOCKERHUB_TOKEN') } - steps { sh 'bash .scripts.d/40-publish.sh' } - } - } - post { - always { - junit 'build/reports/*.xml' - step([$class: 'Mailer', - notifyEveryUnstableBuild: true, - recipients: "christian+jenkins@segundo.io", - sendToIndividuals: true]) - } - } -} -- cgit v1.2.3