Di mana harus meletakkan konfigurasi Gradle (mis. Kredensial) yang tidak boleh dilakukan?

155

Saya mencoba untuk menyebarkan artefak Gradle-built ke repo Maven, dan saya perlu menentukan kredensial untuk itu. Ini berfungsi dengan baik untuk saat ini:

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

Tapi saya tidak suka harus menyimpan kredensial di kontrol sumber. Dengan Maven, saya akan mendefinisikan konfigurasi server, dan menetapkan kredensial di server saya ~/.m2/settings.xml. Bagaimana saya melakukan sesuatu yang mirip dengan Gradle?

Lóránt Pintér
sumber
3
Anda tahu bahwa menggunakan admin123 sebagai kata sandi buruk dari sudut pandang keamanan, benar;)
jwatkins

Jawaban:

228

~ / .gradle / gradle.properties :

mavenUser=admin
mavenPassword=admin123

build.gradle :

...
authentication(userName: mavenUser, password: mavenPassword)
Peter Niederwieser
sumber
2
Seharusnya gradle.propertiestidak masuk ke VCS?
theblang
24
Bukan yang ada di rumah pengguna Gradle (lihat jalur di atas).
Peter Niederwieser
Untuk beberapa versi kelas ... Gunakan mavenPass sebagai ganti mavenPassword
Rodrigo
2
Saya menyarankan meneruskan properti proyek sebagai berikut otentikasi (userName: project.properties.mavenUser, kata sandi: project.properties.mavenPassword) Ini tidak akan gagal membangun ketika tidak ada properti mavenUser / Kata Sandi yang ditentukan.
Dmitry
Saya harus melakukan hal yang sama tetapi menggunakan 2 variabel lingkungan yang berbeda: SONATYPE_NEXUS_USERNAME & SONATYPE_NEXUS_PASSWORD
Snicolas
94

Jawaban pertama masih valid, tetapi API telah berubah di masa lalu. Karena hasil edit saya tidak ada, saya mempostingnya sebagai jawaban terpisah.

Metode authentication()ini hanya digunakan untuk menyediakan metode otentikasi (misalnya Dasar) tetapi tidak untuk kredensial.

Anda juga tidak boleh menggunakannya karena itu mencetak kredensial pada kegagalan!

Ini bagaimana seharusnya terlihat seperti di Anda build.gradle

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

Di gradle.propertiesdalam direktori home user Anda:

mavenUser=admin
mavenPassword=admin123

Juga pastikan bahwa GRADLE_USER_HOMEdiatur ke ~/.gradlefile properti di sana tidak akan diselesaikan.

Lihat juga:

https://docs.gradle.org/current/userguide/build_environment.html

dan

https://docs.gradle.org/current/userguide/dependency_management.html (23.6.4.1)

kuesioner
sumber
Bisakah Anda mengklarifikasi bagaimana ini akan digunakan oleh OP? yaitu di mana ia akan duduk di namespace uploadArchives {repositori {mavenDeployer {
Matt C
Maaf, tetapi saya tidak mendapatkan pertanyaan Anda
kuesioner
4
OP menggunakan otentikasi dalam namespace uploadArchives> repositori> mavenDeployer> repositori> otentikasi. Mereka masih ingin menggunakan uploadArchives yang saya asumsikan, jadi bagaimana konfigurasi build OP terlihat dengan solusi Anda diterapkan? Apakah mereka perlu menghapus otentikasi, dan itu akan berfungsi?
Matt C
Sebenarnya saya tidak bisa memberi tahu Anda karena saya tidak pernah menggunakan namespace mavenDeployer. Uploadarchives masih merupakan tugas yang valid tetapi kredensial untuk tugas tersebut dikonfigurasi dalam maven namespace.
kuesioner
Jawaban ini tidak sesuai dengan pertanyaan. Itu menggunakan maven-publishplugin sementara pertanyaannya menggunakan mavenplugin.
Chry Cheng
16

Anda juga bisa menyediakan variabel pada baris perintah dengan -PmavenUser=user -PmavenPassword=password.

Ini mungkin berguna Anda tidak dapat menggunakan file properti gradle.prop untuk beberapa alasan. Misal pada server build, kami menggunakan Gradle dengan -gopsi sehingga setiap paket build memiliki sendiri GRADLE_HOME.

lucrussell
sumber
16

Jika Anda memiliki kredensial khusus pengguna (yaitu setiap pengembang mungkin memiliki nama pengguna / kata sandi berbeda) maka saya akan merekomendasikan menggunakan gradle-properties-plugin .

  1. Masukkan default gradle.properties
  2. Setiap pengembang mengabaikannya gradle-local.properties(ini harus diabaikan git).

Ini lebih baik daripada mengganti menggunakan $USER_HOME/.gradle/gradle.propertieskarena proyek yang berbeda mungkin memiliki nama properti yang sama.

Krishnaraj
sumber
Bisakah Anda menambahkan MWE yang berfungsi penuh. Cara memasukkan plugin dalam build.gradle. Bagaimana cara menggunakan kredensial dalam uploadArchiveskonfigurasi?
koppor
@koppor Tidak yakin apakah ini masih berfungsi tetapi saya telah menggunakannya dalam proyek open source saya - github.com/krishnaraj/oneclipboard/blob/master/build.gradle
Krishnaraj
7

Anda bisa meletakkan kredensial dalam file properti dan membacanya menggunakan sesuatu seperti ini:

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

Pendekatan lain adalah mendefinisikan variabel lingkungan di tingkat OS dan membacanya menggunakan:

System.getenv()['YOUR_ENV_VARIABLE']
David Levesque
sumber
2

Bagi Anda yang membuat MacOS, dan tidak suka meninggalkan kata sandi dalam bentuk teks pada mesin Anda, Anda dapat menggunakan alat gantungan kunci untuk menyimpan kredensial dan kemudian menyuntikkannya ke dalam build. Kredit diberikan ke Viktor Eriksson. https://pilloxa.gitlab.io/posts/safer-passwords-in-gradle/

Gabriel Kohen
sumber