diff --git a/.lighthouse/pipeline-foreign-document-test.yaml b/.lighthouse/pipeline-foreign-document-test.yaml new file mode 100644 index 0000000..e71302b --- /dev/null +++ b/.lighthouse/pipeline-foreign-document-test.yaml @@ -0,0 +1,203 @@ +apiVersion: tekton.dev/v1beta1 +kind: PipelineRun +metadata: + name: rust-foreign-document-test +spec: + pipelineSpec: + timeouts: + pipeline: "2h0m0s" + tasks: "1h0m40s" + finally: "0h30m0s" + params: + - name: image-name + description: The name for the built image + type: string + - name: path-to-image-context + description: The path to the build context + type: string + - name: path-to-dockerfile + description: The path to the Dockerfile + type: string + tasks: + - name: do-stuff + taskSpec: + metadata: {} + stepTemplate: + image: alpine:3.18 + name: "" + resources: + requests: + cpu: 10m + memory: 600Mi + workingDir: /workspace/source + steps: + - image: alpine:3.18 + name: do-stuff-step + script: | + #!/usr/bin/env sh + echo "hello world" + - name: report-pending + taskRef: + name: gitea-set-status + runAfter: + - fetch-repository + params: + - name: CONTEXT + value: "$(params.JOB_NAME)" + - name: REPO_FULL_NAME + value: "$(params.REPO_OWNER)/$(params.REPO_NAME)" + - name: GITEA_HOST_URL + value: code.fizz.buzz + - name: SHA + value: "$(tasks.fetch-repository.results.commit)" + - name: DESCRIPTION + value: "Build $(params.JOB_NAME) has started" + - name: STATE + value: pending + - name: TARGET_URL + value: "https://tekton.fizz.buzz/#/namespaces/$(context.pipelineRun.namespace)/pipelineruns/$(context.pipelineRun.name)" + - name: fetch-repository + taskRef: + name: git-clone + workspaces: + - name: output + workspace: git-source + params: + - name: url + value: $(params.REPO_URL) + - name: revision + value: $(params.PULL_BASE_SHA) + - name: deleteExisting + value: "true" + - name: build-image + taskRef: + name: kaniko + params: + - name: IMAGE + value: "$(params.image-name):$(tasks.fetch-repository.results.commit)" + - name: CONTEXT + value: $(params.path-to-image-context) + - name: DOCKERFILE + value: $(params.path-to-dockerfile) + - name: BUILDER_IMAGE + value: "gcr.io/kaniko-project/executor:v1.12.1" + - name: EXTRA_ARGS + value: + - --target=foreign-document-test + - --cache=true + - --cache-copy-layers + - --cache-repo=harbor.fizz.buzz/kanikocache/cache + - --use-new-run # Should result in a speed-up + - --reproducible # To remove timestamps so layer caching works. + - --snapshot-mode=redo + - --skip-unused-stages=true + - --registry-mirror=dockerhub.dockerhub.svc.cluster.local + workspaces: + - name: source + workspace: git-source + - name: dockerconfig + workspace: docker-credentials + runAfter: + - fetch-repository + - name: run-image + taskRef: + name: run-docker-image + workspaces: + - name: source + workspace: git-source + - name: cargo-cache + workspace: cargo-cache + runAfter: + - build-image + params: + - name: docker-image + value: "$(params.image-name):$(tasks.fetch-repository.results.commit)" + finally: + - name: report-success + when: + - input: "$(tasks.status)" + operator: in + values: ["Succeeded", "Completed"] + taskRef: + name: gitea-set-status + params: + - name: CONTEXT + value: "$(params.JOB_NAME)" + - name: REPO_FULL_NAME + value: "$(params.REPO_OWNER)/$(params.REPO_NAME)" + - name: GITEA_HOST_URL + value: code.fizz.buzz + - name: SHA + value: "$(tasks.fetch-repository.results.commit)" + - name: DESCRIPTION + value: "Build $(params.JOB_NAME) has succeeded" + - name: STATE + value: success + - name: TARGET_URL + value: "https://tekton.fizz.buzz/#/namespaces/$(context.pipelineRun.namespace)/pipelineruns/$(context.pipelineRun.name)" + - name: report-failure + when: + - input: "$(tasks.status)" + operator: in + values: ["Failed"] + taskRef: + name: gitea-set-status + params: + - name: CONTEXT + value: "$(params.JOB_NAME)" + - name: REPO_FULL_NAME + value: "$(params.REPO_OWNER)/$(params.REPO_NAME)" + - name: GITEA_HOST_URL + value: code.fizz.buzz + - name: SHA + value: "$(tasks.fetch-repository.results.commit)" + - name: DESCRIPTION + value: "Build $(params.JOB_NAME) has failed" + - name: STATE + value: failure + - name: TARGET_URL + value: "https://tekton.fizz.buzz/#/namespaces/$(context.pipelineRun.namespace)/pipelineruns/$(context.pipelineRun.name)" + - name: cargo-cache-autoclean + taskRef: + name: run-docker-image + workspaces: + - name: source + workspace: git-source + - name: cargo-cache + workspace: cargo-cache + params: + - name: command + value: [cargo, cache, --autoclean] + - name: args + value: [] + - name: docker-image + value: "$(params.image-name):$(tasks.fetch-repository.results.commit)" + workspaces: + - name: git-source + - name: docker-credentials + - name: cargo-cache + workspaces: + - name: git-source + volumeClaimTemplate: + spec: + storageClassName: "nfs-client" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + subPath: rust-source + - name: cargo-cache + persistentVolumeClaim: + claimName: organic-cargo-cache-test-foreign-document + - name: docker-credentials + secret: + secretName: harbor-plain + serviceAccountName: build-bot + params: + - name: image-name + value: "harbor.fizz.buzz/private/organic-test-foreign-document" + - name: path-to-image-context + value: docker/organic_test/ + - name: path-to-dockerfile + value: docker/organic_test/Dockerfile diff --git a/.lighthouse/pipeline-rust-test.yaml b/.lighthouse/pipeline-rust-test.yaml index c1b2716..e5b05bf 100644 --- a/.lighthouse/pipeline-rust-test.yaml +++ b/.lighthouse/pipeline-rust-test.yaml @@ -83,6 +83,7 @@ spec: value: "gcr.io/kaniko-project/executor:v1.12.1" - name: EXTRA_ARGS value: + - --target=tester - --cache=true - --cache-copy-layers - --cache-repo=harbor.fizz.buzz/kanikocache/cache diff --git a/.lighthouse/triggers.yaml b/.lighthouse/triggers.yaml index 8ddddee..521b20c 100644 --- a/.lighthouse/triggers.yaml +++ b/.lighthouse/triggers.yaml @@ -16,6 +16,13 @@ spec: skip_branches: # We already run on every commit, so running when the semver tags get pushed is causing needless double-processing. - "^v[0-9]+\\.[0-9]+\\.[0-9]+$" + - name: rust-foreign-document-test + source: "pipeline-foreign-document-test.yaml" + # Override https-based url from lighthouse events. + clone_uri: "git@code.fizz.buzz:talexander/organic.git" + skip_branches: + # We already run on every commit, so running when the semver tags get pushed is causing needless double-processing. + - "^v[0-9]+\\.[0-9]+\\.[0-9]+$" - name: rust-build source: "pipeline-rust-build.yaml" # Override https-based url from lighthouse events. diff --git a/Makefile b/Makefile index d8a2b07..537f634 100644 --- a/Makefile +++ b/Makefile @@ -42,6 +42,10 @@ dockertest: > $(MAKE) -C docker/organic_test > docker run --init --rm -i -t --read-only -v "$$(readlink -f ./):/source:ro" --mount type=tmpfs,destination=/tmp --mount source=cargo-cache,target=/usr/local/cargo/registry --mount source=rust-cache,target=/target --env CARGO_TARGET_DIR=/target -w /source organic-test --no-default-features --features compare --no-fail-fast --lib --test test_loader -- --test-threads $(TESTJOBS) +.PHONY: foreign_document_test +foreign_document_test: +> $(MAKE) -C docker/organic_test run_foreign_document_test + .PHONY: dockerclean dockerclean: # Delete volumes created for running the tests in docker. This does not touch anything related to the jaeger docker container. diff --git a/docker/cargo_fmt/Makefile b/docker/cargo_fmt/Makefile index 8d50935..fff467b 100644 --- a/docker/cargo_fmt/Makefile +++ b/docker/cargo_fmt/Makefile @@ -6,7 +6,7 @@ all: build push .PHONY: build build: - docker build -t $(IMAGE_NAME) -f Dockerfile ../../ + docker build -t $(IMAGE_NAME) -f Dockerfile . .PHONY: push push: diff --git a/docker/organic_build/Makefile b/docker/organic_build/Makefile index c933de6..ab76282 100644 --- a/docker/organic_build/Makefile +++ b/docker/organic_build/Makefile @@ -6,7 +6,7 @@ all: build push .PHONY: build build: - docker build -t $(IMAGE_NAME) -f Dockerfile ../../ + docker build -t $(IMAGE_NAME) -f Dockerfile . .PHONY: push push: diff --git a/docker/organic_test/Dockerfile b/docker/organic_test/Dockerfile index 05a3216..927b8ed 100644 --- a/docker/organic_test/Dockerfile +++ b/docker/organic_test/Dockerfile @@ -25,7 +25,7 @@ RUN make compile RUN make DESTDIR="/root/dist" install -FROM rustlang/rust:nightly-alpine3.17 +FROM rustlang/rust:nightly-alpine3.17 AS tester ENV LANG=en_US.UTF-8 RUN apk add --no-cache musl-dev ncurses gnutls RUN cargo install --locked --no-default-features --features ci-autoclean cargo-cache @@ -33,3 +33,16 @@ COPY --from=build-emacs /root/dist/ / COPY --from=build-org-mode /root/dist/ / ENTRYPOINT ["cargo", "test"] + + +FROM build as foreign-document-gather +RUN mkdir /foreign_documents + + +FROM tester as foreign-document-test +RUN apk add --no-cache bash +RUN mkdir /foreign_documents +COPY --from=build-org-mode /root/org-mode/doc /foreign_documents/org-mode +COPY foreign_document_test_entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh +ENTRYPOINT ["/entrypoint.sh"] diff --git a/docker/organic_test/Makefile b/docker/organic_test/Makefile index f8133ad..61280bb 100644 --- a/docker/organic_test/Makefile +++ b/docker/organic_test/Makefile @@ -6,7 +6,11 @@ all: build push .PHONY: build build: - docker build -t $(IMAGE_NAME) -f Dockerfile ../../ + docker build -t $(IMAGE_NAME) -f Dockerfile --target tester . + +.PHONY: build_foreign_document_test +build_foreign_document_test: + docker build -t $(IMAGE_NAME)-foreign-document -f Dockerfile --target foreign-document-test . .PHONY: push push: @@ -34,3 +38,7 @@ run: build .PHONY: shell shell: build docker run --rm -i -t --entrypoint /bin/sh --mount type=tmpfs,destination=/tmp -v "$$(readlink -f ../../):/source:ro" --workdir=/source --mount source=cargo-cache,target=/usr/local/cargo/registry --mount source=rust-cache,target=/target --env CARGO_TARGET_DIR=/target $(IMAGE_NAME) + +.PHONY: run_foreign_document_test +run_foreign_document_test: build_foreign_document_test + docker run --rm --init --read-only --mount type=tmpfs,destination=/tmp -v "$$(readlink -f ../../):/source:ro" --workdir=/source --mount source=cargo-cache,target=/usr/local/cargo/registry --mount source=rust-cache,target=/target --env CARGO_TARGET_DIR=/target $(IMAGE_NAME)-foreign-document diff --git a/docker/organic_test/foreign_document_test_entrypoint.sh b/docker/organic_test/foreign_document_test_entrypoint.sh new file mode 100644 index 0000000..8f0c90f --- /dev/null +++ b/docker/organic_test/foreign_document_test_entrypoint.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash +# +# Run the Organic compare script against a series of documents sourced from exterior places. +set -euo pipefail +IFS=$'\n\t' +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +function log { + (>&2 echo "${@}") +} + +function die { + local status_code="$1" + shift + (>&2 echo "${@}") + exit "$status_code" +} + +function main { + cargo build --no-default-features --features compare --profile release-lto + if [ "${CARGO_TARGET_DIR:-}" = "" ]; then + CARGO_TARGET_DIR=$(realpath target/) + fi + PARSE="${CARGO_TARGET_DIR}/release-lto/parse" + + run_compare "org-mode/org-guide.org" "/foreign_documents/org-mode/org-guide.org" + run_compare "org-mode/org-manual.org" "/foreign_documents/org-mode/org-manual.org" +} + +function run_compare { + local name="$1" + local target_document="$2" + set +e + $PARSE "$target_document" &> /dev/null + local status=$? + set -e + if [ "$status" -eq 0 ]; then + echo "$(green_text "GOOD") $name" + else + echo "$(red_text "FAIL") $name" + return 1 + fi +} + +function green_text { + (IFS=' '; printf '\x1b[38;2;0;255;0m%s\x1b[0m' "${*}") +} + +function red_text { + (IFS=' '; printf '\x1b[38;2;255;0;0m%s\x1b[0m' "${*}") +} + +function yellow_text { + (IFS=' '; printf '\x1b[38;2;255;255;0m%s\x1b[0m' "${*}") +} + +main "${@}"