Skip to content

Commit

Permalink
refa
Browse files Browse the repository at this point in the history
  • Loading branch information
rtmigo committed Oct 20, 2022
1 parent c9f22a1 commit f727489
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 73 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/test-and-stage.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ jobs:
echo "result=$VERSION" >>$GITHUB_OUTPUT
- name: Build
run: |
export GPG_TTY=$(tty)
#export GPG_TTY=$(tty)
./gradlew uberJar
mv ./build/libs/mavence.uber.jar ./build/libs/mavence.jar
env:
Expand Down
7 changes: 1 addition & 6 deletions src/main/kotlin/Main.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,8 @@ import com.github.ajalt.clikt.parameters.arguments.argument
import com.github.ajalt.clikt.parameters.options.*
import kotlinx.coroutines.runBlocking
import maven.*
import stages.sign.cmdSign
import stages.sign.*
import stages.upload.*
import tools.*

import java.nio.file.*




class Cli : NoOpCliktCommand(
Expand Down
49 changes: 49 additions & 0 deletions src/main/kotlin/stages/sign/GpgTty.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package stages.sign

import com.github.pgreze.process.process

private suspend fun canGetTty(): Boolean =
process("tty").resultCode == 0

private fun isGpgTtySet() =
(System.getenv("GPG_TTY") ?: "").trim().isNotEmpty()

private fun weAreInWindows() =
System.getProperty("os.name").startsWith("Windows")

@Deprecated("Not needed anymore?", ReplaceWith("")) // since 2022-10
suspend fun requireGpgTtyIfNeeded() {
// Есть проблема, которая мешает GPG подписывать файлы в Github Actions:
// "gpg: signing failed: Inappropriate ioctl for device"
//
// у неё есть workaround:
// https://github.com/keybase/keybase-issues/issues/2798#issue-205008630
//
// Это описано также в `man gpg-agent`:
//
// You should always add the following lines to your .bashrc or whatever
// initialization file is used for all shell invocations:
// ```
// GPG_TTY=$(tty)
// export GPG_TTY
// ```
//
// It is important that this environment variable always reflects the out-
// put of the tty command. For W32 systems this option is not required.
//
// Я пытался сделать это прямо из скрипта, но в Actions не мог выяснить tty:
// 1. subprocess.check_output("tty")
// 2. os.ttyname(sys.stdout.fileno())
// В первом случае получал код ошибки, во втором
// "OSError: [Errno 25] Inappropriate ioctl for device"
//
// В общем, эта функция просто проверяла, чтобы переменная была определена
// до запуска программы.
//
// Однако, в коде Gradle https://bit.ly/3Sb4iml нашлось другое решение: аргумент "--no-tty".
// Похоже, он исправляет проблему и без проверок.
if (!isGpgTtySet() && !weAreInWindows() && !canGetTty())
throw Exception(
"""Please set GPG_TTY environment variable:
| `export GPG_TTY=${'$'}(tty)`""".trimIndent())
}
72 changes: 6 additions & 66 deletions src/main/kotlin/stages/sign/TempGpg.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* SPDX-License-Identifier: ISC
**/

package tools
package stages.sign

import com.github.pgreze.process.*
import java.io.*
Expand All @@ -20,22 +20,10 @@ value class GpgPassphrase(val string: String)
@JvmInline
value class GpgPrivateKey(val string: String)

@OptIn(GpgInternals::class)
suspend fun signFile(
file: Path,
key: GpgPrivateKey,
phrase: GpgPassphrase,
target: Path = file.parent.resolve(file.name + ".asc"),
) {
TempGpg().use {
it.importKey(key)
it.signFile(file, phrase, target)
}
}

/// Runs GPG with a temporary "homedir", i.e. with a temporary keys database.
/// We can import keys into it without changing the system

/**
* Runs GPG with a temporary "homedir", i.e. with a temporary keys database.
* We can import keys into it without changing the system
*/
internal class TempGpg : Closeable {
private val exe: String = "gpg"

Expand Down Expand Up @@ -101,7 +89,6 @@ internal class TempGpg : Closeable {
Regex("\\s+"), " ")
}

/// Creates `file.ext.asc` next to `file.ext`.
suspend fun signFile(
file: Path,
passphrase: GpgPassphrase,
Expand All @@ -128,51 +115,4 @@ internal class TempGpg : Closeable {
.unwrap()
check(target.exists())
}
}

private suspend fun canGetTty(): Boolean =
process("tty").resultCode == 0

private fun isGpgTtySet() =
(System.getenv("GPG_TTY") ?: "").trim().isNotEmpty()

private fun weAreInWindows() =
System.getProperty("os.name").startsWith("Windows")

suspend fun requireGpgTtyIfNeeded() {
// есть проблема, которая мешает GPG подписывать файлы в Github Actions:
// "gpg: signing failed: Inappropriate ioctl for device"
//
// у неё есть workaround:
// https://github.com/keybase/keybase-issues/issues/2798#issue-205008630
//
// Это описано также в `man gpg-agent`:
//
// You should always add the following lines to your .bashrc or whatever
// initialization file is used for all shell invocations:
// ```
// GPG_TTY=$(tty)
// export GPG_TTY
// ```
//
// It is important that this environment variable always reflects the out-
// put of the tty command. For W32 systems this option is not required.
//
// Я пытался сделать это прямо из скрипта, но в Actions не мог выяснить tty:
// 1. subprocess.check_output("tty")
// 2. os.ttyname(sys.stdout.fileno())
// В первом случае получал код ошибки, во втором
// "OSError: [Errno 25] Inappropriate ioctl for device"
//
// В общем, просто требуем, чтобы переменная была определена
// Поэтому пока я просто требую, чтобы такая переменная среды была задана
// до запуска скрипта.
//
// !!! впрочем, возможно задачу решит аргумент "--no-tty". Его использует Gradle
// https://bit.ly/3Sb4iml

if (!canGetTty() && !weAreInWindows() && !canGetTty())
throw Exception(
"""Please set GPG_TTY environment variable:
| `export GPG_TTY=${'$'}(tty)`""".trimIndent())
}
}
1 change: 1 addition & 0 deletions src/test/kotlin/GpgTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import io.kotest.matchers.booleans.*
import io.kotest.matchers.shouldBe
import kotlinx.coroutines.runBlocking
import org.junit.jupiter.api.Test
import stages.sign.*
import tools.*
import java.nio.file.*
import java.util.zip.CRC32
Expand Down

0 comments on commit f727489

Please sign in to comment.