Nơi để đặt cấu hình Gradle (tức là thông tin đăng nhập) không nên được cam kết?


155

Tôi đang cố gắng triển khai một tạo phẩm được tạo bởi Gradle cho một repo Maven và tôi cần chỉ định thông tin đăng nhập cho điều đó. Điều này hoạt động tốt cho bây giờ:

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: "http://.../nexus/content/repositories/snapshots/") {
                authentication(userName: "admin", password: "admin123")
            }
        }
    }
}

Nhưng tôi không thích phải lưu trữ thông tin đăng nhập trong kiểm soát nguồn. Với Maven, tôi sẽ xác định cấu hình máy chủ và gán thông tin đăng nhập trong ~/.m2/settings.xml. Làm thế nào để tôi làm một cái gì đó tương tự với Gradle?


3
Bạn biết rằng sử dụng admin123 làm mật khẩu là xấu từ góc độ bảo mật, phải không;)
jwatkins

Câu trả lời:


228

~ / .gradle / gradle.properies :

mavenUser=admin
mavenPassword=admin123

bản dựng .

...
authentication(userName: mavenUser, password: mavenPassword)

2
Không nên gradle.propertiesđược kiểm tra trong VCS?
theblang

24
Không phải là một trong nhà người dùng Gradle (xem đường dẫn ở trên).
Peter Niederwieser

Đối với một số phiên bản của lớp ... Sử dụng mavenPass thay vì mavenPassword
Rodrigo

2
Tôi khuyên bạn nên chuyển các thuộc tính của dự án như sau xác thực (userName: project.properIES.mavenUser, password: project.properIES.mavenPassword) Điều này sẽ không làm hỏng bản dựng khi không có thuộc tính mavenUser / Mật khẩu được chỉ định.
Dmitry

Tôi đã phải làm như vậy nhưng phải sử dụng 2 biến môi trường khác nhau: SONATYPE_NEXUS_USERNAME & SONATYPE_NEXUS_PASSWORD
Snicolas

94

Câu trả lời đầu tiên vẫn còn hiệu lực, nhưng API đã thay đổi trong quá khứ. Vì bản chỉnh sửa của tôi không được chấp nhận nên tôi đăng nó dưới dạng câu trả lời riêng.

Phương thức authentication()này chỉ được sử dụng để cung cấp phương thức xác thực (ví dụ Cơ bản) chứ không phải bất kỳ thông tin xác thực nào.

Bạn cũng không nên sử dụng nó vì nó in thông tin đăng nhập thất bại!

Đây là cách anh ấy trông giống như trong bạn build.gradle

    maven {
        credentials {
            username "$mavenUser"
            password "$mavenPassword"
        }
        url 'https://maven.yourcorp.net/'
   }

Trong gradle.propertiesthư mục userhome của bạn đặt:

mavenUser=admin
mavenPassword=admin123

Cũng đảm bảo rằng tệp GRADLE_USER_HOMEđược đặt thành ~/.gradlekhác, tệp thuộc tính sẽ không được giải quyết.

Xem thêm:

https://docs.gradle.org/civerse/userguide/build_en môi.html

https://docs.gradle.org/civerse/userguide/dependency_man Quản lý.html (23.6.4.1)


Bạn có thể làm rõ điều này sẽ được OP sử dụng như thế nào không? tức là nó sẽ ngồi ở đâu trong không gian tên uploadArchives {kho lưu trữ {mavenDeployer {
Matt C

Xin lỗi nhưng tôi không nhận được câu hỏi của bạn
câu hỏi

4
OP sử dụng xác thực trong không gian tên uploadArchives> kho lưu trữ> mavenDeployer> kho lưu trữ> xác thực. Họ vẫn muốn sử dụng uploadArchives tôi giả sử, vậy cấu hình xây dựng của OP sẽ trông như thế nào với giải pháp của bạn được áp dụng? Họ có cần xóa xác thực, và nó sẽ hoạt động?
Matt C

Thật ra tôi không thể nói với bạn vì tôi chưa bao giờ sử dụng không gian tên mavenDeployer. Uploadarchives vẫn là một tác vụ hợp lệ nhưng thông tin đăng nhập cho tác vụ đó được cấu hình trong không gian tên maven.
câu hỏi

Câu trả lời này không tương thích với câu hỏi. Đó là sử dụng maven-publishplugin trong khi câu hỏi đang sử dụng mavenplugin.
Chry Cheng

16

Bạn cũng có thể cung cấp các biến trên dòng lệnh với -PmavenUser=user -PmavenPassword=password .

Điều này có thể hữu ích khi bạn không thể sử dụng tệp gradle.properIES vì một số lý do. Ví dụ: trên máy chủ xây dựng, chúng tôi đang sử dụng Gradle với -gtùy chọn sao cho mỗi gói xây dựng có riêng GRADLE_HOME.


16

Nếu bạn có thông tin đăng nhập cụ thể của người dùng (tức là mỗi nhà phát triển có thể có tên người dùng / mật khẩu khác nhau) thì tôi khuyên bạn nên sử dụng plugin gradle-property-plugin .

  1. Đặt mặc định vào gradle.properties
  2. Mỗi nhà phát triển ghi đè bằng gradle-local.properties(điều này nên được bỏ qua git).

Điều này tốt hơn so với ghi đè sử dụng $USER_HOME/.gradle/gradle.propertiesvì các dự án khác nhau có thể có cùng tên tài sản.


Bạn có thể thêm một MWE làm việc đầy đủ. Làm thế nào để bao gồm các plugin trong build.gradle. Làm thế nào để sử dụng thông tin đăng nhập trong uploadArchivescấu hình?
koppor

@koppor Không chắc chắn nếu điều này vẫn hoạt động nhưng tôi đã sử dụng nó trong dự án nguồn mở của mình - github.com/krishnaraj/oneclipboard/blob/master/build.gradle
Krishnaraj

7

Bạn có thể đặt thông tin đăng nhập vào một tệp thuộc tính và đọc nó bằng cách sử dụng cái gì đó như thế này:

Properties props = new Properties() 
props.load(new FileInputStream("yourPath/credentials.properties")) 
project.setProperty('props', props)

Một cách tiếp cận khác là xác định các biến môi trường ở cấp độ HĐH và đọc chúng bằng cách sử dụng:

System.getenv()['YOUR_ENV_VARIABLE']

2

Đối với những người bạn đang xây dựng trên MacOS và không muốn để lại mật khẩu bằng văn bản rõ ràng trên máy của mình, bạn có thể sử dụng công cụ móc khóa để lưu thông tin đăng nhập và sau đó đưa nó vào bản dựng. Tín dụng cho Viktor Eriksson. https://pilloxa.gitlab.io/posts/safer-passwords-in-gradle/

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.