Jenkins: Masalah izin menggunakan Docker sebagai lingkungan pembuatan

11

Saya menginstal Jenkins pada mesin Ubuntu 16.04. Jenkins sendiri tidak dijalankan dalam wadah. Yang ingin saya lakukan hanyalah menelepon yarn installmenggunakan gambar node. Jadi inilah Jenkinsfile saya:

pipeline {
    agent any
    stages {
        stage('install node modules...') {
            agent { docker 'node' }
            steps {
                sh 'cd /path/to/package.json; yarn install'
            }
        }
    }
}

Cukup mudah, bukan?

jenkins user / group adalah 112:116, dan uid dari node node adalah 1000, maka proses benang (yang dijalankan sebagai pengguna node 1000) tidak dapat melakukan hal-halnya, seperti mkdir /.config.

Saya mencoba untuk memutar wadah node lewat dalam argumen -u 1000, itu menabrak masalah izin ketika mencoba membuat direktori yang tahan lama.

Sepertinya ada satu atau beberapa masalah, bagaimana saya bisa mengatasinya?

Log Jenkins:

Di bawah ini adalah di mana pembangunan dimulai dan gagal.

[Pipeline] sh
[Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2] Running shell script
+ docker inspect -f . node
.
[Pipeline] withDockerContainer
Jenkins does not seem to be running inside a container
$ docker run -t -d -u 112:116 -w /var/lib/jenkins/workspace/Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2 -v /var/lib/jenkins/workspace/Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2:/var/lib/jenkins/workspace/Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2:rw,z -v /var/lib/jenkins/workspace/Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2@tmp:/var/lib/jenkins/workspace/Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2@tmp:rw,z -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** --entrypoint cat node
[Pipeline] {
[Pipeline] sh
[Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2] Running shell script
+ cd /path/to/package.json
+ yarn install
yarn install v0.24.6
error An unexpected error occurred: "EACCES: permission denied, mkdir '/.config'".
info If you think this is a bug, please open a bug report with the information provided in "/var/lib/jenkins/workspace/Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2/<path>/yarn-error.log".
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
[Pipeline] }
$ docker stop --time=1 c1147934ea689f71a449e486282db03338b12182368def31bdf8e8cf179ab46a
$ docker rm -f c1147934ea689f71a449e486282db03338b12182368def31bdf8e8cf179ab46a
[Pipeline] // withDockerContainer
[Pipeline] }
[Pipeline] // node
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code 1
Finished: FAILURE
Michael
sumber
Silakan tambahkan log
030
Terlampir log. Saya juga mencoba menjalankan Jenkins menggunakan gambar buruh pelabuhan resminya, yang berfungsi dengan baik, karena pengguna jenkins dalam gambar buruh pelabuhan itu adalah 1000, yang merupakan uid yang sama dengan pengguna simpul dalam gambar simpul.
Michael
Apakah selinux diaktifkan dan ditegakkan?
James Shewey
@ JamesShewey Tidak yakin. Saya cukup meregangkan instance AMI ec2 ubuntu.
Michael
Saya percaya mereka menonaktifkannya, tetapi periksa dengan "sestatus." Jika aktif, coba matikan.
James Shewey

Jawaban:

8

Saya memiliki masalah yang sama dengan simpul. Masalahnya file dalam wadah dimiliki oleh "root: root". Coba tambahkan buruh pelabuhan argumen -u root:root:

docker { 
    image 'node:8'
    args '-u root:root'
}
buram
sumber
Solusi juga bekerja untuk saya. Mengapa ini tidak ada dalam dokumentasi Jenkins? (Masalah saya adalah dengan pip installperintah sederhana yang menghasilkan Could not install packages due to an EnvironmentError: [Errno 13] Permission denied; menyebutkannya di sini untuk membantu orang mencari itu. Bahkan menggunakan virtualenvatau pip install --usertidak memperbaiki masalah untuk saya)
Rabarberski
3

Saya baru saja mengalami masalah yang sama hari ini, meskipun dengan gambar lain.

docker {
 image 'node:8'
 args '--tmpfs /.config'
}

Referensi: https://docs.docker.com/storage/tmpfs/ Dengan cara ini Anda tidak perlu khawatir tentang kebocoran keamanan atau file yang ada setelah wadah dihancurkan di dalam jenkins.

Landasan
sumber
3

buildEnv.inside("-u 0") {}menyelesaikan masalah saya. Namun kemudian workspace akan berisi direktori dan file-file yang dimiliki oleh root yang tidak bisa dihapus oleh pengguna Jenkins di jalankan selanjutnya saat membersihkan ruang kerja, jadi saya telah menambahkan sh "sudo chown jenkins: -R \$PWD/" di awal pipeline.

AhmedDrira
sumber
Saya menggunakan pendekatan yang serupa, tetapi menjalankan 'sh "chmod -R a + w \ $ PWD"' di akhir, sebagai langkah "Pembersihan" dari pipa bukannya chown di awal. Pengguna Jenkins tidak didefinisikan dalam wadah saya, dan sudo tidak tersedia. Saya bisa menghapus file juga, tetapi berpikir mungkin lebih baik menyimpannya untuk penyelidikan jika ada yang salah.
Olivier Boudry