使用新标记将docker发布步骤添加到sbt-release进程

时间:2017-05-18 21:46:36

标签: scala docker continuous-integration sbt sbt-release

我将sbt-release插件集成到我们的项目中,以便将所有构建+发布任务委派给它。

它基本上完成了我们所需要的一切,但我还要添加一个额外的ReleaseStep:发布一个Docker镜像。这是我当前的releaseProcess(根据this):

releaseProcess := Seq[ReleaseStep](
  checkSnapshotDependencies,
  inquireVersions,
  runTest,
  setReleaseVersion,
  commitReleaseVersion,
  tagRelease,
  //publishArtifacts,
  releaseStepCommand("docker"),
  setNextVersion,
  commitNextVersion
  //pushChanges,
)

(评论推送相关的东西不要破坏上游的任何东西)

除了生成的Docker图片获得的标记之外,它大部分都很精致和花哨。

例如,如果项目版本为0.17.0-SNAPSHOT,并且我想发布版本1.0.0,则会发生类似这样的事情:

[develop] ✓ [17:54:22] lithium : ~/devel/some-company/some-app
➤ sbt clean "release skip-tests"
[info] Loading project definition from /opt/devel/some-company/some-app/project
[info] Updating {file:/opt/devel/some-company/some-app/project/}some-app-build...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Set current project to someapp (in build file:/opt/devel/some-company/some-app/)
[warn] Multiple resolvers having different access mechanism configured with same name 'local'. To avoid conflict, Remove duplicate project resolvers (`resolvers`) or rename publishing resolver (`publishTo`).
[warn] Credentials file /var/jenkins_home/credentials/nexus_creds does not exist
[success] Total time: 0 s, completed May 18, 2017 5:54:56 PM
[info] Starting release process off commit: a7acde4d0e943be1e4befa6cc70dc873e164044a
[warn] Multiple resolvers having different access mechanism configured with same name 'local'. To avoid conflict, Remove duplicate project resolvers (`resolvers`) or rename publishing resolver (`publishTo`).
[warn] Credentials file /var/jenkins_home/credentials/nexus_creds does not exist
[info] Updating {file:/opt/devel/some-company/some-app/}root...
[info] Done updating.
[warn] Found intransitive dependency (net.logstash.logback:logstash-logback-encoder:4.7) while publishMavenStyle is true, but Maven repositories
[warn]   do not support intransitive dependencies. Use exclusions instead so transitive dependencies
[warn]   will be correctly excluded in dependent projects.
[warn]            
Release version [0.17.0] : 1.0.0
Next version [1.0.1-SNAPSHOT] : 
[info] Setting version to '1.0.0'.
[info] Reapplying settings...
[info] Set current project to someapp (in build file:/opt/devel/some-company/some-app/)
[info] [develop db69b0a] Setting version to 1.0.0
[info]  1 file changed, 1 insertion(+), 1 deletion(-)
[info] Reapplying settings...
[info] Set current project to someapp (in build file:/opt/devel/some-company/some-app/)
[info] Packaging /opt/devel/some-company/some-app/target/scala-2.11/someapp_2.11-0.17.0-SNAPSHOT-sources.jar ...
[warn] Multiple resolvers having different access mechanism configured with same name 'local'. To avoid conflict, Remove duplicate project resolvers (`resolvers`) or rename publishing resolver (`publishTo`).
[warn] Credentials file /var/jenkins_home/credentials/nexus_creds does not exist
[info] Done packaging.
[info] Wrote /opt/devel/some-company/some-app/target/scala-2.11/someapp_2.11-0.17.0-SNAPSHOT.pom
Warning: node.js detection failed, sbt will use the Rhino based Trireme JavaScript engine instead to run JavaScript assets compilation, which in some cases may be orders of magnitude slower than using node.js.
[info] Packaging /opt/devel/some-company/some-app/target/scala-2.11/someapp_2.11-0.17.0-SNAPSHOT-web-assets.jar ...
[info] Done packaging.
[info] Compiling 107 Scala sources and 36 Java sources to /opt/devel/some-company/some-app/target/scala-2.11/classes...
[info] Main Scala API documentation to /opt/devel/some-company/some-app/target/scala-2.11/api...
[warn] Class javax.annotation.CheckReturnValue not found - continuing with a stub.
[warn] /opt/devel/some-company/some-app/app/services/DOPXHandlerActor.scala:44: non-variable type argument services.DOPX in type pattern List[services.DOPX] (the underlying of List[services.DOPX]) is unchecked since it is eliminated by erasure
[warn]     case reqs:List[DOPX] => withMDC { // PASAR A CASE CLASS 
[warn]               ^
[warn] /opt/devel/some-company/some-app/app/services/DOPXHandlerActor.scala:44: non-variable type argument services.DOPX in type pattern List[services.DOPX] (the underlying of List[services.DOPX]) is unchecked since it is eliminated by erasure
[warn]     case reqs:List[DOPX] => withMDC { // PASAR A CASE CLASS 
[warn]               ^
[warn] /opt/devel/some-company/some-app/app/controllers/TransactionController.scala:79: match may not be exhaustive.
[warn] It would fail on the following input: (None, Success(_))
[warn]               paymentConfirmationsService.confirm(siteId, chargeId, operationResource, request.headers.get("user")) map { _ match  {
[warn]                                                                                                                           ^
[warn] there were 15 feature warnings; re-run with -feature for details
[warn] /opt/devel/some-company/some-app/app/services/DistributedTransactionProcessor.scala:139: match may not be exhaustive.
[warn] It would fail on the following input: Some(_)
[warn]     failureResponse match {
[warn]     ^
[warn] /opt/devel/some-company/some-app/app/services/DistributedTransactionProcessor.scala:312: match may not be exhaustive.
[warn] It would fail on the following inputs: (_, Failure(_)), (_, Success(_))
[warn]       distributedOperationProcessor.processDistributedOPx(opDataFatherFixed.chargeId, Rechazada(), opDataFatherFixed, None, meanPayment, Some(refundSubPaymentOperations)).map( pr => pr match {
[warn]                                                                                                                                                                                       ^
model contains 337 documentable templates
[warn] /opt/devel/some-company/some-app/app/services/refunds/RefundService.scala:346: match may not be exhaustive.
[warn] It would fail on the following input: None
[warn]                 operation.sub_transactions.find { subTx => subTx.subpayment_id.get == subpaymentId } match {
[warn]                                                 ^
[warn] /opt/devel/some-company/some-app/app/services/ApplicationTimer.scala:9: Could not find any member to link for "ApplicationLifecycle".
[warn] /**
[warn] ^
[warn] three warnings found
[info] Main Scala API documentation successful.
[info] Packaging /opt/devel/some-company/some-app/target/scala-2.11/someapp_2.11-0.17.0-SNAPSHOT-javadoc.jar ...
[info] Done packaging.
[warn] there were 15 feature warnings; re-run with -feature for details
[warn] 30 warnings found
[warn] bootstrap class path not set in conjunction with -source 1.6
[info] /opt/devel/some-company/some-app/app/legacy/some-company/sps/domain/DBParametros.java: Some input files use unchecked or unsafe operations.
[info] /opt/devel/some-company/some-app/app/legacy/some-company/sps/domain/DBParametros.java: Recompile with -Xlint:unchecked for details.
[info] Packaging /opt/devel/some-company/some-app/target/scala-2.11/someapp_2.11-0.17.0-SNAPSHOT.jar ...
[info] Done packaging.
[info] Packaging /opt/devel/some-company/some-app/target/scala-2.11/someapp_2.11-0.17.0-SNAPSHOT-sans-externalized.jar ...
[info] Done packaging.
[info] Sending build context to Docker daemon  108.9MB
[info] Step 1/8 : FROM lapp-dvde004:5000/java-alpine:latest
[info]  ---> fd94b5262b7b
[info] Step 2/8 : MAINTAINER Redbee
[info]  ---> Using cache
[info]  ---> 2905e1a8a792
[info] Step 3/8 : WORKDIR /opt/docker
[info]  ---> Using cache
[info]  ---> 0b2f169737f6
[info] Step 4/8 : ADD opt/ /opt
[info]  ---> a973fb66a793
[info] Removing intermediate container f6da68f8a1c3
[info] Step 5/8 : ADD opt/docker/conf/jce_policy-8.tar.gz /usr/lib/jvm/default-jvm/jre/lib/security/
[info]  ---> 3fda5972ddd5
[info] Removing intermediate container cb10f1fcf2dd
[info] Step 6/8 : RUN chown -R daemon:daemon .
[info]  ---> Running in 867093c046e0
[info]  ---> 60a969ff427c
[info] Removing intermediate container 867093c046e0
[info] Step 7/8 : USER daemon
[info]  ---> Running in a7fa422e326c
[info]  ---> 8857a5a5392b
[info] Removing intermediate container a7fa422e326c
[info] Step 8/8 : ENTRYPOINT /opt/docker/conf/wrapper.sh
[info]  ---> Running in 31887383f984
[info]  ---> 2418dba2d69e
[info] Removing intermediate container 31887383f984
[info] Successfully built 2418dba2d69e
[info] Successfully tagged lapp-dvde004:5000/someapp:0.17.0-SNAPSHOT
[info] Built image lapp-dvde004:5000/someapp:0.17.0-SNAPSHOT
[info] Update Latest from image lapp-dvde004:5000/someapp:0.17.0-SNAPSHOT
[success] Total time: 58 s, completed May 18, 2017 5:56:07 PM
[info] Setting version to '1.0.1-SNAPSHOT'.
[info] Reapplying settings...
[info] Set current project to someapp (in build file:/opt/devel/some-company/some-app/)
[info] [develop a1dd63d] Setting version to 1.0.1-SNAPSHOT
[info]  1 file changed, 1 insertion(+), 1 deletion(-)

可悲的是,我无法突出显示代码,但它说:

[info] Setting version to '1.0.0'.
[info] Reapplying settings...

然后构建的图像是:

[info] Built image lapp-dvde004:5000/someapp:0.17.0-SNAPSHOT

在我有限的理解中,似乎sbt-release和sbt-docker(或sbt-native-packager,我尝试过两者)不共享相同的构建上下文?沿着这条路线的东西?

sbt-release在sbt-docker启动之前成功更改了version.sbt文件,但后者仍然不介意。

有什么想法吗?

PS:Funfact:This question显然有答案(或者至少他的要求与我的要求相符),所以,pandaforme,如果你读到这个,你为什么要删除那个要点!? :(

1 个答案:

答案 0 :(得分:0)

感谢神奇的pandaforme重新上传了上述要点,它现在正在运作。

所以,我实施了两件事:A'发布'这个过程也构建了一个Docker镜像,还有一个自定义任务" publishSnapshot'这是发布'的一种扩展。 (发布快照及其码头图像;也称为"当我可以做sbt publish dockerBuildAndPush"时过度工程。)。

实施,如果有人需要它:

val publishDocker = ReleaseStep(action = st => {
  val extr: Extracted = Project.extract(st)
  val ref: ProjectRef = extr.get(thisProjectRef)
  extr.runAggregated(
    sbtdocker.DockerKeys.dockerBuildAndPush in sbtdocker.DockerPlugin.autoImport.docker in ref,
    st
  )
  st
})

lazy val publishSnapshot = taskKey[Unit]("Publish a Snapshot and it's Docker image")
publishSnapshot in Compile := Def.sequential(
  publish in Compile,
  sbtdocker.DockerKeys.dockerBuildAndPush in sbtdocker.DockerPlugin.autoImport.docker
).value

releaseProcess := Seq[ReleaseStep](
  checkSnapshotDependencies,
  inquireVersions,
  runTest,
  setReleaseVersion,
  commitReleaseVersion,
  tagRelease,
  publishArtifacts,
  publishDocker,
  setNextVersion,
  commitNextVersion,
  pushChanges
)