// generate .drone.yaml, run: // drone jsonnet --format --stream local CreateRelease() = { name: 'create release', image: 'plugins/gitea-release', settings: { api_key: { from_secret: 'GITEA_API_KEY' }, base_url: 'https://git.unlock-music.dev', files: [ 'um-*.tar.gz', 'um-*.zip', ], checksum: 'sha256', draft: true, title: '${DRONE_TAG}', }, }; local StepGoBuild(GOOS, GOARCH) = { local windows = GOOS == 'windows', local archiveExt = if windows then 'zip' else 'tar.gz', local filepath = 'dist/um-%s-%s-%s.%s' % [GOOS, GOARCH, '$(git describe --tags --always)', archiveExt], local archive = if windows then [ // Ensure zip is installed 'command -v zip >/dev/null || (apt update && apt install -y zip)', 'zip -9 -j -r "%s" $DIST_DIR' % filepath, ] else [ 'tar -c -C $DIST_DIR um | gzip -9 > "%s"' % filepath, ], name: 'go build %s/%s' % [GOOS, GOARCH], image: 'golang:1.23', environment: { GOOS: GOOS, GOARCH: GOARCH, GOPROXY: 'https://goproxy.io,direct', }, commands: [ 'DIST_DIR=$(mktemp -d)', 'go build -v -trimpath -ldflags="-w -s -X main.AppVersion=$(git describe --tags --always)" -o $DIST_DIR ./cmd/um', 'mkdir -p dist', ] + archive, }; local StepUploadArtifact(GOOS, GOARCH) = { local windows = GOOS == 'windows', local archiveExt = if windows then 'zip' else 'tar.gz', local filename = 'um-%s-%s-%s.%s' % [GOOS, GOARCH, '$(git describe --tags --always)', archiveExt], local filepath = 'dist/%s' % filename, local pkgname = '${DRONE_REPO_NAME}-build', name: 'upload artifact', image: 'golang:1.23', // reuse golang:1.19 for curl environment: { DRONE_GITEA_SERVER: 'https://git.unlock-music.dev', GITEA_API_KEY: { from_secret: 'GITEA_API_KEY' }, }, commands: [ 'curl --fail --include --user "um-release-bot:$GITEA_API_KEY" ' + '--upload-file "%s" ' % filepath + '"$DRONE_GITEA_SERVER/api/packages/${DRONE_REPO_NAMESPACE}/generic/%s/${DRONE_BUILD_NUMBER}/%s"' % [pkgname, filename], 'sha256sum %s' % filepath, 'echo $DRONE_GITEA_SERVER/${DRONE_REPO_NAMESPACE}/-/packages/generic/%s/${DRONE_BUILD_NUMBER}' % pkgname, ], }; local PipelineBuild(GOOS, GOARCH, RUN_TEST) = { name: 'build %s/%s' % [GOOS, GOARCH], kind: 'pipeline', type: 'docker', steps: [ { name: 'fetch tags', image: 'alpine/git', commands: ['git fetch --tags'], }, ] + ( if RUN_TEST then [{ name: 'go test', image: 'golang:1.23', environment: { GOPROXY: 'https://goproxy.io,direct', }, commands: ['go test -v ./...'], }] else [] ) + [ StepGoBuild(GOOS, GOARCH), StepUploadArtifact(GOOS, GOARCH), ], trigger: { event: ['push', 'pull_request'], }, }; local PipelineRelease() = { name: 'release', kind: 'pipeline', type: 'docker', steps: [ { name: 'fetch tags', image: 'alpine/git', commands: ['git fetch --tags'], }, { name: 'go test', image: 'golang:1.23', environment: { GOPROXY: 'https://goproxy.io,direct', }, commands: ['go test -v ./...'], }, StepGoBuild('linux', 'amd64'), StepGoBuild('linux', 'arm64'), StepGoBuild('linux', '386'), StepGoBuild('windows', 'amd64'), StepGoBuild('windows', 'arm64'), StepGoBuild('windows', '386'), StepGoBuild('darwin', 'amd64'), StepGoBuild('darwin', 'arm64'), { name: 'prepare root', image: 'golang:1.23', commands: [ 'mv dist/*.tar.gz dist/*.zip ./', ], }, CreateRelease(), ], trigger: { event: ['tag'], }, }; [ PipelineBuild('linux', 'amd64', true), PipelineBuild('windows', 'amd64', false), PipelineBuild('darwin', 'amd64', false), PipelineRelease(), ]