= Releasing Apache Camel K

This procedure describes all the steps required to release a new version of Apache Camel K.
It is not intended to be final, but rather a working document that needs to be updated when new requirements are found or
the technical process changes.

[[releasing-camel-kamelets]]
== Releasing Camel Kamelets

The https://github.com/apache/camel-kamelets[Camel Kamelets] repository contains some artifacts that need to be pushed into Maven together
with a Camel K release.

Follow instructions on https://github.com/apache/camel-kamelets[Camel Kamelets] for the commands needed to release it.

Go to https://repository.apache.org/ and close the staging repository.

A URL will be generated for the repository, like: https://repository.apache.org/content/repositories/orgapachecamel-xxxx. The URL needs to be communicated during the voting process.

The source code for the created tag, with sha512sum and signature need to be copied in the Apache dev SVN at https://dist.apache.org/repos/dist/dev/camel/camel-kamelets/<version>.

Commit all files to the SVN.

Voting can start for camel-kamelets, or a combined vote with camel-k can be started later.

[[releasing-camel-k-runtime]]
== Releasing Camel K Runtime

The https://github.com/apache/camel-k-runtime[Camel K Runtime project] is not a standalone project, it's meant to be used with Camel K. For this reason, it's common to release the runtime artifacts together with a release of Camel K.
To avoid depending on snapshots, camel-k-runtime can be also released independently.

Follow the https://github.com/apache/camel/blob/main/docs/user-manual/modules/ROOT/pages/release-guide.adoc[Camel release guide] in order to setup the Maven environment and gpg for the release.

To prepare a release and check problems:
```
./mvnw release:prepare -DdryRun -Prelease
```

Check the signatures of the files, then clean and prepare the actual release:

```
./mvnw release:clean -Prelease
./mvnw release:prepare -Prelease
```

Then perform the release:

```
./mvnw release:perform -Prelease
```

Go to https://repository.apache.org/ and close the staging repository.

A URL will be generated for the repository, like: https://repository.apache.org/content/repositories/orgapachecamel-xxxx. The URL needs to be communicated during the voting process.


The apache-camel-k-runtime-<version>-source-release.zip file present in path `/org/apache/camel/k/apache-camel-k-runtime/<version>/` (and sha512 sum, if present) will need to be copied in the Apache dev SVN at https://dist.apache.org/repos/dist/dev/camel/camel-k-runtime/<version>.

If the sha512 file is missing, one should be generated before committing to SVN.

Commit all files to the SVN.

Voting can start for camel-k-runtime, or a combined vote with camel-k can be started later.


[[releasing-camel-k]]
== Releasing Camel K

Releasing the Camel K main artifacts require some manual steps.

First thing is to checkout main branch and sync with upstream.

Next, the version of the runtime libraries to use need to be aligned in the Makefile (use the just released camel-k-runtime version if available).

The following tasks need to be done:
- Align KAMELET_CATALOG_REPO_BRANCH in Makefile to latest released tag of the camel-kamelets repository
- Align RUNTIME_VERSION in Makefile to latest runtime release
- Align all libraries to the ones used in the chosen runtime (e.g. CAMEL_QUARKUS_VERSION and QUARKUS_VERSION)
- Set STAGING_RUNTIME_REPO to the URL of the staging repo (if using a staged camel-k-runtime version)
- Ensure LAST_RELEASED_VERSION points to latest released version of Camel K

```
make clean codegen set-version build-resources check-licenses
```

Rebuild auto-generated data, including trait info:

```
make generate
```

Remove all snapshot files in the `/deploy` directory, then run again:
```
# After removing snapshots from /deploy
make clean build-resources
```

Run build and basic tests:
```
make
```

Sync the main branch (with your changes) with upstream.

```
git add *
git commit -m "preparing for next release"
# assuming write permissions
git push upstream main
```

Now the release on staging can be executed.

Change the version on Makefile to next version of camel-k (usually, just remove '-SNAPSHOT' from the version)
```
# after removing '-SNAPSHOT' from current VERSION in makefile
make release-staging
```

Binary files will be generated and put in the project root directory, including examples.
All those files should be put in the corresponding directory of the camel-k dev SVN at https://dist.apache.org/repos/dist/dev/camel/camel-k/<version>.

Sources are not produced directly by the scripts, but since the procedure is creating a tag, the source code in tar.gz format can be downloaded from Github
at: https://github.com/apache/camel-k/releases

After copying all the files to the dev SVN, a `sign.sh` script in the parent directory can be used to sign all the uploaded artifacts:

```
./sign.sh <version> <gpg_pass>
```

Commit all files to the SVN.

A docker image `camelk/camel-k:<version>` will be pushed to the staging organization (`camelk`, not `apache`).


[[testing]]
== Do some testing

A combined release can be immediately tested with the following install command:

```
kamel install --operator-image=camelk/camel-k:$CAMEL_K_VERSION --maven-repository=https://repository.apache.org/content/repositories/orgapachecamel-$APACHE_NEXUS_RUNTIME_REPO_ID
```


[[release-notes]]
== Release notes

Release notes can be generated with:


```
# Check that VERSION points to the current version and LAST_RELEASED_VERSION points to the immediately previous one
make release-notes
```

A `release-notes.md` file is generated and can be attached to the release github issue for reference.


[[voting]]
== Voting

An email should be sent to dev@camel.apache.org asking to test the staged artifacts. Voting will be left open for at least 72 hours.

[[finalizing]]
== Finalizing the release

After the voting is complete with success, the artifacts can be released.

Release the staging repository at: https://repository.apache.org.

Republish docker image in the Apache org on Docker Hub:

```
# assuming logged in to docker hub
docker pull camelk/camel-k:$VERSION
docker tag camelk/camel-k:$VERSION apache/camel-k:$VERSION
docker push apache/camel-k:$VERSION
```

Artifacts committed on https://dist.apache.org/repos/dist/dev/ before the voting process need to be copied to the
Apache dist repository on: https://dist.apache.org/repos/dist/release/camel.

The same should be done for camel-kamelets and camel-k-runtime in case of combined vote.

Wait for maven mirrors to sync the new artifacts. This can take more than 1 hour sometimes.

Binary files can be now released on Github, together with release notes generated in previous step.
Files need to be uploaded manually to a new Github release.

Before announcing the release, a simple test should be done to verify that everything is in place (running a "Hello World" integration
after an installation done with a simple `kamel install`).
Do a simple final test.

The release can be now announced to dev@camel.apache.org and users@camel.apache.org.

A PMC member with access to the @ApacheCamel Twitter account should announce the release on Twitter as well.

Download section on the website needs to be put in sync to display the new release.
Checkout the website and put an entry under `content/releases/k` with the version of the new release (copy the last release as template).
The milestone field in the release doc is the Github id for the milestone (e.g. for v1.4.1, the milestone is 22).

[[post-release]]
== Post Release

=== Operator Hub

The https://github.com/operator-framework/community-operators[OperatorHub] downstream channel should be synced to publish the latest version
of Camel K, so that it can be easily installed on platforms that support Operator Hub.

You can create the bundle using the `make bundle` command, then upload the CRD and CSV to the "community-operators" repository (2 PRs, one for OpenShift and one for all other platforms).

=== Helm

An helm chart must be generated with the new version.

First update the chart version in the `Chart.yaml` file under the `/helm` section, setting a new chart release.

From the main branch:

```
./script/set-version.sh <released-version>
make generate-helm
```

Commit to the main branch the tar.gz file and the updated index that have been generated in `/docs/charts` and the updated `Chart.yaml`.

Wait for them to be available on https://hub.helm.sh/.

=== Homebrew

The https://brew.sh/[HomeBrew] formula for _kamel_ must be synced to download and build the latest version of https://github.com/apache/camel-k[Camel-K], so it can be easily installed on _macOs_ and _Linux_ platforms.

To do so, the content of https://github.com/Homebrew/homebrew-core/blob/master/Formula/kamel.rb[homebrew-core/Formula/kamel.rb] _(the package definition)_ should be updated to point the latest release of https://github.com/apache/camel-k[Camel-K]. 

More importantly the _tag_ and _revision_ section configuration should change for a new release e.g
```
  url "https://github.com/apache/camel-k.git",
    :tag      => "0.3.4",
    :revision => "c47fb2c85e89852f0fd111d1662f57917030ced5"
  head "https://github.com/apache/camel-k.git"
```

_P.S please note that the bottles are created using the https://docs.brew.sh/Brew-Test-Bot[Brew Test Bot]   https://docs.brew.sh/Bottles[ [1] ]._
