Skip to content

Instantly share code, notes, and snippets.

@Andor
Created June 26, 2019 12:55
Show Gist options
  • Save Andor/be2e0d05cbdc2bb0515a955be06e6ed9 to your computer and use it in GitHub Desktop.
Save Andor/be2e0d05cbdc2bb0515a955be06e6ed9 to your computer and use it in GitHub Desktop.
teamcity-agent with logging to google cloud stackdriver
#cloud-config
package_update: true
package_upgrade: true
write_files:
- path: /etc/default/teamcity-agent
owner: root:root
permissions: '0644'
content: |
IMAGE_NAME="${container_image}"
SERVER_URL="${server_url}"
AGENT_NAME="${agent_name}"
AGENT_OPTS="teamcity.agent.filecache.publishing.disabled=true"
OPTS=""
- path: /etc/systemd/system/teamcity-agent.service
owner: root:root
permissions: '0644'
content: |
[Unit]
Description=Teamcity Agent
Requires=docker.socket
Wants=network-online.target docker.socket
After=docker.service
[Service]
EnvironmentFile=-/etc/default/teamcity-agent
ExecStartPre=/bin/bash -e -x -c "test -z \"$(docker container ls -q -f name=^/%N$)\" || docker rm -f %N"
ExecStart=/usr/bin/docker run --net=host -i \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /opt/buildagent/work:/opt/buildagent/work \
-v /opt/buildagent/logs:/opt/buildagent/logs \
-v /opt/buildagent/temp:/opt/buildagent/temp \
-v /opt/buildagent/tools:/opt/buildagent/tools \
-v /opt/buildagent/plugins:/opt/buildagent/plugins \
-v /opt/buildagent/system:/opt/buildagent/system \
-v /opt/buildagent/update:/opt/buildagent/update \
-v /opt/buildagent/conf:/data/teamcity_agent/conf \
-e SERVER_URL -e AGENT_NAME -e AGENT_OPTS --name=%N $IMAGE_NAME $OPTS
ExecStop=/usr/bin/docker stop %N
ExecStopPost=/usr/bin/docker rm -f %N
ExecReload=/usr/bin/docker restart %N
Restart=on-failure
RestartSec=10s
[Install]
WantedBy=default.target
- path: /etc/docker/gcplogs-credentials.json
owner: root:root
permissions: '0400'
encoding: b64
content: ${gcp_logs_creds}
- path: /etc/docker/daemon.json
owner: root:root
permissions: '0644'
content: |
{
"log-driver": "gcplogs",
"log-opts": {
"mode": "non-blocking",
"max-buffer-size": "2m",
"gcp-project": "${gcp_project}",
"gcp-meta-name": "${agent_name}"
}
}
- path: /etc/systemd/system/docker.service.d/gcplogs.conf
owner: root:root
permissions: '0644'
content: |
[Service]
Environment=GOOGLE_APPLICATION_CREDENTIALS=/etc/docker/gcplogs-credentials.json
runcmd:
- apt-get install -q -y --no-install-recommends docker.io
- apt-get remove -q -y lxd lxcfs liblxc-common liblxc1 unattended-upgrades
- systemctl daemon-reload
- systemctl enable teamcity-agent
power_state:
mode: reboot
condition: True
# create GCP serviceaccount for logs
resource "google_service_account" "service-account" {
project = var.gcp-project-id
account_id = "teamcity-agent-logs"
display_name = "Teamcity Agent Logs"
}
resource "google_service_account_key" "service-account-key" {
service_account_id = "${google_service_account.service-account.name}"
public_key_type = "TYPE_X509_PEM_FILE"
}
resource "google_project_iam_member" "teamcity-agent-logWriter" {
project = var.gcp-project-id
role = "roles/logging.logWriter"
member = "serviceAccount:${google_service_account.service-account.email}"
}
resource "google_project_iam_member" "teamcity-agent-metricWriter" {
project = var.gcp-project-id
role = "roles/monitoring.metricWriter"
member = "serviceAccount:${google_service_account.service-account.email}"
}
data "template_file" "gcp-cloud-init" {
count = var.gcp-instances-count
template = file("teamcity-agent/cloud-init.template.yaml")
vars = {
server_url = var.server-url
agent_name = "gcp-teamcity-agent-${count.index + 1}"
container_image = var.container-image
gcp_logs_creds = google_service_account_key.service-account-key.private_key
gcp_project = var.gcp-project-id
}
}
data "google_compute_image" "image" {
family = var.gcp-image-family
project = var.gcp-image-project
}
resource "google_compute_instance" "teamcity-agent" {
count = var.gcp-instances-count
name = element(
data.template_file.gcp-cloud-init.*.vars.agent_name,
count.index,
)
machine_type = var.gcp-machine-type
project = var.gcp-project-id
zone = var.gcp-zone
boot_disk {
initialize_params {
size = "20"
image = data.google_compute_image.image.name
}
}
network_interface {
network = "default"
access_config {
// Ephemeral IP
}
}
min_cpu_platform = "Intel Skylake"
metadata = {
user-data = element(data.template_file.gcp-cloud-init.*.rendered, count.index)
}
service_account {
# copy-pasted form manually created instance
scopes = [
"https://www.googleapis.com/auth/devstorage.read_only",
"https://www.googleapis.com/auth/logging.write",
"https://www.googleapis.com/auth/service.management.readonly",
"https://www.googleapis.com/auth/servicecontrol",
"https://www.googleapis.com/auth/trace.append",
"https://www.googleapis.com/auth/monitoring.write",
]
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment