Struct Gitea

Source
pub struct Gitea { /* private fields */ }
Available on crate feature gitea only.
Expand description

Module to work with Gitea container.

Starts an instance of Gitea, fully functional git server, with reasonable defaults and possibility to tune some configuration options.

From the Gitea documentation: Gitea is a painless, self-hosted, all-in-one software development service. It includes Git hosting, code review, team collaboration, package registry, and CI/CD. It is similar to GitHub, Bitbucket and GitLab.

By default, Gitea server container starts with the following config:

  • accepts SSH (Git) protocol requests on port GITEA_SSH_PORT;
  • accepts HTTP requests on port GITEA_HTTP_PORT;
  • has a single configured user with admin privileges, with pre-defined username and password;
  • configured git server hostname is localhost; this is a name which Gitea uses in the links to repositories;
  • no repositories are created.

Additionally to defaults, it’s possible to:

  • use HTTPS instead of HTTP with auto-generated self-signed certificate or provide your own certificate;
  • redirect HTTP calls to HTTPS listener, if HTTPS is enabled;
  • change git server hostname, which is used in various links to repos or web-server;
  • provide your own admin user credentials as well as its SSH public key to authorize git calls;
  • create any number of public or private repositories with provided names during server startup;
  • execute set of gitea admin ... commands during server startup to customize configuration;
  • add environment variables

§Examples

  1. Minimalistic server
use testcontainers::{runners::AsyncRunner, ImageExt};
use testcontainers_modules::gitea::{self, Gitea, GiteaRepo};

#[tokio::test]
async fn default_gitea_server() {
    // Run default container
    let gitea = Gitea::default().start().await.unwrap();
    let port = gitea
        .get_host_port_ipv4(gitea::GITEA_HTTP_PORT)
        .await
        .unwrap();
    let url = format!(
        "http://localhost:{port}/api/v1/users/{}",
        gitea::GITEA_DEFAULT_ADMIN_USERNAME
    );

    // Anonymous query Gitea API for user info
    let response = reqwest::Client::new().get(url).send().await.unwrap();
    assert_eq!(response.status(), 200);
}
  1. Customized server
use testcontainers::{runners::AsyncRunner, ImageExt};
use testcontainers_modules::gitea::{self, Gitea, GiteaRepo};

#[tokio::test]
async fn gitea_server_with_custom_config() {
    // Start server container with:
    // - custom admin credentials
    // - two repos: public and private
    // - TLS enabled
    // - port mapping for HTTP and SSH
    // - custom git hostname
    let gitea = Gitea::default()
        .with_git_hostname("gitea.example.com")
        .with_admin_account("custom-admin", "password", None)
        .with_repo(GiteaRepo::Public("public-test-repo".to_string()))
        .with_repo(GiteaRepo::Private("private-test-repo".to_string()))
        .with_tls(true)
        .with_mapped_port(443, gitea::GITEA_HTTP_PORT)
        .with_mapped_port(22, gitea::GITEA_SSH_PORT)
        .start()
        .await
        .unwrap();

    // Obtain auto-created root CA certificate
    let ca = gitea.image().tls_ca().unwrap();
    let ca = reqwest::Certificate::from_pem(ca.as_bytes()).unwrap();
    // Attach custom CA to the client
    let client = reqwest::ClientBuilder::new()
        .add_root_certificate(ca)
        .build()
        .unwrap();

    // Get list of repos of particular user.
    // This query should be authorized.
    let response = client
        .get("https://localhost/api/v1/user/repos")
        .basic_auth("custom-admin", Some("password"))
        .header("Host", "gitea.example.com")
        .send()
        .await
        .unwrap();
    assert_eq!(response.status(), 200);

    let repos = response.json::<serde_json::Value>().await.unwrap();
    assert_eq!(repos.as_array().unwrap().len(), 2);
}

Implementations§

Source§

impl Gitea

Source

pub fn with_admin_account( self, username: impl Into<String>, password: impl Into<String>, public_key: Option<String>, ) -> Self

Change admin user credential to the custom provided username and password instead of using defaults.

If public_key value is provided, it will be added to the admin account.

§Example
#[tokio::test]
async fn test() {
    const PUB_KEY: &str = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJRE5a67/cTbR6DpWqzBl6BTY0LE0Hg715ZI/FMK7iCH";
    let gitea = Gitea::default()
            .with_admin_account("git-admin", "nKz4SC7bkz4KSXbQ", Some(PUB_KEY))
            .start()
            .await
            .unwrap();
// ...
}
Source

pub fn with_git_hostname(self, hostname: impl Into<String>) -> Self

Set git server hostname instead of the default localhost.

This is not a containers’ hostname, but the name which git server uses in various links like repo URLs.

Source

pub fn with_repo(self, repo: GiteaRepo) -> Self

Create a repository during startup.

It’s possible to call this method more than once to create several repositories.

§Example
#[tokio::test]
async fn test() {
    let gitea = Gitea::default()
            .with_repo(GiteaRepo::Public("example-public-repo"))
            .with_repo(GiteaRepo::Private("example-private-repo"))
            .start()
            .await
            .unwrap();
// ...
}
Source

pub fn with_admin_command( self, command: impl IntoIterator<Item = impl Into<String>>, ) -> Self

Add gitea admin ... command with parameters to execute after server startup.

This method is useful, for example, to create additional users or to do other admin stuff.

It’s possible to call this method more than once to add several consecutive commands.

§Example
#[tokio::test]
async fn test() {
    let cmd = vec![
         "user",
         "create",
         "--username",
         "test-user",
         "--password",
         "test-password",
         "--email",
         "test@localhost",
         "--must-change-password=true",
         ]
         .into_iter()
         .map(String::from)
         .collect::<Vec<String>>();

    let gitea = Gitea::default()
        .with_admin_command(command)
        .start()
        .await
        .unwrap();
// ...
}
Source

pub fn with_tls(self, enabled: bool) -> Self

Gitea web server will start with HTTPS listener (with auto-generated certificate), instead of the default HTTP.

If enabled is true, web server will be started with TLS listener with auto-generated self-signed certificate. If Root CA certificate is needed to ensure fully protected communications, it can be obtained by Gitea::tls_ca() method call.

Note: If TLS is enabled, additional HTTP listener will be started on port GITEA_HTTP_REDIRECT_PORT to redirect all HTTP calls to the HTTPS listener.

Source

pub fn with_tls_certs( self, cert: impl Into<String>, key: impl Into<String>, ) -> Self

Gitea web server will start with HTTPS listener (with provided certificate), instead of the default HTTP.

cert and key are strings with PEM encoded certificate and its key. This method is similar to Gitea::with_tls() but use provided certificate instead of generating self-signed one.

Note: If TLS is enabled, additional HTTP listener will be started on port GITEA_HTTP_REDIRECT_PORT to redirect all HTTP calls to the HTTPS listener.

Source

pub fn tls_ca(&self) -> Option<&str>

Return PEM encoded Root CA certificate of the Gitea servers’ certificate issuer.

If TLS has been enabled using Gitea::with_tls_certs() method (with auto-generated self-signed certificate), then this method returns Some option with issuer root CA certificate to verify servers’ certificate and ensure fully protected communications.

If TLS isn’t enabled or TLS is enabled with external certificate, provided using Gitea::with_tls_certs method, this method returns None since there is no known CA certificate.

Trait Implementations§

Source§

impl Clone for Gitea

Source§

fn clone(&self) -> Gitea

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Gitea

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for Gitea

Source§

fn default() -> Self

Returns default Gitea server setup with the following defaults:

  • hostname is localhost;
  • admin account username from GITEA_DEFAULT_ADMIN_USERNAME;
  • admin account password from GITEA_DEFAULT_ADMIN_PASSWORD;
  • without admins’ account SSH public key;
  • without additional startup admin commands;
  • without TLS (SSH and HTTP protocols only);
  • without repositories.
Source§

impl Image for Gitea

Source§

fn name(&self) -> &str

The name of the docker image to pull from the Docker Hub registry.
Source§

fn tag(&self) -> &str

Implementations are encouraged to include a tag that will not change (i.e. NOT latest) in order to prevent test code from randomly breaking because the underlying docker suddenly changed.
Source§

fn ready_conditions(&self) -> Vec<WaitFor>

Returns a list of conditions that need to be met before a started container is considered ready. Read more
Source§

fn copy_to_sources(&self) -> impl IntoIterator<Item = &CopyToContainer>

Returns the files to be copied into the container at startup.
Source§

fn expose_ports(&self) -> &[ContainerPort]

Returns the ports that needs to be exposed when a container is created. Read more
Source§

fn exec_after_start( &self, _cs: ContainerState, ) -> Result<Vec<ExecCommand>, TestcontainersError>

Returns the commands that needs to be executed after a container is started i.e. commands to be run in a running container. Read more
Source§

fn env_vars( &self, ) -> impl IntoIterator<Item = (impl Into<Cow<'_, str>>, impl Into<Cow<'_, str>>)>

Returns the environment variables that needs to be set when a container is created.
Source§

fn mounts(&self) -> impl IntoIterator<Item = &Mount>

Returns the mounts that needs to be created when a container is created.
Source§

fn entrypoint(&self) -> Option<&str>

Returns the entrypoint this image needs to be created with.
Source§

fn cmd(&self) -> impl IntoIterator<Item = impl Into<Cow<'_, str>>>

Returns the CMD this image needs to be created with.
Source§

fn exec_before_ready( &self, cs: ContainerState, ) -> Result<Vec<ExecCommand>, TestcontainersError>

Returns commands that will be executed after the container has started, but before the Image::ready_conditions are awaited for. Read more

Auto Trait Implementations§

§

impl Freeze for Gitea

§

impl RefUnwindSafe for Gitea

§

impl Send for Gitea

§

impl Sync for Gitea

§

impl Unpin for Gitea

§

impl UnwindSafe for Gitea

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T, I> AsyncRunner<I> for T
where T: Into<ContainerRequest<I>> + Send, I: Image,

Source§

fn start<'async_trait>( self, ) -> Pin<Box<dyn Future<Output = Result<ContainerAsync<I>, TestcontainersError>> + Send + 'async_trait>>
where T: 'async_trait,

Starts the container and returns an instance of ContainerAsync.
Source§

fn pull_image<'async_trait>( self, ) -> Pin<Box<dyn Future<Output = Result<ContainerRequest<I>, TestcontainersError>> + Send + 'async_trait>>
where T: 'async_trait,

Pulls the image from the registry. Useful if you want to pull the image before starting the container.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<RI, I> ImageExt<I> for RI
where RI: Into<ContainerRequest<I>>, I: Image,

Source§

fn with_cmd( self, cmd: impl IntoIterator<Item = impl Into<String>>, ) -> ContainerRequest<I>

Returns a new ContainerRequest with the specified (overridden) CMD (Image::cmd). Read more
Source§

fn with_name(self, name: impl Into<String>) -> ContainerRequest<I>

Overrides the fully qualified image name (consists of {domain}/{owner}/{image}). Can be used to specify a custom registry or owner.
Source§

fn with_tag(self, tag: impl Into<String>) -> ContainerRequest<I>

Overrides the image tag. Read more
Source§

fn with_container_name(self, name: impl Into<String>) -> ContainerRequest<I>

Sets the container name.
Source§

fn with_network(self, network: impl Into<String>) -> ContainerRequest<I>

Sets the network the container will be connected to.
Source§

fn with_label( self, key: impl Into<String>, value: impl Into<String>, ) -> ContainerRequest<I>

Adds the specified label to the container. Read more
Source§

fn with_labels( self, labels: impl IntoIterator<Item = (impl Into<String>, impl Into<String>)>, ) -> ContainerRequest<I>

Adds the specified labels to the container. Read more
Source§

fn with_env_var( self, name: impl Into<String>, value: impl Into<String>, ) -> ContainerRequest<I>

Adds an environment variable to the container.
Source§

fn with_host( self, key: impl Into<String>, value: impl Into<Host>, ) -> ContainerRequest<I>

Adds a host to the container.
Source§

fn with_mount(self, mount: impl Into<Mount>) -> ContainerRequest<I>

Adds a mount to the container.
Source§

fn with_copy_to( self, target: impl Into<String>, source: impl Into<CopyDataSource>, ) -> ContainerRequest<I>

Copies some source into the container as file
Source§

fn with_mapped_port( self, host_port: u16, container_port: ContainerPort, ) -> ContainerRequest<I>

Adds a port mapping to the container, mapping the host port to the container’s internal port. Read more
Source§

fn with_ulimit( self, name: &str, soft: i64, hard: Option<i64>, ) -> ContainerRequest<I>

Adds a resource ulimit to the container. Read more
Source§

fn with_privileged(self, privileged: bool) -> ContainerRequest<I>

Sets the container to run in privileged mode.
Source§

fn with_cap_add(self, capability: impl Into<String>) -> ContainerRequest<I>

Adds the capabilities to the container
Source§

fn with_cap_drop(self, capability: impl Into<String>) -> ContainerRequest<I>

Drops the capabilities from the container’s capabilities
Source§

fn with_cgroupns_mode(self, cgroupns_mode: CgroupnsMode) -> ContainerRequest<I>

cgroup namespace mode for the container. Possible values are: Read more
Source§

fn with_userns_mode(self, userns_mode: &str) -> ContainerRequest<I>

Sets the usernamespace mode for the container when usernamespace remapping option is enabled.
Source§

fn with_shm_size(self, bytes: u64) -> ContainerRequest<I>

Sets the shared memory size in bytes
Source§

fn with_startup_timeout(self, timeout: Duration) -> ContainerRequest<I>

Sets the startup timeout for the container. The default is 60 seconds.
Source§

fn with_working_dir(self, working_dir: impl Into<String>) -> ContainerRequest<I>

Sets the working directory. The default is defined by the underlying image, which in turn may default to /.
Source§

fn with_log_consumer( self, log_consumer: impl LogConsumer + 'static, ) -> ContainerRequest<I>

Adds the log consumer to the container. Read more
Source§

fn with_user(self, user: impl Into<String>) -> ContainerRequest<I>

Sets the user that commands are run as inside the container.
Source§

fn with_readonly_rootfs(self, readonly_rootfs: bool) -> ContainerRequest<I>

Sets the container’s root filesystem to be mounted as read-only
Source§

fn with_security_opt( self, security_opt: impl Into<String>, ) -> ContainerRequest<I>

Sets security options for the container
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> IntoResult<T> for T

Source§

impl<T> IntoResult<T> for T

Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T, I> SyncRunner<I> for T
where T: Into<ContainerRequest<I>> + Send, I: Image,

Source§

fn start(self) -> Result<Container<I>, TestcontainersError>

Starts the container and returns an instance of Container.
Source§

fn pull_image(self) -> Result<ContainerRequest<I>, TestcontainersError>

Pulls the image from the registry. Useful if you want to pull the image before starting the container.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> ErasedDestructor for T
where T: 'static,