diff --git a/.github/workflows/build-gitrules.yml b/.github/workflows/build-gitrules.yml new file mode 100644 index 0000000..087c327 --- /dev/null +++ b/.github/workflows/build-gitrules.yml @@ -0,0 +1,26 @@ +name: Build gitrules Docker Image + +on: + push: + tags: + - 'gitrules' # реагировать на тег gitrules + +jobs: + build: + runs-on: ubuntu-latest + env: + DOCKER_REGISTRY_URL: ${{ secrets.DOCKER_REGISTRY_URL }} + DOCKER_LOGIN: ${{ secrets.DOCKER_LOGIN }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build and Push Docker image + run: | + echo "Собираем gitrules" + ./src/build-gitrules.sh diff --git a/src/build-gitrules.sh b/src/build-gitrules.sh new file mode 100755 index 0000000..11c9865 --- /dev/null +++ b/src/build-gitrules.sh @@ -0,0 +1,56 @@ +#!/bin/bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +if [ -z "${CI:-}" ]; then + echo "The script is not running in CI" + source "${SCRIPT_DIR}/../scripts/load_env.sh" +else + echo "The script is running in CI"; +fi + +source "${SCRIPT_DIR}/../scripts/docker_login.sh" +source "${SCRIPT_DIR}/../tools/assert.sh" + +if [[ "${DOCKER_SYSTEM_PRUNE:-}" = "true" ]] ; +then + docker system prune -af +fi + +last_arg="." +if [[ ${NO_CACHE:-} = "true" ]] ; then + last_arg="--no-cache ." +fi + +gitrules_version="latest" + +docker build \ + --pull \ + --build-arg GITRULES_VERSION="${gitrules_version}" \ + --build-arg DOCKER_REGISTRY_URL="${DOCKER_REGISTRY_URL}" \ + --build-arg DOCKER_LOGIN="${DOCKER_LOGIN}" \ + -t "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/gitrules:${gitrules_version}" \ + -f "${SCRIPT_DIR}/gitrules/Dockerfile" \ + ${last_arg} + +if ./tests/test-gitrules.sh; then + container_version=$(docker run --rm "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/gitrules:${gitrules_version}" --version | tail -n1) + + if [[ -n "${container_version}" ]]; then + docker push "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/gitrules:${gitrules_version}" + + docker tag "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/gitrules:${gitrules_version}" "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/gitrules:${container_version}" + docker push "${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/gitrules:${container_version}" + + else + log_failure "Не удалось получить версию из контейнера" + exit 1 + fi + + source "${SCRIPT_DIR}/../scripts/cleanup.sh" +else + log_failure "ERROR: Тесты провалены. Образ не был запушен." + source "${SCRIPT_DIR}/../scripts/cleanup.sh" + exit 1 +fi +exit 0 \ No newline at end of file diff --git a/src/gitrules/Dockerfile b/src/gitrules/Dockerfile new file mode 100644 index 0000000..27be5fd --- /dev/null +++ b/src/gitrules/Dockerfile @@ -0,0 +1,11 @@ +ARG DOCKER_REGISTRY_URL=docker.io +ARG DOCKER_LOGIN=sleemp +ARG BASE_IMAGE=oscript +ARG BASE_TAG=dev + +FROM ${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/${BASE_IMAGE}:${BASE_TAG} +LABEL maintainer="Iosif Pravets " + +RUN opm i gitrules; + +ENTRYPOINT ["gitrules"] \ No newline at end of file diff --git a/src/tag-gitrules-latest.sh b/src/tag-gitrules-latest.sh new file mode 100755 index 0000000..36e80bf --- /dev/null +++ b/src/tag-gitrules-latest.sh @@ -0,0 +1,4 @@ +#!/bin/bash +set -euo pipefail + +git tag -f gitrules && git push origin gitrules -f \ No newline at end of file diff --git a/tests/test-gitrules.sh b/tests/test-gitrules.sh new file mode 100755 index 0000000..3b344e8 --- /dev/null +++ b/tests/test-gitrules.sh @@ -0,0 +1,31 @@ +#!/bin/bash +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +if [ -z "${CI-}" ]; then + echo "The script is not running in CI" + source "${SCRIPT_DIR}/../.env" +else + echo "The script is running in CI" +fi + +source "${SCRIPT_DIR}/../tools/assert.sh" + +test_gitrules_is_running() { + log_header "Test :: gitrules is running" + + local expected actual + + expected="ИНФОРМАЦИЯ - [СписокРелизов1С]: Инициализирован обработчик" + actual=$(docker run --rm ${DOCKER_REGISTRY_URL}/${DOCKER_LOGIN}/gitrules:latest 2>/dev/null | head -n1) + + if assert_eq "$expected" "$actual"; then + log_success "gitrules is running test passed" + else + log_failure "gitrules is running test failed" + fi +} + +# test calls +test_gitrules_is_running \ No newline at end of file