# CI plugin to publish Debian package on a Aptly repository

This docker image could be used as an Woodpecker CI plugin to publish one (or more) Debian package on a Aptly repository using its API. It also could be used with Gitlab CI to define a publishing job.

This plugin will try to :
- List all changes files in the specified directory and filter on the specified source package name (if specified)
- Iter on detected changes files and foreach of then:
 - the changes file is parsed to detect the source package name, the distribution and included files
 - the repository name is computed (if not specified). __Format:__ `{prefix}_{distribution}_{component}`. __Note:__ if the default prefix is specified (`.`), it will not be used to compute the repository name.
 - the current published distribution is retreived using APTLY Publish API to:
   - check it was already manally published a first time
   - check it used a snapshot kind of sources
   - retreive other components source snapshot
 - Upload the changes file and all its included files using APTLY File Upload API in a directory named as the source package
 - Include the changes file using APTLY Local Repos API
 - Compute a snapshot name for the repository based on the current date and the repository name. __Format:__ `YYYYMMDD-HHMMSS_{repository name}`
 - Create a snapshot of the repository using APTLY Local Repos API
 - Update the published distribution with this new snapshot as source of the specified component and keeping other components source snapshot.

In case of error, it will exit with a detailed error message (within the limits of what is provided by the Aptly API).

[![status-badge](https://ci.zionetrix.net/api/badges/bn8/aptly-publish/status.svg)](https://ci.zionetrix.net/bn8/aptly-publish)

# Usage

## With Woodpecker CI

The below pipeline configuration demonstrates simple usage as Woodpecker CI plugin:

```
pipeline:
  publish:
    image: brenard/aptly-publish
    settings:
      api_url: https://your.aptly.tld/api
      api_username: myproject
      api_password:
        from_secret: aptly_api_password
      prefix: debian
      repo_component: main
      repo_name: debian_stable_main
      path: dist
      source_name: myproject
      max_retries: 2
      force_overwrite: true
```

__Parameters:__
- __api_url:__ Your Aptly API URL (required)
- __api_username:__ Username to authenticate on your Aptly API (required)
- __api_password:__ Password to authenticate on your Aptly API (required)
- __prefix:__ The publishing prefix (optional, default: `.`)
- __repo_component:__ The component name to publish on (optional, default: `main`)
- __repo_name:__ The repository name to publish on. If not specified, it will be computed using the specified prefix and component and the detected package distribution. See above for details.
- __path:__ Path to the directory where files to publish are stored (optional, default: `dist`)
- __source_name:__ Name of the source package to publish (optional, default: all `changes` files are will be publish)
- __max_retries:__ The number of retry in case of error calling the Aptly API (optional, default: no retry)
- __force_overwrite:__ When publishing, overwrite files in `pool/` directory without notice (optional, default: false)

## With Gitlab CI

The following pipeline configuration demonstrates a simple usage to build and publish a debian package:

```
stages:
  - build
  - publish

build:
  image: debian:11
  stage: build
  rules:
    - if: $CI_COMMIT_TAG
  script:
    - ./build.sh
  artifacts:
    paths:
      - dist/*

publish:
  image:
    name: brenard/aptly-publish:latest
    entrypoint: ["/bin/sh", "-c"]
  stage: publish
  variables:
    APTLY_API_URL: "https://your.aptly.tld/api"
    APTLY_API_USERNAME: myproject
    APTLY_PREFIX: "debian"
    APTLY_REPO_COMPONENT: "main"
    APTLY_REPO_NAME: "debian_stable_main"
    APTLY_PATH: "dist"
    APTLY_SOURCE_NAME: "myproject"
    APTLY_MAX_RETRIES: 2
    APTLY_FORCE_OVERWRITE: true
  script:
    - echo "Publish Bullseye debian packages on APT repository..."
    - aptly-publish
  needs:
    - 'build'
  rules:
    - if: $CI_COMMIT_TAG
```

The parameters are passed using environment variables as designed with a Woodpecker CI plugin. Consequently, you could refer to the previous section for details about these parameters. For the password to request Aptly API, you have to set the `APTLY_API_PASSWORD` CI variable in your Gitlab project configuration (be sure to check _Masked variable_).