Creado apartir del commit b888de6c92056de294456f581a56e25e734d4ab7 de develop
This commit is contained in:
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
@@ -0,0 +1,343 @@
|
||||
steps:
|
||||
collect_inputs:
|
||||
image: alpine:3.20
|
||||
# Se ejecuta en todas las ramas: features, env/adas/dev, env/adas/pre
|
||||
commands:
|
||||
- set -eu
|
||||
- apk add --no-cache jq coreutils git findutils
|
||||
- mkdir -p ci-evidence/test-results
|
||||
- SHORT_SHA="$(printf "%s" "${DRONE_COMMIT_SHA}" | cut -c1-12)"
|
||||
- BUILD_TIME="$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
|
||||
- ENV_NAME="$(printf "%s" "${DRONE_BRANCH}" | sed 's|env/adas/||')"
|
||||
- RELEASE_ID="${RELEASE_ID:-REL-${ENV_NAME}-${DRONE_BUILD_NUMBER}-${SHORT_SHA}}"
|
||||
- echo "$BUILD_TIME" > ci-evidence/build-time.txt
|
||||
- echo "${DRONE_COMMIT_SHA}" > ci-evidence/commit-sha.txt
|
||||
- echo "${SHORT_SHA}" > ci-evidence/commit-short.txt
|
||||
- echo "${DRONE_BRANCH}" > ci-evidence/branch.txt
|
||||
- echo "${ENV_NAME}" > ci-evidence/env-name.txt
|
||||
- echo "${DRONE_BUILD_NUMBER}" > ci-evidence/pipeline-id.txt
|
||||
- echo "${RELEASE_ID}" > ci-evidence/release-id.txt
|
||||
- echo "Teralevel CI" > ci-evidence/ci-tool.txt
|
||||
- git rev-parse --short HEAD > ci-evidence/git-short-head.txt
|
||||
- git rev-parse HEAD > ci-evidence/git-full-head.txt
|
||||
- git status --short > ci-evidence/git-status.txt || true
|
||||
- |
|
||||
find . \
|
||||
-maxdepth 4 \
|
||||
-type f \
|
||||
\( -name 'Dockerfile' -o -name '.teralevel-ci.yml' -o -name '*.sln' -o -name '*.csproj' -o -name 'nuget.config' \) \
|
||||
! -path '*/bin/*' \
|
||||
! -path '*/obj/*' \
|
||||
-exec sha256sum {} \; > ci-evidence/input-checksums.txt || true
|
||||
- |
|
||||
jq -n \
|
||||
--arg release_id "$RELEASE_ID" \
|
||||
--arg ur_prd_version "${UR_PRD_VERSION:-PENDIENTE}" \
|
||||
--arg srs_version "${SRS_VERSION:-PENDIENTE}" \
|
||||
--arg rmf_version "${RMF_VERSION:-PENDIENTE}" \
|
||||
--arg trace_version "${TRACE_MATRIX_VERSION:-PENDIENTE}" \
|
||||
--arg sbom_ref "ci-evidence/sbom-cyclonedx.json" \
|
||||
'{
|
||||
release_id: $release_id,
|
||||
ur_prd_version: $ur_prd_version,
|
||||
srs_version: $srs_version,
|
||||
rmf_version: $rmf_version,
|
||||
traceability_matrix_version: $trace_version,
|
||||
sbom_reference: $sbom_ref
|
||||
}' > ci-evidence/release-baseline-ref.json
|
||||
|
||||
test_backend:
|
||||
image: mcr.microsoft.com/dotnet/sdk:8.0
|
||||
# Se ejecuta en todas las ramas: features, env/adas/dev, env/adas/pre
|
||||
environment:
|
||||
ADAS_NUGET_URL:
|
||||
from_secret: ADAS_NUGET_URL
|
||||
commands:
|
||||
- set -eu
|
||||
- mkdir -p ci-evidence/test-results/dotnet
|
||||
- dotnet --info > ci-evidence/dotnet-info.txt
|
||||
- (dotnet nuget add source "${ADAS_NUGET_URL}" -n "ADAS Nugget Server") 2>/dev/null || true
|
||||
- dotnet restore "adas-core/adas-core.csproj"
|
||||
- dotnet restore "./adas-core.Test/adas-core.Test.csproj"
|
||||
- set +e
|
||||
- dotnet build --configuration Debug /p:Platform=x64 /nowarn:1701,1702,IL2121,CS1591,CS1587,CA1416 "adas-core/adas-core.csproj"
|
||||
- BUILD_EXIT=$?
|
||||
- dotnet test --configuration Debug /p:Platform=x64 /nowarn:1701,1702,IL2121,CS1591,CS1587,CA1416 "./adas-core.Test/adas-core.Test.csproj" --results-directory ci-evidence/test-results/dotnet --logger "trx;LogFileName=adas-core-tests.trx"
|
||||
- TEST_EXIT=$?
|
||||
- set -e
|
||||
- |
|
||||
cat > ci-evidence/test-results/dotnet-summary.json <<EOF
|
||||
{
|
||||
"status": "executed",
|
||||
"build_exit_code": ${BUILD_EXIT},
|
||||
"test_exit_code": ${TEST_EXIT},
|
||||
"build_target": "adas-core/adas-core.csproj",
|
||||
"test_target": "./adas-core.Test/adas-core.Test.csproj"
|
||||
}
|
||||
EOF
|
||||
- test "$BUILD_EXIT" -eq 0
|
||||
- test "$TEST_EXIT" -eq 0
|
||||
|
||||
build_and_push:
|
||||
# Requiere que el runner CI tenga /var/run/docker.sock montado (daemon Docker en CI)
|
||||
image: docker:27-cli
|
||||
when:
|
||||
branch:
|
||||
- env/adas/dev
|
||||
- env/adas/pre
|
||||
environment:
|
||||
CI_REGISTRY_USER:
|
||||
from_secret: CI_REGISTRY_USER
|
||||
CI_REGISTRY_PASSWORD:
|
||||
from_secret: CI_REGISTRY_PASSWORD
|
||||
CI_REGISTRY:
|
||||
from_secret: CI_REGISTRY
|
||||
commands:
|
||||
- set -eu
|
||||
- mkdir -p ci-evidence
|
||||
- docker login "${CI_REGISTRY}" -u "${CI_REGISTRY_USER}" -p "${CI_REGISTRY_PASSWORD}"
|
||||
- SHORT_SHA="$(cat ci-evidence/commit-short.txt)"
|
||||
- PIPELINE_ID="$(cat ci-evidence/pipeline-id.txt)"
|
||||
- ENV_NAME="$(cat ci-evidence/env-name.txt)"
|
||||
- IMAGE_REPO="${CI_REGISTRY}/adas/adas-core/adas-core"
|
||||
- IMAGE_TAG_IMMUTABLE="${ENV_NAME}-${PIPELINE_ID}-${SHORT_SHA}"
|
||||
- IMAGE_REF_IMMUTABLE="${IMAGE_REPO}:${IMAGE_TAG_IMMUTABLE}"
|
||||
- IMAGE_REF_MUTABLE="${IMAGE_REPO}:${ENV_NAME}-latest"
|
||||
- echo "$IMAGE_REF_IMMUTABLE" > ci-evidence/image-ref-immutable.txt
|
||||
- echo "$IMAGE_REF_MUTABLE" > ci-evidence/image-ref-mutable.txt
|
||||
- docker version > ci-evidence/docker-version.txt
|
||||
- |
|
||||
docker build \
|
||||
--label org.opencontainers.image.revision="${DRONE_COMMIT_SHA}" \
|
||||
--label org.opencontainers.image.version="${IMAGE_TAG_IMMUTABLE}" \
|
||||
--label org.opencontainers.image.created="$(cat ci-evidence/build-time.txt)" \
|
||||
-t "${IMAGE_REF_IMMUTABLE}" \
|
||||
-t "${IMAGE_REF_MUTABLE}" \
|
||||
-f Dockerfile \
|
||||
. > ci-evidence/docker-build.log 2>&1 || { cat ci-evidence/docker-build.log; exit 1; }
|
||||
- docker push "${IMAGE_REF_IMMUTABLE}" 2>&1 | tee -a ci-evidence/docker-build.log
|
||||
- docker push "${IMAGE_REF_MUTABLE}" 2>&1 | tee -a ci-evidence/docker-build.log
|
||||
- |
|
||||
docker image inspect "${IMAGE_REF_IMMUTABLE}" \
|
||||
--format '{{index .RepoDigests 0}}' > ci-evidence/image-digest.txt 2>/dev/null \
|
||||
|| docker image inspect "${IMAGE_REF_IMMUTABLE}" \
|
||||
--format '{{.Id}}' > ci-evidence/image-digest.txt
|
||||
- cat ci-evidence/docker-build.log
|
||||
|
||||
generate_sbom:
|
||||
image: anchore/syft:v1.18.1
|
||||
when:
|
||||
branch:
|
||||
- env/adas/dev
|
||||
- env/adas/pre
|
||||
environment:
|
||||
CI_REGISTRY_USER:
|
||||
from_secret: CI_REGISTRY_USER
|
||||
CI_REGISTRY_PASSWORD:
|
||||
from_secret: CI_REGISTRY_PASSWORD
|
||||
CI_REGISTRY:
|
||||
from_secret: CI_REGISTRY
|
||||
commands:
|
||||
- set -eu
|
||||
- mkdir -p /root/.docker ci-evidence
|
||||
- |
|
||||
cat > /root/.docker/config.json <<EOF
|
||||
{
|
||||
"auths": {
|
||||
"${CI_REGISTRY}": {
|
||||
"username": "${CI_REGISTRY_USER}",
|
||||
"password": "${CI_REGISTRY_PASSWORD}"
|
||||
}
|
||||
}
|
||||
}
|
||||
EOF
|
||||
- IMAGE_REF_IMMUTABLE="$(cat ci-evidence/image-ref-immutable.txt)"
|
||||
- syft version > ci-evidence/syft-version.txt
|
||||
- syft "${IMAGE_REF_IMMUTABLE}" -o cyclonedx-json=ci-evidence/sbom-cyclonedx.json
|
||||
- syft "${IMAGE_REF_IMMUTABLE}" -o spdx-json=ci-evidence/sbom-spdx.json
|
||||
|
||||
assemble_ci_evidence_predeploy:
|
||||
image: alpine:3.20
|
||||
when:
|
||||
branch:
|
||||
- env/adas/dev
|
||||
- env/adas/pre
|
||||
commands:
|
||||
- set -eu
|
||||
- apk add --no-cache jq coreutils
|
||||
- BUILD_TIME="$(cat ci-evidence/build-time.txt)"
|
||||
- COMMIT_SHA="$(cat ci-evidence/commit-sha.txt)"
|
||||
- SHORT_SHA="$(cat ci-evidence/commit-short.txt)"
|
||||
- BRANCH="$(cat ci-evidence/branch.txt)"
|
||||
- ENV_NAME="$(cat ci-evidence/env-name.txt)"
|
||||
- PIPELINE_ID="$(cat ci-evidence/pipeline-id.txt)"
|
||||
- RELEASE_ID="$(cat ci-evidence/release-id.txt)"
|
||||
- IMAGE_REF_IMMUTABLE="$(cat ci-evidence/image-ref-immutable.txt)"
|
||||
- IMAGE_REF_MUTABLE="$(cat ci-evidence/image-ref-mutable.txt)"
|
||||
- IMAGE_DIGEST="$(cat ci-evidence/image-digest.txt)"
|
||||
- DOTNET_SUMMARY="$(cat ci-evidence/test-results/dotnet-summary.json)"
|
||||
- |
|
||||
jq -n \
|
||||
--arg project "ADAS" \
|
||||
--arg component "adas-core" \
|
||||
--arg environment "$ENV_NAME" \
|
||||
--arg release_id "$RELEASE_ID" \
|
||||
--arg build_time_utc "$BUILD_TIME" \
|
||||
--arg commit_sha "$COMMIT_SHA" \
|
||||
--arg commit_short "$SHORT_SHA" \
|
||||
--arg branch "$BRANCH" \
|
||||
--arg pipeline_id "$PIPELINE_ID" \
|
||||
--arg ci_tool "Teralevel CI" \
|
||||
--arg image_ref_immutable "$IMAGE_REF_IMMUTABLE" \
|
||||
--arg image_ref_mutable "$IMAGE_REF_MUTABLE" \
|
||||
--arg image_digest "$IMAGE_DIGEST" \
|
||||
--argjson backend_tests "$DOTNET_SUMMARY" \
|
||||
'{
|
||||
project: $project,
|
||||
component: $component,
|
||||
environment: $environment,
|
||||
release_id: $release_id,
|
||||
build_time_utc: $build_time_utc,
|
||||
commit_sha: $commit_sha,
|
||||
commit_short: $commit_short,
|
||||
branch: $branch,
|
||||
pipeline_id: $pipeline_id,
|
||||
ci_tool: $ci_tool,
|
||||
image_ref_immutable: $image_ref_immutable,
|
||||
image_ref_mutable: $image_ref_mutable,
|
||||
image_digest: $image_digest,
|
||||
tests: {
|
||||
backend: $backend_tests
|
||||
}
|
||||
}' > ci-evidence/build-metadata.json
|
||||
- sha256sum ci-evidence/* > ci-evidence/checksums-predeploy.txt || true
|
||||
|
||||
deploy_adas_dev:
|
||||
image: alpine:3.20
|
||||
when:
|
||||
branch:
|
||||
- env/adas/dev
|
||||
environment:
|
||||
ADAS_SSH_KEY:
|
||||
from_secret: ADAS_SSH_KEY
|
||||
SSH_SERVER_HOSTKEYS:
|
||||
from_secret: SSH_SERVER_HOSTKEYS
|
||||
DEPLOY_HOST_DEV:
|
||||
from_secret: DEPLOY_HOST_DEV
|
||||
DEPLOY_USER:
|
||||
from_secret: DEPLOY_USER
|
||||
commands:
|
||||
- set -eu
|
||||
- apk add --no-cache openssh-client jq
|
||||
- mkdir -p ~/.ssh
|
||||
- echo "$ADAS_SSH_KEY" > ~/.ssh/id_ed25519
|
||||
- chmod 600 ~/.ssh/id_ed25519
|
||||
- echo "$SSH_SERVER_HOSTKEYS" >> ~/.ssh/known_hosts
|
||||
- chmod 644 ~/.ssh/known_hosts
|
||||
- IMAGE_REF_MUTABLE="$(cat ci-evidence/image-ref-mutable.txt)"
|
||||
- |
|
||||
ssh -o "StrictHostKeyChecking yes" "${DEPLOY_USER}@${DEPLOY_HOST_DEV}" \
|
||||
"cd /opt/adas-core-dev && \
|
||||
docker compose stop adas-core && \
|
||||
docker compose rm -f adas-core && \
|
||||
docker compose pull adas-core && \
|
||||
docker compose up -d adas-core"
|
||||
- |
|
||||
REMOTE_DIGEST="$(ssh -o "StrictHostKeyChecking yes" "${DEPLOY_USER}@${DEPLOY_HOST_DEV}" \
|
||||
"docker image inspect ${IMAGE_REF_MUTABLE} --format='{{index .RepoDigests 0}}'")"
|
||||
- |
|
||||
jq -n \
|
||||
--arg environment "dev" \
|
||||
--arg host "${DEPLOY_HOST_DEV}" \
|
||||
--arg deployed_ref "$IMAGE_REF_MUTABLE" \
|
||||
--arg deployed_digest "$REMOTE_DIGEST" \
|
||||
'{
|
||||
environment: $environment,
|
||||
host: $host,
|
||||
deployed_ref: $deployed_ref,
|
||||
deployed_digest: $deployed_digest
|
||||
}' > ci-evidence/deploy-info.json
|
||||
|
||||
deploy_adas_pre:
|
||||
image: alpine:3.20
|
||||
when:
|
||||
branch:
|
||||
- env/adas/pre
|
||||
environment:
|
||||
ADAS_SSH_KEY:
|
||||
from_secret: ADAS_SSH_KEY
|
||||
SSH_SERVER_HOSTKEYS:
|
||||
from_secret: SSH_SERVER_HOSTKEYS
|
||||
DEPLOY_HOST_PRE:
|
||||
from_secret: DEPLOY_HOST_PRE
|
||||
DEPLOY_USER:
|
||||
from_secret: DEPLOY_USER
|
||||
commands:
|
||||
- set -eu
|
||||
- apk add --no-cache openssh-client jq
|
||||
- mkdir -p ~/.ssh
|
||||
- echo "$ADAS_SSH_KEY" > ~/.ssh/id_ed25519
|
||||
- chmod 600 ~/.ssh/id_ed25519
|
||||
- echo "$SSH_SERVER_HOSTKEYS" >> ~/.ssh/known_hosts
|
||||
- chmod 644 ~/.ssh/known_hosts
|
||||
- IMAGE_REF_MUTABLE="$(cat ci-evidence/image-ref-mutable.txt)"
|
||||
- |
|
||||
ssh -o "StrictHostKeyChecking yes" "${DEPLOY_USER}@${DEPLOY_HOST_PRE}" \
|
||||
"cd /opt/adas-core-pre && \
|
||||
docker compose stop adas-core && \
|
||||
docker compose rm -f adas-core && \
|
||||
docker compose pull adas-core && \
|
||||
docker compose up -d adas-core"
|
||||
- |
|
||||
REMOTE_DIGEST="$(ssh -o "StrictHostKeyChecking yes" "${DEPLOY_USER}@${DEPLOY_HOST_PRE}" \
|
||||
"docker image inspect ${IMAGE_REF_MUTABLE} --format='{{index .RepoDigests 0}}'")"
|
||||
- |
|
||||
jq -n \
|
||||
--arg environment "pre" \
|
||||
--arg host "${DEPLOY_HOST_PRE}" \
|
||||
--arg deployed_ref "$IMAGE_REF_MUTABLE" \
|
||||
--arg deployed_digest "$REMOTE_DIGEST" \
|
||||
'{
|
||||
environment: $environment,
|
||||
host: $host,
|
||||
deployed_ref: $deployed_ref,
|
||||
deployed_digest: $deployed_digest
|
||||
}' > ci-evidence/deploy-info.json
|
||||
|
||||
finalize_and_publish_ci_evidence:
|
||||
image: alpine:3.20
|
||||
when:
|
||||
branch:
|
||||
- env/adas/dev
|
||||
- env/adas/pre
|
||||
environment:
|
||||
ADAS_SSH_KEY:
|
||||
from_secret: ADAS_SSH_KEY
|
||||
SSH_SERVER_HOSTKEYS:
|
||||
from_secret: SSH_SERVER_HOSTKEYS
|
||||
DEPLOY_HOST_DEV:
|
||||
from_secret: DEPLOY_HOST_DEV
|
||||
DEPLOY_HOST_PRE:
|
||||
from_secret: DEPLOY_HOST_PRE
|
||||
DEPLOY_USER:
|
||||
from_secret: DEPLOY_USER
|
||||
commands:
|
||||
- set -eu
|
||||
- apk add --no-cache openssh-client jq coreutils tar gzip
|
||||
- mkdir -p ~/.ssh
|
||||
- echo "$ADAS_SSH_KEY" > ~/.ssh/id_ed25519
|
||||
- chmod 600 ~/.ssh/id_ed25519
|
||||
- echo "$SSH_SERVER_HOSTKEYS" >> ~/.ssh/known_hosts
|
||||
- chmod 644 ~/.ssh/known_hosts
|
||||
- RELEASE_ID="$(cat ci-evidence/release-id.txt)"
|
||||
- ENV_NAME="$(cat ci-evidence/env-name.txt)"
|
||||
- sha256sum ci-evidence/* > ci-evidence/checksums-final.txt || true
|
||||
- tar -czf "ci-evidence-${RELEASE_ID}.tar.gz" ci-evidence
|
||||
- |
|
||||
if [ "${ENV_NAME}" = "dev" ]; then
|
||||
EVIDENCE_HOST="${DEPLOY_HOST_DEV}"
|
||||
else
|
||||
EVIDENCE_HOST="${DEPLOY_HOST_PRE}"
|
||||
fi
|
||||
- ssh -o "StrictHostKeyChecking yes" "${DEPLOY_USER}@${EVIDENCE_HOST}" "mkdir -p /opt/adas-ci-evidence/core/${ENV_NAME}"
|
||||
- scp -o "StrictHostKeyChecking yes" "ci-evidence-${RELEASE_ID}.tar.gz" "${DEPLOY_USER}@${EVIDENCE_HOST}:/opt/adas-ci-evidence/core/${ENV_NAME}/"
|
||||
Binary file not shown.
@@ -0,0 +1,413 @@
|
||||
steps:
|
||||
collect_inputs:
|
||||
image: alpine:3.20
|
||||
# Se ejecuta en todas las ramas: features, env/adas/dev, env/adas/pre
|
||||
commands:
|
||||
- set -eu
|
||||
- apk add --no-cache jq coreutils git findutils
|
||||
- mkdir -p ci-evidence/test-results
|
||||
- SHORT_SHA="$(printf "%s" "${DRONE_COMMIT_SHA}" | cut -c1-12)"
|
||||
- BUILD_TIME="$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
|
||||
- ENV_NAME="$(printf "%s" "${DRONE_BRANCH}" | sed 's|env/adas/||')"
|
||||
- RELEASE_ID="${RELEASE_ID:-REL-${ENV_NAME}-${DRONE_BUILD_NUMBER}-${SHORT_SHA}}"
|
||||
- echo "$BUILD_TIME" > ci-evidence/build-time.txt
|
||||
- echo "${DRONE_COMMIT_SHA}" > ci-evidence/commit-sha.txt
|
||||
- echo "${SHORT_SHA}" > ci-evidence/commit-short.txt
|
||||
- echo "${DRONE_BRANCH}" > ci-evidence/branch.txt
|
||||
- echo "${ENV_NAME}" > ci-evidence/env-name.txt
|
||||
- echo "${DRONE_BUILD_NUMBER}" > ci-evidence/pipeline-id.txt
|
||||
- echo "${RELEASE_ID}" > ci-evidence/release-id.txt
|
||||
- echo "Teralevel CI" > ci-evidence/ci-tool.txt
|
||||
- git rev-parse --short HEAD > ci-evidence/git-short-head.txt
|
||||
- git rev-parse HEAD > ci-evidence/git-full-head.txt
|
||||
- git status --short > ci-evidence/git-status.txt || true
|
||||
- |
|
||||
find . \
|
||||
-maxdepth 4 \
|
||||
-type f \
|
||||
\( -name 'Dockerfile' -o -name '.teralevel-ci.yml' -o -name 'package-lock.json' -o -name 'angular.json' -o -name '*.sln' -o -name '*.csproj' -o -name 'nuget.config' \) \
|
||||
! -path '*/node_modules/*' \
|
||||
! -path '*/bin/*' \
|
||||
! -path '*/obj/*' \
|
||||
-exec sha256sum {} \; > ci-evidence/input-checksums.txt || true
|
||||
- |
|
||||
jq -n \
|
||||
--arg release_id "$RELEASE_ID" \
|
||||
--arg ur_prd_version "${UR_PRD_VERSION:-PENDIENTE}" \
|
||||
--arg srs_version "${SRS_VERSION:-PENDIENTE}" \
|
||||
--arg rmf_version "${RMF_VERSION:-PENDIENTE}" \
|
||||
--arg trace_version "${TRACE_MATRIX_VERSION:-PENDIENTE}" \
|
||||
--arg sbom_ref "ci-evidence/sbom-cyclonedx.json" \
|
||||
'{
|
||||
release_id: $release_id,
|
||||
ur_prd_version: $ur_prd_version,
|
||||
srs_version: $srs_version,
|
||||
rmf_version: $rmf_version,
|
||||
traceability_matrix_version: $trace_version,
|
||||
sbom_reference: $sbom_ref
|
||||
}' > ci-evidence/release-baseline-ref.json
|
||||
|
||||
test_backend:
|
||||
image: mcr.microsoft.com/dotnet/sdk:8.0
|
||||
# Se ejecuta en todas las ramas: features, env/adas/dev, env/adas/pre
|
||||
commands:
|
||||
- set -eu
|
||||
- mkdir -p ci-evidence/test-results/dotnet
|
||||
- dotnet --info > ci-evidence/dotnet-info.txt
|
||||
- SOLUTION="$(find . -maxdepth 4 -type f -name '*.sln' ! -path '*/obj/*' ! -path '*/bin/*' | head -n 1 || true)"
|
||||
- |
|
||||
if [ -z "$SOLUTION" ]; then
|
||||
TEST_PROJECTS="$(find . -maxdepth 5 -type f \( -name '*Test*.csproj' -o -name '*Tests*.csproj' \) ! -path '*/obj/*' ! -path '*/bin/*' | tr '\n' ' ' || true)"
|
||||
else
|
||||
TEST_PROJECTS=""
|
||||
fi
|
||||
- |
|
||||
if [ -n "$SOLUTION" ]; then
|
||||
dotnet restore "$SOLUTION"
|
||||
set +e
|
||||
dotnet test "$SOLUTION" \
|
||||
--configuration Release \
|
||||
--results-directory ci-evidence/test-results/dotnet \
|
||||
--logger "trx;LogFileName=dotnet-tests.trx"
|
||||
TEST_EXIT=$?
|
||||
set -e
|
||||
elif [ -n "$TEST_PROJECTS" ]; then
|
||||
TEST_EXIT=0
|
||||
for proj in $TEST_PROJECTS; do
|
||||
dotnet restore "$proj"
|
||||
set +e
|
||||
dotnet test "$proj" \
|
||||
--configuration Release \
|
||||
--results-directory ci-evidence/test-results/dotnet \
|
||||
--logger "trx;LogFileName=$(basename "$proj" .csproj)-tests.trx"
|
||||
CUR_EXIT=$?
|
||||
set -e
|
||||
if [ "$CUR_EXIT" -ne 0 ]; then TEST_EXIT=$CUR_EXIT; fi
|
||||
done
|
||||
else
|
||||
TEST_EXIT=0
|
||||
fi
|
||||
- |
|
||||
if [ -n "$SOLUTION" ] || [ -n "${TEST_PROJECTS:-}" ]; then
|
||||
STATUS="executed"
|
||||
else
|
||||
STATUS="skipped"
|
||||
fi
|
||||
- |
|
||||
cat > ci-evidence/test-results/dotnet-summary.json <<EOF
|
||||
{
|
||||
"status": "${STATUS}",
|
||||
"exit_code": ${TEST_EXIT},
|
||||
"target": "$(if [ -n "$SOLUTION" ]; then printf "%s" "$SOLUTION"; else printf "%s" "${TEST_PROJECTS:-none}"; fi)"
|
||||
}
|
||||
EOF
|
||||
- test "$TEST_EXIT" -eq 0
|
||||
|
||||
test_frontend:
|
||||
# NOTA: Chromium se instala en cada ejecucion (~1-3 min adicionales).
|
||||
# Cuando este disponible, sustituir por una imagen base propia:
|
||||
# git.teralevel.io/adas/node-chrome:20 (node:20-bookworm-slim + chromium pre-instalado)
|
||||
# Eso eliminara el apt-get de este paso y reducira el tiempo total del pipeline.
|
||||
image: node:20-bookworm-slim
|
||||
# Se ejecuta en todas las ramas: features, env/adas/dev, env/adas/pre
|
||||
commands:
|
||||
- set -eu
|
||||
- apt-get update
|
||||
- apt-get install -y --no-install-recommends chromium jq ca-certificates
|
||||
- rm -rf /var/lib/apt/lists/*
|
||||
- mkdir -p ci-evidence/test-results/frontend
|
||||
- node --version > ci-evidence/node-version.txt
|
||||
- npm --version > ci-evidence/npm-version.txt
|
||||
- FRONTEND_DIR="$(find . -maxdepth 4 -type f -name 'angular.json' ! -path '*/node_modules/*' -exec dirname {} \; | head -n 1 || true)"
|
||||
- |
|
||||
if [ -z "$FRONTEND_DIR" ]; then
|
||||
FRONTEND_DIR="$(find . -maxdepth 4 -type f -name 'package.json' ! -path '*/node_modules/*' -exec dirname {} \; | head -n 1 || true)"
|
||||
fi
|
||||
- |
|
||||
if [ -n "$FRONTEND_DIR" ]; then
|
||||
cd "$FRONTEND_DIR"
|
||||
export CI=true
|
||||
export CHROME_BIN=/usr/bin/chromium
|
||||
npm ci
|
||||
set +e
|
||||
npm test -- --watch=false --browsers=ChromeHeadless --progress=false
|
||||
TEST_EXIT=$?
|
||||
set -e
|
||||
cd -
|
||||
STATUS="executed"
|
||||
else
|
||||
TEST_EXIT=0
|
||||
STATUS="skipped"
|
||||
fi
|
||||
- |
|
||||
cat > ci-evidence/test-results/frontend-summary.json <<EOF
|
||||
{
|
||||
"status": "${STATUS}",
|
||||
"exit_code": ${TEST_EXIT},
|
||||
"target": "${FRONTEND_DIR:-none}"
|
||||
}
|
||||
EOF
|
||||
- test "$TEST_EXIT" -eq 0
|
||||
|
||||
build_and_push:
|
||||
# Requiere que el runner CI tenga /var/run/docker.sock montado (daemon Docker en CI)
|
||||
image: docker:27-cli
|
||||
when:
|
||||
branch:
|
||||
- env/adas/dev
|
||||
- env/adas/pre
|
||||
environment:
|
||||
REGISTRY_USER:
|
||||
from_secret: REGISTRY_USER
|
||||
REGISTRY_PASS:
|
||||
from_secret: REGISTRY_PASS
|
||||
commands:
|
||||
- set -eu
|
||||
- mkdir -p ci-evidence
|
||||
- docker login "git.teralevel.io" -u "${REGISTRY_USER}" -p "${REGISTRY_PASS}"
|
||||
- SHORT_SHA="$(cat ci-evidence/commit-short.txt)"
|
||||
- PIPELINE_ID="$(cat ci-evidence/pipeline-id.txt)"
|
||||
- ENV_NAME="$(cat ci-evidence/env-name.txt)"
|
||||
- IMAGE_REPO="git.teralevel.io/adas/adas-webdisplay"
|
||||
- IMAGE_TAG_IMMUTABLE="${ENV_NAME}-${PIPELINE_ID}-${SHORT_SHA}"
|
||||
- IMAGE_REF_IMMUTABLE="${IMAGE_REPO}:${IMAGE_TAG_IMMUTABLE}"
|
||||
- IMAGE_REF_MUTABLE="${IMAGE_REPO}:${ENV_NAME}-latest"
|
||||
- echo "$IMAGE_REF_IMMUTABLE" > ci-evidence/image-ref-immutable.txt
|
||||
- echo "$IMAGE_REF_MUTABLE" > ci-evidence/image-ref-mutable.txt
|
||||
- docker version > ci-evidence/docker-version.txt
|
||||
- |
|
||||
docker build \
|
||||
--label org.opencontainers.image.revision="${DRONE_COMMIT_SHA}" \
|
||||
--label org.opencontainers.image.version="${IMAGE_TAG_IMMUTABLE}" \
|
||||
--label org.opencontainers.image.created="$(cat ci-evidence/build-time.txt)" \
|
||||
-t "${IMAGE_REF_IMMUTABLE}" \
|
||||
-t "${IMAGE_REF_MUTABLE}" \
|
||||
-f Dockerfile \
|
||||
. > ci-evidence/docker-build.log 2>&1 || { cat ci-evidence/docker-build.log; exit 1; }
|
||||
- docker push "${IMAGE_REF_IMMUTABLE}" 2>&1 | tee -a ci-evidence/docker-build.log
|
||||
- docker push "${IMAGE_REF_MUTABLE}" 2>&1 | tee -a ci-evidence/docker-build.log
|
||||
- |
|
||||
docker image inspect "${IMAGE_REF_IMMUTABLE}" \
|
||||
--format '{{index .RepoDigests 0}}' > ci-evidence/image-digest.txt 2>/dev/null \
|
||||
|| docker image inspect "${IMAGE_REF_IMMUTABLE}" \
|
||||
--format '{{.Id}}' > ci-evidence/image-digest.txt
|
||||
- cat ci-evidence/docker-build.log
|
||||
|
||||
generate_sbom:
|
||||
image: anchore/syft:v1.18.1
|
||||
when:
|
||||
branch:
|
||||
- env/adas/dev
|
||||
- env/adas/pre
|
||||
environment:
|
||||
REGISTRY_USER:
|
||||
from_secret: REGISTRY_USER
|
||||
REGISTRY_PASS:
|
||||
from_secret: REGISTRY_PASS
|
||||
commands:
|
||||
- set -eu
|
||||
- mkdir -p /root/.docker ci-evidence
|
||||
- |
|
||||
cat > /root/.docker/config.json <<EOF
|
||||
{
|
||||
"auths": {
|
||||
"git.teralevel.io": {
|
||||
"username": "$REGISTRY_USER",
|
||||
"password": "$REGISTRY_PASS"
|
||||
}
|
||||
}
|
||||
}
|
||||
EOF
|
||||
- IMAGE_REF_IMMUTABLE="$(cat ci-evidence/image-ref-immutable.txt)"
|
||||
- syft version > ci-evidence/syft-version.txt
|
||||
- syft "${IMAGE_REF_IMMUTABLE}" -o cyclonedx-json=ci-evidence/sbom-cyclonedx.json
|
||||
- syft "${IMAGE_REF_IMMUTABLE}" -o spdx-json=ci-evidence/sbom-spdx.json
|
||||
|
||||
assemble_ci_evidence_predeploy:
|
||||
image: alpine:3.20
|
||||
when:
|
||||
branch:
|
||||
- env/adas/dev
|
||||
- env/adas/pre
|
||||
commands:
|
||||
- set -eu
|
||||
- apk add --no-cache jq coreutils
|
||||
- BUILD_TIME="$(cat ci-evidence/build-time.txt)"
|
||||
- COMMIT_SHA="$(cat ci-evidence/commit-sha.txt)"
|
||||
- SHORT_SHA="$(cat ci-evidence/commit-short.txt)"
|
||||
- BRANCH="$(cat ci-evidence/branch.txt)"
|
||||
- ENV_NAME="$(cat ci-evidence/env-name.txt)"
|
||||
- PIPELINE_ID="$(cat ci-evidence/pipeline-id.txt)"
|
||||
- RELEASE_ID="$(cat ci-evidence/release-id.txt)"
|
||||
- IMAGE_REF_IMMUTABLE="$(cat ci-evidence/image-ref-immutable.txt)"
|
||||
- IMAGE_REF_MUTABLE="$(cat ci-evidence/image-ref-mutable.txt)"
|
||||
- IMAGE_DIGEST="$(cat ci-evidence/image-digest.txt)"
|
||||
- DOTNET_SUMMARY="$(cat ci-evidence/test-results/dotnet-summary.json)"
|
||||
- FRONTEND_SUMMARY="$(cat ci-evidence/test-results/frontend-summary.json)"
|
||||
- |
|
||||
jq -n \
|
||||
--arg project "ADAS" \
|
||||
--arg component "adas-webdisplay" \
|
||||
--arg environment "$ENV_NAME" \
|
||||
--arg release_id "$RELEASE_ID" \
|
||||
--arg build_time_utc "$BUILD_TIME" \
|
||||
--arg commit_sha "$COMMIT_SHA" \
|
||||
--arg commit_short "$SHORT_SHA" \
|
||||
--arg branch "$BRANCH" \
|
||||
--arg pipeline_id "$PIPELINE_ID" \
|
||||
--arg ci_tool "Teralevel CI" \
|
||||
--arg image_ref_immutable "$IMAGE_REF_IMMUTABLE" \
|
||||
--arg image_ref_mutable "$IMAGE_REF_MUTABLE" \
|
||||
--arg image_digest "$IMAGE_DIGEST" \
|
||||
--argjson dotnet_tests "$DOTNET_SUMMARY" \
|
||||
--argjson frontend_tests "$FRONTEND_SUMMARY" \
|
||||
'{
|
||||
project: $project,
|
||||
component: $component,
|
||||
environment: $environment,
|
||||
release_id: $release_id,
|
||||
build_time_utc: $build_time_utc,
|
||||
commit_sha: $commit_sha,
|
||||
commit_short: $commit_short,
|
||||
branch: $branch,
|
||||
pipeline_id: $pipeline_id,
|
||||
ci_tool: $ci_tool,
|
||||
image_ref_immutable: $image_ref_immutable,
|
||||
image_ref_mutable: $image_ref_mutable,
|
||||
image_digest: $image_digest,
|
||||
tests: {
|
||||
backend: $dotnet_tests,
|
||||
frontend: $frontend_tests
|
||||
}
|
||||
}' > ci-evidence/build-metadata.json
|
||||
- sha256sum ci-evidence/* > ci-evidence/checksums-predeploy.txt || true
|
||||
|
||||
deploy_webdisplay_dev:
|
||||
image: alpine:3.20
|
||||
when:
|
||||
branch:
|
||||
- env/adas/dev
|
||||
environment:
|
||||
ADAS_SSH_KEY:
|
||||
from_secret: ADAS_SSH_KEY
|
||||
SSH_SERVER_HOSTKEYS:
|
||||
from_secret: SSH_SERVER_HOSTKEYS
|
||||
DEPLOY_HOST_DEV:
|
||||
from_secret: DEPLOY_HOST_DEV
|
||||
DEPLOY_USER:
|
||||
from_secret: DEPLOY_USER
|
||||
commands:
|
||||
- set -eu
|
||||
- apk add --no-cache openssh-client jq
|
||||
- mkdir -p ~/.ssh
|
||||
- echo "$ADAS_SSH_KEY" > ~/.ssh/id_ed25519
|
||||
- chmod 600 ~/.ssh/id_ed25519
|
||||
- echo "$SSH_SERVER_HOSTKEYS" >> ~/.ssh/known_hosts
|
||||
- chmod 644 ~/.ssh/known_hosts
|
||||
- IMAGE_REF_MUTABLE="$(cat ci-evidence/image-ref-mutable.txt)"
|
||||
- |
|
||||
ssh -o "StrictHostKeyChecking yes" "${DEPLOY_USER}@${DEPLOY_HOST_DEV}" \
|
||||
"cd /opt/adas-icu-dev && \
|
||||
docker compose stop webdisplay-dev && \
|
||||
docker compose rm -f webdisplay-dev && \
|
||||
docker compose pull webdisplay-dev && \
|
||||
docker compose up -d webdisplay-dev"
|
||||
- |
|
||||
REMOTE_DIGEST="$(ssh -o "StrictHostKeyChecking yes" "${DEPLOY_USER}@${DEPLOY_HOST_DEV}" \
|
||||
"docker image inspect ${IMAGE_REF_MUTABLE} --format='{{index .RepoDigests 0}}'")"
|
||||
- |
|
||||
jq -n \
|
||||
--arg environment "dev" \
|
||||
--arg host "${DEPLOY_HOST_DEV}" \
|
||||
--arg deployed_ref "$IMAGE_REF_MUTABLE" \
|
||||
--arg deployed_digest "$REMOTE_DIGEST" \
|
||||
'{
|
||||
environment: $environment,
|
||||
host: $host,
|
||||
deployed_ref: $deployed_ref,
|
||||
deployed_digest: $deployed_digest
|
||||
}' > ci-evidence/deploy-info.json
|
||||
|
||||
deploy_webdisplay_pre:
|
||||
image: alpine:3.20
|
||||
when:
|
||||
branch:
|
||||
- env/adas/pre
|
||||
environment:
|
||||
ADAS_SSH_KEY:
|
||||
from_secret: ADAS_SSH_KEY
|
||||
SSH_SERVER_HOSTKEYS:
|
||||
from_secret: SSH_SERVER_HOSTKEYS
|
||||
DEPLOY_HOST_PRE:
|
||||
from_secret: DEPLOY_HOST_PRE
|
||||
DEPLOY_USER:
|
||||
from_secret: DEPLOY_USER
|
||||
commands:
|
||||
- set -eu
|
||||
- apk add --no-cache openssh-client jq
|
||||
- mkdir -p ~/.ssh
|
||||
- echo "$ADAS_SSH_KEY" > ~/.ssh/id_ed25519
|
||||
- chmod 600 ~/.ssh/id_ed25519
|
||||
- echo "$SSH_SERVER_HOSTKEYS" >> ~/.ssh/known_hosts
|
||||
- chmod 644 ~/.ssh/known_hosts
|
||||
- IMAGE_REF_MUTABLE="$(cat ci-evidence/image-ref-mutable.txt)"
|
||||
- |
|
||||
ssh -o "StrictHostKeyChecking yes" "${DEPLOY_USER}@${DEPLOY_HOST_PRE}" \
|
||||
"cd /opt/adas-icu-pre && \
|
||||
docker compose stop webdisplay-pre && \
|
||||
docker compose rm -f webdisplay-pre && \
|
||||
docker compose pull webdisplay-pre && \
|
||||
docker compose up -d webdisplay-pre"
|
||||
- |
|
||||
REMOTE_DIGEST="$(ssh -o "StrictHostKeyChecking yes" "${DEPLOY_USER}@${DEPLOY_HOST_PRE}" \
|
||||
"docker image inspect ${IMAGE_REF_MUTABLE} --format='{{index .RepoDigests 0}}'")"
|
||||
- |
|
||||
jq -n \
|
||||
--arg environment "pre" \
|
||||
--arg host "${DEPLOY_HOST_PRE}" \
|
||||
--arg deployed_ref "$IMAGE_REF_MUTABLE" \
|
||||
--arg deployed_digest "$REMOTE_DIGEST" \
|
||||
'{
|
||||
environment: $environment,
|
||||
host: $host,
|
||||
deployed_ref: $deployed_ref,
|
||||
deployed_digest: $deployed_digest
|
||||
}' > ci-evidence/deploy-info.json
|
||||
|
||||
finalize_and_publish_ci_evidence:
|
||||
image: alpine:3.20
|
||||
when:
|
||||
branch:
|
||||
- env/adas/dev
|
||||
- env/adas/pre
|
||||
environment:
|
||||
ADAS_SSH_KEY:
|
||||
from_secret: ADAS_SSH_KEY
|
||||
SSH_SERVER_HOSTKEYS:
|
||||
from_secret: SSH_SERVER_HOSTKEYS
|
||||
DEPLOY_HOST_DEV:
|
||||
from_secret: DEPLOY_HOST_DEV
|
||||
DEPLOY_HOST_PRE:
|
||||
from_secret: DEPLOY_HOST_PRE
|
||||
DEPLOY_USER:
|
||||
from_secret: DEPLOY_USER
|
||||
commands:
|
||||
- set -eu
|
||||
- apk add --no-cache openssh-client jq coreutils tar gzip
|
||||
- mkdir -p ~/.ssh
|
||||
- echo "$ADAS_SSH_KEY" > ~/.ssh/id_ed25519
|
||||
- chmod 600 ~/.ssh/id_ed25519
|
||||
- echo "$SSH_SERVER_HOSTKEYS" >> ~/.ssh/known_hosts
|
||||
- chmod 644 ~/.ssh/known_hosts
|
||||
- RELEASE_ID="$(cat ci-evidence/release-id.txt)"
|
||||
- ENV_NAME="$(cat ci-evidence/env-name.txt)"
|
||||
- sha256sum ci-evidence/* > ci-evidence/checksums-final.txt || true
|
||||
- tar -czf "ci-evidence-${RELEASE_ID}.tar.gz" ci-evidence
|
||||
- |
|
||||
if [ "${ENV_NAME}" = "dev" ]; then
|
||||
EVIDENCE_HOST="${DEPLOY_HOST_DEV}"
|
||||
else
|
||||
EVIDENCE_HOST="${DEPLOY_HOST_PRE}"
|
||||
fi
|
||||
- ssh -o "StrictHostKeyChecking yes" "${DEPLOY_USER}@${EVIDENCE_HOST}" "mkdir -p /opt/adas-ci-evidence/webdisplay/${ENV_NAME}"
|
||||
- scp -o "StrictHostKeyChecking yes" "ci-evidence-${RELEASE_ID}.tar.gz" "${DEPLOY_USER}@${EVIDENCE_HOST}:/opt/adas-ci-evidence/webdisplay/${ENV_NAME}/"
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user