# FetchJob container image

Container to run a job that fetches from remote repositories to corresponding
local repositories. This can be used to create copies of repositories hosted on
other git servers in the local Gerrit. This is useful for backing up repositories
or to have a copy of branches of a project that was forked in the local Gerrit.

## Content

* base image
* `fetch-job.py`: script executing the fetches

## Start

*  execution of the provided `fetch-job.py`

## Configuration

```yaml
remotes:
- name: example
  url: https://example.com
  timeout: 5m
  fetch:
  - remoteRepo: project1
  - remoteRepo: project2
    localRepo: local/project2
  - remoteRepo: project3
    localRepo: local/project3
    refSpec: "+refs/heads/*:refs/heads/remote/*"
  - remoteRepo: project4
    localRepo: local/project4
    refSpec:
      - +refs/heads/*:refs/heads/remote/*
      - ^refs/heads/excluded-*
```

## Authentication

Mount a `.netrc` file at `/home/gerrit/.netrc` to provide credentials for
authenticating with remote servers.

## TLS/SSL

If the remote server uses a certificate signed by a non-publicly-trusted CA
(e.g. an internal CA), provide the CA certificate in PEM format at
`/home/gerrit/ca.crt`. The fetch-job will automatically use it for all fetch
operations if present.

When using the Gerrit operator, both the `.netrc` and `ca.crt` files can be
provided via the `secretRef` field of the `IncomingReplicationTask` resource.
If the referenced secret contains a `.netrc` key and/or a `ca.crt` key, the
operator will mount them at the expected paths automatically.

Adding a custom `ca.crt` will use that file for SSL verification, ignoring
existing system CA bundles.