我一直在尝试从我的Docker Hub存储库中将私有(自定义)MySQL映像作为服务引入gitlab-ci.yml管道.我添加了一个尝试使用我的用户名和密码(CI变量)登录dockerhub的before_script.失败的构建日志中没有输出表明登录到Docker Hub是否成功,但我假设没有,因为我的图像的拉动失败并显示以下消息(编辑:或者它甚至从未尝试过,因为gitlab试图获取在运行before脚本之前的服务?):
存储库不存在或可能需要'docker login'(executor_docker.go:168:0s)
我正在使用共享运行器(因为我相信这是我使用gitlab.com的唯一选择吗?)我已经看到了很多关于docker的gitlab ci标记的提及但是我没有找到解释如何促进这个的文档.
我确信我只是忽略了某些事情/不理解或在我的搜索中遇到了相应的解决方案,所以如果我只是缺乏经验并且事先感谢任何帮助,那么道歉.
我的gitlab-ci(maven变量是因为这个项目的构建依赖于私有maven repo.数据库和redis主机变量在运行时被注入我的应用程序,因此他们知道要指向哪个容器)
image: maven:3.5.0-jdk-8
before_script:
- "docker login -u$DOCKER_USER -p$DOCKER_PASS" #pipeline variables
variables:
MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"
MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"
DATABASE_HOST: mysql
REDIS_HOST: redis
services:
- name: privaterepo/private-mysql-schema
alias: mysql
- name: redis:latest
alias: redis
stages:
- build
maven-build:
stage: build
script: "mvn $MAVEN_CLI_OPTS package -B"
artifacts:
paths:
- target/*.jar
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,它是一个尤里卡发现客户端。
它在我的 Eureka 服务器上注册得很好。
遗憾的是,当我尝试在任何 @Component 或 @Service 类中自动装配 EurekaClient 以获取注册表实例详细信息时,我被告知我无法自动装配,因为有 2 个 bean 定义:
我不知道是什么原因造成的。我的 pom.xml 文件中有以下依赖项。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<exclusions>
<exclusion>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
</exclusion>
</exclusions>
</dependency>
Run Code Online (Sandbox Code Playgroud)
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jersey</artifactId>
</dependency>`
Run Code Online (Sandbox Code Playgroud)
第一个依赖项中的排除是由于与第二个依赖项冲突。
我的应用程序是通过以下配置类启用发现的应用程序:
@Configuration
@EnableDiscoveryClient
public class EurekaDiscoveryConfiguration {
}
Run Code Online (Sandbox Code Playgroud)
我真的不明白为什么它认为有 2 个 bean 与该描述匹配。
FWIW,奇怪的是,我可以在没有用 @Component 或 @Service 注释的类中自动装配它......并且它们工作 - 我已经设法让它们正确返回实例信息。
我有一种感觉,并且我已经阅读了一些关于它的内容,即在我的服务中使用 jersey 2.0 会干扰 eureka。我可能只是换领事......
非常感谢您提供任何建议。
编辑:(添加测试类)
这并没有告诉你太多 - 这只是基本的应用程序测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class MyAppApplicationTest {
@Test
public void contextLoads() {
}
}
Run Code Online (Sandbox Code Playgroud)
...许多测试扩展了该类,但它本身都失败了。尝试构建我目前已自动装配 …
我已经建立了一个春季启动项目.
在其中,我有一个如下所示的属性类:
@Configuration
@PropertySource(value = "classpath:abc.properties")
@ConfigurationProperties
public class ABCProperties {
private Map<String, String> someUrls;
@Bean
public Map<String, String> someUrls() {
return someUrls;
}
public Map<String, String> getSomeUrls() {
return someUrls;
}
public void setSomeUrls(Map<String, String> someUrls) {
this.someUrls = someUrls;
}
}
Run Code Online (Sandbox Code Playgroud)
abc.properties文件的内容如下所示:
someUrls.urlA=someURL
someUrls.urlB=someOtherURL
在项目中,在resources文件夹(和test resources文件夹)中,我提供了一个abc.properties文件.一旦构建并运行,程序就可以按预期访问abc.properties文件中的属性(也可以在测试中正确访问) - 它们很好地映射到我的url映射.
到现在为止还挺好.
但是,我在属性类中引用的URL并不总是相同.在某些部署中,我想覆盖它们.使用我的application.properties文件中指定的属性,这很容易; 只是在我运行应用程序的同一个(根)文件夹中有另一个外部application.properties文件将覆盖我自动放入的任何属性.
我想要做的有时也是在应用程序的根文件夹中放置一个外部abc.properties文件,并以相同的方式覆盖abc.properties属性.当然我试过这个,但是内置在jar中的abc.properties文件中的属性会被保留而不会被覆盖.实际上,我不确定spring boot程序是否识别出根文件夹中存在另一个外部abc.properties文件.
我似乎无休止地阅读了如何在没有成功的情况下实现这一目标.我也尝试在我的application.properties中指定以下内容,但它没有任何区别(即使它确实有效也不理想,因为我不想在所有情况下都指定直接路径).
spring.config.location=/path/to/application/root/
spring.config.name=abc.properties
如果我不得不猜测,问题是在属性类中我指向'classpath:..'并且外部文件实际上不在类路径上,因为它是......外部的.
但是 spring boot知道如何在其根应用程序文件夹中查找覆盖application.properties所以我希望它也能够查找其他属性文件来覆盖?我只是无法理解如何实现这一目标.
是的,我特别希望我的属性在这个abc.properties文件而不是应用程序属性中.
非常感谢您的帮助!