GitHub Actions がエラーにせず通す空文字と失敗

結論 式は、存在しない値を参照してもエラーにせず空文字を返す。未登録の secret も、skip された step の output も '' になる with: に空文字を渡すと action.yml の default は使われず、空文字がそのまま action に届く。hashicorp/setup-terraform は最新版を入れ、actions/checkout は起動したイベントの ref を取る。どちらも失敗しない step の env: は if: より先に評価される。skip させるつもりの step でも、空文字を fromJSON() に通すとその step が落ちる if: failure() は job のキャンセルと job の timeout-minutes 超過では走らない。後片付けは if: always() に置く shell: を書かない run と、shell: を自前の文字列に書き換えた run には pipefail が付かない 空文字は受け取る側では気付けない。値を作る step で空を落とし、真偽値の output は true / false 以外を落とす 以下は公式ドキュメントと、actions/runner v2.337.0 / actions/checkout v7.0.1 / hashicorp/setup-terraform v4.0.1 / tj-actions/changed-files v47.0.6 のソースで確かめた。ワークフローを実際に走らせて測ったものではない。 ...

2026-09-30 ·  2026-09-30 · 6 分 · 1118 文字

GitHub Actions で maven release コマンドを発行する with tailscale で

はじめに VPN配下でしかアクセスできない Maven リポジトリに Tailscale を利用してアクセスして、 Github Actions で maven release コマンドを発行する方法が必要になったので、構築した。 以下詳細 事前準備 各種 Secret 値を用意する Tailscale で TS_OAUTH_CLIENT_ID, TS_OAUTH_SECRET を発行 GitHub Actions で以下プラグインを使用する為 tailscale/github-action: A GitHub Action to connect your workflow to your Tailscale network. GitHub Actions 内から Maven Release コマンドで Git リポジトリにコミットする必要があるので、コミットユーザ用に 秘密鍵設定を行う 以下コマンドで秘密鍵を作成しておく ssh-keygen -t rsa -b 4096 -f id_rsa -C "github-actions" Github Actions で 使用する Secrets の登録 GitHub - Settings - Secrets and variables - Actions - Repository secrets に 以下キーで登録 TS_OAUTH_CLIENT_ID: Tailscale で発行した OAuth Client ID TS_OAUTH_SECRET: Tailscale で発行した OAuth Secret ACTIONS_SSH_PRIVATE_KEY: 作成した秘密鍵の内容 GitHub - Settings - Deploy Keys に公開鍵を登録して、生成した秘密鍵でのアクセスを許可する GitHub - Settings - Deploy keys - Add deploy key から 公開鍵を登録 Github Actions workflow の実装 name: Build or Release on: workflow_dispatch: inputs: target: type: choice required: true description: Deploy target options: - sample - sample-mybatis stage: type: choice required: false description: Specify stage(mvn profile) if needed(No need if release build(force prd)) options: - dev - prd release: type: boolean description: Is release? default: false env: CACHE_PATH_DOCKER: /tmp/docker_image jobs: CleanupRuns: runs-on: ubuntu-latest steps: - uses: rokroskar/workflow-run-cleanup-action@v0.2.2 env: GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" BuildOrRelease: needs: CleanupRuns runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 1 - name: Show inputs run: | echo "target: ${{ github.event.inputs.target }}" echo "stage: ${{ github.event.inputs.stage }}" echo "release: ${{ github.event.inputs.release }}" echo "GITHUB_ACTIONS: $GITHUB_ACTIONS" - name: Tailscale # GitHub Actions で Tailscale を利用する uses: tailscale/github-action@v2 with: oauth-client-id: ${{ secrets.TS_OAUTH_CLIENT_ID }} oauth-secret: ${{ secrets.TS_OAUTH_SECRET }} tags: tag:ci - name: Install SSH Key # GitHub Actions Maven Release ビルドを行う際に使用する秘密鍵をRunnnerのユーザの鍵として登録しておく uses: shimataro/ssh-key-action@v2 with: key: ${{ secrets.ACTIONS_SSH_PRIVATE_KEY }} name: id_rsa known_hosts: unnecessary - name: Prepare Maven Build run: | git config --global user.name 'GitHub Actions' git config --global user.email 'github-actions@users.noreply.github.com' mkdir -p ~/.m2 # ここで作成する settings.xml は 以下を参照 cat<.github/workflows/assets/settings.xml.part.head.tmpl > ~/.m2/settings.xml eval "echo \"$(cat<.github/workflows/assets/settings.xml.part.body.variable.tmpl)\"" >> ~/.m2/settings.xml cat<.github/workflows/assets/settings.xml.part.tail.tmpl >> ~/.m2/settings.xml # cat ~/.m2/settings.xml mkdir -p ${{ env.CACHE_PATH_DOCKER }} env: NEXUS_USERNAME: ${{ secrets.NEXUS_USERNAME }} NEXUS_PASSWORD: ${{ secrets.NEXUS_PASSWORD }} - name: Cache Docker Image Define # 下記で使用する Docker イメージのキャッシュを定義 id: cache_docker_image_define run: | echo "tag=sample-app:1.0.0" >> $GITHUB_OUTPUT echo "tar_path=${{ env.CACHE_PATH_DOCKER }}/docker_image.tar" >> $GITHUB_OUTPUT - name: Enable Docker Image # この Workflow が正常に終了したら path をキャッシュ。 # すでに key が存在する場合、path にキャッシュをリストアする。 # GitHub Actions で Docker イメージのキャッシュとリストア(with actions/cache@v2) #GitHubActions - Qiita # https://qiita.com/KEINOS/items/433182390132c274649a id: cache_docker_image uses: actions/cache@v4 with: path: ${{ env.CACHE_PATH_DOCKER }} key: ${{ steps.cache_docker_image_define.outputs.tag }} - name: Load Docker image if exists # キャッシュがある場合は tar をロードしてイメージ一覧に追加 if: steps.cache_docker_image.outputs.cache-hit == 'true' run: docker load --input ${{ steps.cache_docker_image_define.outputs.tar_path }} - name: Cache Maven Repository # Maven リポジトリのキャッシュを定義 uses: actions/cache@v4 id: cache_maven_repository with: path: ~/.m2/repository restore-keys: | mvn-repository- - name: Build ${{ github.event.inputs.target }} ${{ github.event.inputs.stage }} id: build run: | opt_stage= input_stage=${{ github.event.inputs.stage }} if [[ -n "$input_stage" ]]; then opt_stage="stage=$input_stage" fi make build-${{ github.event.inputs.target }} $opt_stage # ここで ビルドに使用した Docker イメージを保存 # タグを複数並べて保存できる docker save --output ${{ steps.cache_docker_image_define.outputs.tar_path }} ${{ steps.cache_docker_image_define.outputs.tag }} - name: 'Upload Artifact' # 成果物の保存 uses: actions/upload-artifact@v4 with: name: ${{ github.event.inputs.target }}-${{ github.event.inputs.stage }} path: | sample-app/target/sample-app-*-bin.zip Notice: needs: BuildOrRelease if: always() steps: - name: Notice # if: ${{ env.release == 'true' }} # if: ${{ secrets.SLACK_WEBHOOK_URL != '' }} uses: 8398a7/action-slack@v3 env: SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} with: status: custom fields: workflow,job,commit,repo,ref,author,took custom_payload: | { attachments: [{ color: '${{ needs.BuildOrRelease.outputs.result }}' === 'success' ? 'good' : 'danger', text: `${{ needs.BuildOrRelease.outputs.build_or_release }} Succeseeded by ${process.env.AS_AUTHOR}\n${{ needs.BuildOrRelease.outputs.artifact_files }}`, }] } Maven ~/.m2/settings.xml の設定例 nexus-app の部分が Tailscale でアクセスしたい Host名 Tailscale 上の Machine 名でアクセスできる <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <pluginGroups> </pluginGroups> <proxies> </proxies> <servers> <!-- pom.xml 内で 指定する Gitユーザ情報 --> <server> <id>github-git-ssh</id> <username>git</username> <privateKey>~/.ssh/id_rsa</privateKey> <passphrase/> </server> <server> <id>app-public-repository</id> <username>${NEXUS_USERNAME}</username> <password>${NEXUS_PASSWORD}</password> </server> <server> <id>app-snapshot-repository</id> <username>${NEXUS_USERNAME}</username> <password>${NEXUS_PASSWORD}</password> </server> <server> <id>app-release-repository</id> <username>${NEXUS_USERNAME}</username> <password>${NEXUS_PASSWORD}</password> </server> </servers> <mirrors> <mirror> <id>central-unblock-url</id> <mirrorOf>central</mirrorOf> <name>Central Repository</name> <url>https://repo.maven.apache.org/maven2</url> </mirror> <mirror> <id>app-public-repository</id> <mirrorOf>app-public-repository</mirrorOf> <name>app Maven2 Public Repository</name> <url>http://nexus-app/nexus/content/groups/public/</url> </mirror> <mirror> <id>app-release-repository</id> <mirrorOf>app-release-repository</mirrorOf> <name>app Maven2 Release Repository</name> <url>http://nexus-app/nexus/content/repositories/releases/</url> </mirror> </mirrors> <profiles> </profiles> </settings> <?xml version="1.0"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> : <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.scm.id>github-git-ssh</project.scm.id> </properties> : <scm> <connection>scm:git:ssh://git@github.com:/owner/repo-name.git</connection> <developerConnection>scm:git:ssh://git@github.com:/owner/repo-name.git</developerConnection> <tag>HEAD</tag> </scm> :

2024-08-01 ·  2026-07-01 · 4 分 · 645 文字

terraform + GitHub Actions + ECR + Lambda + ApiGateway + OpenAPI 調査したのでメモ

はじめに 色々調べたのでメモ.. 以下詳細 Terraform で Lambdaも管理できないか? 最近やってるLambdaとAPI Gatewayの開発方法の話 tf, ecr, python, openapi TerraformでAPI Gateway + Lambdaの構成テンプレート #lambda - Qiita tf, NOT ecr, node, openapi TerraformでAmazon API Gatewayを構築する(基本編) #AWS - Qiita tf, NOT ecr, openapi LambdaをカスタムDockerランタイムで開発する方法 | フューチャー技術ブログ コンテナイメージを更新した際に気をつけるポイントですが、latestタグのコンテナイメージを更新しても、 すぐにLambda関数の挙動には反映されません。一晩寝かしても古いイメージが参照されていました。 全く同じimage-uriのまま更新コマンドを実行することで即時反映できます。 TerraformでLambdaコンテナイメージを自動構築する #Docker - Qiita swagger ecr lambda apigateway codebuild aws_lambda_alias lambda version に対するエイリアス これに対するIgnore設定の記載など 【AWS Lambda】複数のLambda関数を1つのコンテナイメージにまとめる #AWS - Qiita entrypoint指定できる aws_lambda_function | Resources | hashicorp/aws | Terraform | Terraform Registry ここでいうhandler? Terraform で ApiGateway を作成する 【Terraform】Terraformで作るサーバレス構成(API Gateway、Lambda、DynamoDB) TerraformでAmazon API Gatewayを構築するサンプルコードを書いてみた #AWS - Qiita Terraform で API Gateway(REST API)を構築する | DevelopersIO How to Create API Gateway With Terraform and AWS Lambda Creating a Rest API in AWS API Gateway using Terraform and OpenAPI Swagger specification | by InovaOnlineSolutions | Medium ECR の Pros and Cons Cons AWS Lambda で Go ランタイムを使うのが良いと思っている理由 基本的にコンテナイメージより zip 形式の方が安く使える コンテナイメージとカスタムランタイムは Lambda 関数の初期化時にも課金が発生する ...

2024-02-15 ·  2024-08-01 · 1 分 · 204 文字