単純なJenkinsfile
を実行できません-例.
pipeline {
agent { label 'ssh-slave' }
stages {
stage('Shell Test') {
steps {
sh 'echo "Hello World"'
}
}
}
}
マスター上のJenkinsのログファイルは、コンテナが正常に開始されたが、ビルドジョブが次のようなメッセージでクラッシュすることを示しています
sh: 1: /home/jenkins/workspace/pipeline@tmp/durable-34c21b81/script.sh: Permission denied
以下に、構成/把握した追加の事項をいくつか示します。
VM RHELでエージェントを実行しています
Docker Plugin を使用して、Jenkinsが別のJenkinsエージェントでコンテナーを起動/管理します
JenkinsプラグインのConnect with ssh
メソッドを使用してDockerコンテナーを起動し、 jenkinsci/ssh-slave Docker image を使用します
JenkinsはDockerコンテナーでroot
ユーザーを使用しています(少なくとも/home/jenkins/...
内のすべてのファイルはrootとして作成されます)
sleep
ステップをパイプラインに追加し、docker exec...
を実行中のコンテナーに追加する場合、./script.sh
で実行しようとすると、単純なシェルスクリプトをrootとして実行できません(前にchmod +x script.sh
で適切なファイルモードを設定した場合)-sh: 1: permission denied
も取得します。しかし、sh script.sh
を使用すると、スクリプトを実行できます
Dockerコンテナー内のroot
ユーザーはbash
を持っていますが、Jenkinsはsh
を使用してスクリプトを実行しようとしています。
Dockerプラグインのテンプレート設定でrun privileged
フラグをチェックするかどうかに関係なく、エラーが発生します
すでに試したがうまくいかなかったもの
Dockerコンテナのroot
ユーザーのログインシェルを/bin/sh
に変更する
sh
ステップでのシバンの提供、アラ
sh '' '#!/ bin/sh echo "hello world" ' ''
Jenkinsグローバル構成でShell executorを/bin/sh
に設定する
Dockerfile
がENTRYPOINT
スクリプトを実行せず、最後に/bin/sh
を実行するように、sshスレーブDockerイメージのbash
を変更する
どんな助けでもありがたいです!
問題は、コンテナの/home/jenkins
がnoexec
でマウントされたことでした:
$ mount
/dev/mapper/rhel-var on /home/jenkins type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,noquota)
根本的な問題は、基盤となるホストの/var
がnoexec
でマウントされたことでした(/var
はすべてのコンテナファイルが存在する場所です...):
$ mount
/dev/mapper/rhel-var on /var type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,noquota)
したがって、この問題の解決策は、ホスト上で/var
を実行可能としてマウントすることでした。
Sudo mount -o remount,exec /var
これで問題は解決しました。