Skip to content

Publish from CircleCI

View as Markdown

A CircleCI job publishes to CloudRepo the way your laptop does: the build tool sends a repository token with the upload. What changes is where the token lives. Keep it in a CircleCI context, which gives every job that names the context an environment variable, and let a committed config file name that variable instead of holding the token.

  • A repository, and a repository token that reaches it. A token that publishes is Read + write; a job that only pulls needs Read only.
  • A token you create under Repository Tokens belongs to your account. Deleting a user from your organization deletes that user’s tokens, and any job using one stops authenticating. So create the token as an account that outlives any one person: a user you make for builds (see Create Your First User), signed in to the admin portal when it mints the token. The owner can instead create a service key, which belongs to your organization rather than to a user.
  • Your repository URL, https://your-org.mycloudrepo.io/repositories/your-repo, and the username that Maven, Gradle, Python and Docker clients send: the email address of the account that created the token. npm sends the token alone.
  1. In CircleCI, open Org, then Contexts, and click Create Context. Name it cloudrepo.
  2. Open the context, click Add Environment Variable, name it CLOUDREPO_TOKEN, and paste the token as the value.

A job that lists context: cloudrepo in the workflow receives CLOUDREPO_TOKEN as an environment variable, which is how the files below read it. CircleCI can restrict which members may use a context. See Contexts in CircleCI’s documentation.

To keep the token with one project instead, open Project Settings, then Environment Variables, and add CLOUDREPO_TOKEN there. CircleCI hides the value once it is saved, and the job then needs no context: line. See Set an environment variable.

Keep the token off the command line, which logs and process listings can show. The blocks on this page pass it through the environment or a file the tool reads.

Pick your client. The choice is remembered on every page of these docs. Each tab has the same parts: a file that names the token’s variable, the repository settings of your build, and the .circleci/config.yml. Commit them; none holds the token. Each workflow runs when you push a tag that starts with release-.

Maven reads the credential from a settings file. Commit this one as .mvn/settings.xml; ${env.CLOUDREPO_TOKEN} is replaced by the environment variable when Maven runs. Replace you@example.com with the email address of the account that created the token.

.mvn/settings.xml
<settings>
<servers>
<server>
<id>cloudrepo</id>
<username>you@example.com</username>
<password>${env.CLOUDREPO_TOKEN}</password>
</server>
</servers>
</settings>

The <id> must match the repository’s <id> in your pom.xml. <distributionManagement> is where mvn deploy publishes:

pom.xml
<distributionManagement>
<repository>
<id>cloudrepo</id>
<url>https://your-org.mycloudrepo.io/repositories/your-repo</url>
</repository>
</distributionManagement>

The job runs in CircleCI’s OpenJDK image, which carries Maven, and passes the settings file with --settings. The workflow gives the job the context and a tag filter:

.circleci/config.yml
version: 2.1
jobs:
publish:
docker:
- image: cimg/openjdk:17.0
steps:
- checkout
- run: mvn --batch-mode --settings .mvn/settings.xml deploy
workflows:
publish:
jobs:
- publish:
context:
- cloudrepo
filters:
tags:
only: /^release-.*/
branches:
ignore: /.*/

Expected: the job ends with BUILD SUCCESS, and the artifact is listed in the repository in the admin portal. To resolve dependencies from the same repository in a build, add a <repositories> block with the same URL; see Maven Repositories.

  • 401 Unauthorized. The credential was refused. The username must be the email address of the account that created the token, and the token must not be expired or revoked. Check that the variable is named CLOUDREPO_TOKEN, that the job lists the context that holds it, and that its value is the whole token. The full list is on Repository Tokens.
  • 403 Forbidden. The token does not reach this repository, or it is Read only and the job publishes. Create a Read + write token that includes the repository.
  • 409 Conflict from mvn deploy. The release version you are publishing already exists, and Overwrite Protection refuses to replace it. Publish a new version, or use a -SNAPSHOT version while you iterate. See Maven Overwrite Protection. Python repositories have the same setting: Python Repositories.