Skip to content
Snippets Groups Projects
.gitlab-ci.yml 2.84 KiB
Newer Older
stages:
  - test
  - lint
  - utility

variables:
  GIT_STRATEGY: clone
  CI_IMAGE_REPOSITORY: docker-picodata.binary.picodata.io
  CI_IMAGE: "${CI_IMAGE_REPOSITORY}/${CI_PROJECT_NAME}:0.1.0"
  DOCKER_AUTH_CONFIG: $DOCKER_AUTH_RO
  CARGO_NET_GIT_FETCH_WITH_CLI: "true"

default:
  image: $CI_IMAGE

.rust_cache: &rust_cache
  - paths:
      - $CI_PROJECT_DIR/.cargo/.crates.toml
      - $CI_PROJECT_DIR/.cargo/.crates2.json
      - $CI_PROJECT_DIR/.cargo/bin
      - $CI_PROJECT_DIR/.cargo/registry/index
      - $CI_PROJECT_DIR/.cargo/registry/cache
      - $CI_PROJECT_DIR/.cargo/git/db
      - $CI_PROJECT_DIR/.cache/sccache
      - $CI_PROJECT_DIR/target/debug/libexample.so
    key:
      files:
        - ./Cargo.lock
    when: "always"

.base:
  variables:
    # variables for rust cache
    CARGO_HOME: $CI_PROJECT_DIR/.cargo
    SCCACHE_DIR: $CI_PROJECT_DIR/.cache/sccache
    RUSTC_WRAPPER: sccache
  image:
    name: $CI_IMAGE
    pull_policy: [always, if-not-present]
  tags:
    - docker
  needs: []
  interruptible: true
  cache:
    - *rust_cache

int-test:
  stage: "test"
  extends: .base
  script:
    - make int-test

rust-lint:
  extends: .base
  stage: lint
  script:
    - make rust-lint

rust-fmt:
  stage: lint
  extends: .base
  script:
    - cargo fmt --check

publish-dry-run:
  stage: utility
  extends: .base
  script:
    - make publish-dry-run

publish:
  stage: utility
  extends: .base
  when: manual
  script:
    - make publish
  needs: [publish-dry-run]

build_ci:
  stage: utility
  tags:
    - shell
  inherit:
    default: false
  variables:
    DOCKER_AUTH_CONFIG: $DOCKER_AUTH_RW

    # Image version MUST be passed to CI job, or job will be failed.
    CI_IMAGE_VERSION: ""

    # If true is passed here, job will overwrite existing image with the same tag.
    # If it is false(default) and image with the same tag already resides in docker registry, job will be failed.
    CI_IMAGE_OVERWRITE_TAG: "false"

    # If true is passed here, resulting image would also be tagged as latest.
    CI_IMAGE_IS_LATEST: "true"

    BASE_IMAGE_NAME: "${CI_IMAGE_REPOSITORY}/${CI_PROJECT_NAME}"
    IMAGE_TAG: "${BASE_IMAGE_NAME}:${CI_IMAGE_VERSION}"
    LATEST_IMAGE_TAG: "${BASE_IMAGE_NAME}:latest"
  before_script:
    - if [ -z "$CI_IMAGE_VERSION" ]; then echo "Image version should be specified, got '$CI_IMAGE_VERSION'" 1>&2 && exit 1; fi
    - IMAGE_EXIST=$(docker manifest inspect $IMAGE_TAG > /dev/null; echo $?)
    - if [[ "$CI_IMAGE_OVERWRITE_TAG" == "false" && "$IMAGE_EXIST" == "0" ]]; then echo "Image tag already resides in registry and it must not be overwritten" 1>&2 && exit 1; fi
  script:
    - docker build --file Dockerfile.ci -t $IMAGE_TAG .
    - if [ $CI_IMAGE_IS_LATEST = "true" ]; then docker tag $IMAGE_TAG $LATEST_IMAGE_TAG; fi
    - docker push --all-tags $BASE_IMAGE_NAME
  when: manual
  only:
    changes:
      - Dockerfile.ci
  needs: []